CVE-2023-4966 Citrix 信息泄露漏洞简要分析

admin 2023年10月26日03:17:51评论14 views字数 4791阅读15分58秒阅读模式

文章发表于:

https://www.ch35tnut.site/zh-cn/vulnerability/cve-2023-4966-citrix-gateway-info-disclosure/


也可阅读原文直达。



基本信息

Citrix中存在信息泄露漏洞,由于越界读取,未经授权的攻击者可以利用该漏洞获取到存储在内存的密钥。

该漏洞在八月下旬观察到在野利用。

题外话

这个漏洞在10.19就已经分析完了,当时扫描了一下公网受影响服务器发现仍然比较多服务器未修复,包括很多大公司的服务器。所以没有公开详情,在昨天国外安全研究员公开了PoC,所以现在才写分析文章。

指纹

hunter


web.title="Citrix Gateway"

影响版本

  • NetScaler ADC and NetScaler Gateway 14.1 < 14.1-8.50

  • NetScaler ADC and NetScaler Gateway 13.1 < 13.1-49.15

  • NetScaler ADC and NetScaler Gateway 13.0 < 13.0-92.19

  • NetScaler ADC 13.1-FIPS < 13.1-37.164

  • NetScaler ADC 12.1-FIPS < 12.1-55.300

  • NetScaler ADC 12.1-NDcPP < 12.1-55.300


环境搭建

参照CVE-2023-3519 Citrix Gateway RCE搭建

  • 14.1-4.42 192.168.52.100

  • 14.1-8.50 192.168.52.105

  • 13.1-49.15 192.168.52.95


技术分析&调试

根据之前分析CVE-2023-3519可知,Gateway各个接口在nsppe文件内处理,所以直接diff nsppe即可。

初步分析

根据官方通告可知两个漏洞都是对内存的操作不当造成的。对应的CVSS3分别如下

  • CVE-2023-4966 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L

  • CVE-2023-4967 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:H

综合可以知道如下信息:利用漏洞无需权限、使用网络请求即可利用、均为内存型漏洞,应该跟CVE-2023-3519 Cirtix Gateway RCE类似,对用户输入没做校验,其中CVE-2023-4966 应该是实现了越界读取内存。CVE-2023-4966 Citrix 信息泄露漏洞简要分析

函数diff

diff nsppe文件,分析各个函数修改的地方。

CVE-2023-4966 Citrix 信息泄露漏洞简要分析

在逐个分析各个函数之后,目光转到ns_aaa_oauth_send_openid_config函数。

在补丁中 ns_aaa_oauth_send_openid_config中对snprintf的返回值做了判断,在修复之前直接将snpritf的返回值放到了ns_vpn_send_response中,修复之后先判断返回值是否大于1FFFF。

snprintf将格式化的数据,写入内存中,原型为int snprintf(char *str, int n, char * format [, argument, ...]);,其中n为要写入的字符串的最大长度,snprintf最多会给内存写入n-1个字符,最后一个字符使用'',当要格式化后的字符串大于n时,会在n-1处截断。但此时,snprintf会返回格式化字符串的长度,而不是写入内存的长度

CVE-2023-4966 Citrix 信息泄露漏洞简要分析CVE-2023-4966 Citrix 信息泄露漏洞简要分析

向上追溯调用栈,ns_aaa_oauth_send_openid_configns_vpn_process_unauthenticated_request调用,将 ns_vpn_process_unauthenticated_request 代码给AI分析调用到该函数的路径,可知调用路径为 /oauth/idp/.well-known/openid-configurationCVE-2023-4966 Citrix 信息泄露漏洞简要分析

此处猜测未修复版本中会使用snprintf的返回值作为长度参数进行读取。curl请求该接口,可以看到响应中会把我们请求的host放进去

$ curl -i -s -k -X $'GET'     -H $'Host: curl.test.site' -H $'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0' -H $'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H $'Accept-Language: zh-CN,en-US;q=0.7,en;q=0.3' -H $'Accept-Encoding: gzip, deflate' -H $'Upgrade-Insecure-Requests: 1' -H $'Sec-Fetch-Dest: document' -H $'Sec-Fetch-Mode: navigate' -H $'Sec-Fetch-Site: none' -H $'Sec-Fetch-User: ?1' -H $'Te: trailers' -H $'Connection: close'     -b $'NSC_TASS=/menu/neo'     $'https://192.168.52.234/oauth/idp/.well-known/openid-configuration'
HTTP/1.1 200 OKX-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockContent-Length: 717Cache-control: no-cache, no-store, must-revalidatePragma: no-cacheContent-Type: application/json; charset=utf-8X-Citrix-Application: Receiver for Web
{"issuer": "https://curl.test.site", "authorization_endpoint": "https://curl.test.site/oauth/idp/login", "token_endpoint": "https://curl.test.site/oauth/idp/token", "jwks_uri": "https://curl.test.site/oauth/idp/certs", "response_types_supported": ["code", "token", "id_token"], "id_token_signing_alg_values_supported": ["RS256"], "end_session_endpoint": "https://curl.test.site/oauth/idp/logout", "frontchannel_logout_supported": true, "scopes_supported": ["openid", "ctxs_cc"], "claims_supported": ["sub", "iss", "aud", "exp", "iat", "auth_time", "acr", "amr", "email", "given_name", "family_name", "nickname"], "userinfo_endpoint""https://curl.test.site/oauth/idp/userinfo""subject_types_supported": ["public"]}


前面知道print_temp_rule大小为0x20000,返回值中共有6处重复了host,所以我们传入的host长度>21845(粗略估计)就可以触发溢出。再次请求,发现可以利用超长host读取到Citrix内存,实际测试发现host长度最多到24100左右。

CVE-2023-4966 Citrix 信息泄露漏洞简要分析

借助这个漏洞,写了一个nuclei模板对公网扫描,对八百个独立IP扫描,截止至10.20,仍然有大约15%未修复,且通过这个漏洞可以读取到内存中的secret,后续可以借助这个secret绕过身份验证,请求后端接口。

这个接口也在oauth的配置中有提到https://support.citrix.com/article/CTX234873/how-to-deploy-netscaler-as-both-oauth-sp-and-idp

CVE-2023-4966 Citrix 信息泄露漏洞简要分析

ns_aaa_oauthrp_send_openid_config函数类似,也对snprintf的返回值做了判断。CVE-2023-4966 Citrix 信息泄露漏洞简要分析

调试

关闭看门狗对nsppe进程发送的信号,而后直接在对应位置处下断点即可。


root@citrix3# nspf helpUsage: '/netscaler/nspf ((<process_name> | <pid>) <action> | query)'  where <process_name> is one of:    NSPPE-00      aslearn       awsconfig     bgpd          de    imi           isisd         metricscollectomonuploadd    nsaaad    nsaggregatord nscfsyncd     nsclfsyncd    nsclusterd    nsconfigd    nscopo        nsfsyncd      nsgslbautosyncnslcd         nslped    nsm           nsnetsvc      nsrised       nstraceaggregatnsumond    ospf6d        ospfd         ptpd          ripd          ripngd    snmpd         syshealthd

root@citrix3# /netscaler/nspf nsppe-00 pbmonitor 0nspf NSPPE-00 pbmonitor 0Removing pitboss monitor on process NSPPE-00 pid 37387

PoC


https://github.com/Chestnuts4/POC/blob/master/nuclei_poc/CVE-2023-4966_citrix_info_disclose.yaml


实际利用

通过漏洞可以读取到内存中的已登录会话的secret。

小结

该漏洞整体分析、利用较为简单, 通过朴实无华的越界读取即可造成信息泄露,也无需进行内存布局。其实整体看nsppe,很多使用了snprintf的地方都对其返回值进行了判断,本次漏洞点没有对返回值做判断可能是因为开发时遗漏了。

另外即使修复该漏洞之后,已被劫持的会话仍然有效,需要使用如下命令清除已登录的会话


clar lb persistentSessions <vServer>

本次分析环境采用13.1-49.13,之所以没有采用14的最新版分析是因为,14最新版添加了nghttp2依赖,而且还是静态编译,diff窗口上百个不一样的函数,一瞬间心里冒冷汗了

现在13.1-49.13已经不能下载了,只能下载到13.1-49.15。


参考链接

https://support.citrix.com/article/CTX579459/netscaler-adc-and-netscaler-gateway-security-bulletin-for-cve20234966-and-cve20234967

https://support.citrix.com/article/CTX234873/how-to-deploy-netscaler-as-both-oauth-sp-and-idp

https://www.citrix.com/downloads/citrix-adc/

原文始发于微信公众号(闲聊趣说):CVE-2023-4966 Citrix 信息泄露漏洞简要分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月26日03:17:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2023-4966 Citrix 信息泄露漏洞简要分析http://cn-sec.com/archives/2499521.html

发表评论

匿名网友 填写信息