一、前言
全球著名防火墙公司Palo Alto Networks近日在官网公布了一个CVE-2024-3400的漏洞信息,该漏洞存在于部分PAN-OS系统的GlobalProtect功能中,在某些配置打开的情况下,攻击者可以对运行该系统的设备进行未授权RCE,并且拿到系统的root权限,本文以研究学习为目的对漏洞的成因进行详细的分析。
二、影响版本
根据官网提供的信息,我们选取了PAN-OS 11.0.0版本固件作为本文的研究对象。
三、GlobalProtect分析
GlobalProtect是PAN-OS中的VPN组件,可以在管理端配置GlobalProtect Portal门户页面,其页面如下,可供VPN用户进行登录。
对固件进行解包,在/etc/nginx/sslvpn
中发现了GlobalProtect Portal
的服务器配置文件,查看location.conf
文件,可以知道VPN的API请求直接被代理到了内部的20177
端口。
通过查看端口占有情况,可知VPN请求由gpsvc
程序进行处理。
四、gpsvc逆向分析
gpsvc使用golang
语言编写,分析HTTP服务的调用链 net_http__ptr_conn_serve
-> net_http_serverHandler_ServeHTTP
-> github_com_gorilla_mux__ptr_Router_ServeHTTP
-> net_http_HandlerFunc_ServeHTT
-> main__ptr_GpTaskMgmt_MainHttpEntry
-> main__ptr_GpTask_RunHttp
-> main__ptr_GpTask_initHttp
其中main__ptr_GpTask_initHttp
函数会解析请求数据包,审计该函数,注意到此处是对Cookie
中的SESSID
字段的处理。
在此处下断点并追踪对SESSID
的处理,最终会来到main__ptr_SessDiskStore_New
函数,
分析该函数的代码,其中name
就是传入的SESSID
,调用net_http__ptr_Request_Cookie
从Cookie
中获取SESSID
的值,然后赋值给session->ID.str
。
接下来会将session->ID.str
进行简单的路径拼接,得到filename
完整路径,然后传递给main_loadSessFile
。
我们直接在main_loadSessFile
下断点,然后调试,使用如下的测试脚本进行触发:
from pwn import *
import os
import requests
ip = '192.168.177.149'
port = 20077
payload = 'POST /ssl-vpn/hipreport.esp HTTP/1.1\r\n'
payload += 'Host: aa.bb.cc\r\n'
payload += 'Cookie: SESSID=/aaaaaaaaaaaaa;\r\n'
payload += '\r\n'
sh = remote(ip,port)
sh.send(payload)
sh.interactive()
可以看到SESSID的内容成功拼接到filename
,由于是简单的拼接,能否尝试一下/../../
这种路径穿越的path?修改测试脚本。
#coding:utf8
from pwn import *
import os
import requests
ip = '192.168.177.149'
port = 20077
payload = 'POST /ssl-vpn/hipreport.esp HTTP/1.1\r\n'
payload += 'Host: aa.bb.cc\r\n'
payload += 'Cookie: SESSID=/../../../tmp/aaaaaaaaaaaaa;\r\n'
payload += '\r\n'
sh = remote(ip,port)
sh.send(payload)
sh.interactive()
可以看到,/../../../
被path_filepath_Join
函数处理后,前缀的文件夹路径被成功消除了。
这意味着我们可以对main_loadSessFile
函数指定任意路径的filename参数。这可以做什么?分析main_loadSessFile
函数,其中有一条调用链main_loadSessFile(filename)
-> main_fileLock(filename)
-> syscall_Open(filename, 0x40LL, 0x180u)
。
注意到第二个参数0x40
,这是O_CREAT
的值,这意味着如果文件不存在,则会创建文件,由于filename可以被任意控制,意味着可以在系统的任何地方创建一个文件,且文件名任意指定。查看刚才测试的脚本执行后,在/tmp目录下查看,确实生成了/tmp/aaaaaaaaaaaaa文件
。
五、漏洞利用分析-telemetry
漏洞可以让我们在系统任何目录创建一个文件名可控的文件,如何结合到命令注入中?telemetry
是系统中的一个数据收集服务,一般在首次配置时会弹出是否开启此功能的提示框。
其状态可以在Device->Setup
标签下查看,要开启,还需要配置好Device Certificate
。
在固件中分析,telemetry
在/etc/cron.d
中有许多telemetry
的定时任务文件。
这些定时任务会定期运行,其中device_telemetry_send
就是负责发送数据的任务,可以看到,/usr/local/bin/dt_send
以root
权限运行。
分析dt_send
,该程序是python写的,主函数调用了check_and_send()
函数。
继续分析check_and_send()
函数,send_file_dirs_all()
会被调用。
send_file_dirs_all会调用send_file_dir,在该函数中,首先列出目录下所有文件名,然后一个个的传递给send_file
进行发送。
send_file代码如下,将filename
拼接到命令行中,然后调用techsupport.dosys
,经过测试,techsupport.dosys
函数并不支持命令注入。
继续跟踪进入dt_curl
脚本的代码,该脚本中send_file
同样也使用了命令行拼接,但是在pansys
执行时有一个参数shell=True
,有了这个参数,整个命令行字符串会交给bash进行解释,这意味着这里可以进行命令注入。
六、思路梳理
由于gpsvc
可以在任意目录创建文件,且文件名可控,我们可以在dt_send
脚本遍历发送数据的目录下写入一个带命令注入文件名的文件,经过分析,dt_send
会遍历/opt/panlogs/tmp/device_telemetry/minute
目录,当dt_send
调用send_file_dir
时就能够遍历到我们创建的文件,并把文件名传递到dt_curl
中的send_file
,造成命令注入,由于dt_send
以root执行,我们注入的命令也将是root
权限的。需要注意的是,dt_send
可能需要等待5分钟或者20分钟甚至更久,才会发送一次数据,因此我们使用漏洞在目录下创建注入文件后,需要等待一段时间,命令才会被执行。
七、EXP
参考
https://packetstormsecurity.com/files/178099/paloalto-exec.txt
八、漏洞模式总结
本漏洞首先是由gpsvc
中的路径穿越开始的,在审计这类golang语言写的程序时,我们可以重点关注一下path_filepath_Join
这类的路径拼接函数,在处理之前是否对路径中的危险字符进行检测。
九、修复建议
目前官方已经发布了更新版本
Solution
We strongly advise customers to immediately upgrade to a fixed version of PAN-OS to protect their devices even when workarounds and mitigations have been applied.
This issue is fixed in PAN-OS 10.2.9-h1, PAN-OS 11.0.4-h1, PAN-OS 11.1.2-h3, and in all later PAN-OS versions. Customers who upgrade to these versions will be fully protected.
In addition, to provide the most seamless upgrade path for customers, additional hotfixes are being made available as a courtesy for other commonly deployed maintenance releases and will also be made available to address this issue. Customers do not have to wait for these hotfixes.
PAN-OS 10.2:
- 10.2.9-h1 (Released 4/14/24)
- 10.2.8-h3 (Released 4/15/24)
- 10.2.7-h8 (Released 4/15/24)
- 10.2.6-h3 (Released 4/16/24)
- 10.2.5-h6 (Released 4/16/24)
- 10.2.3-h13 (ETA: 4/17/24)
- 10.2.1-h2 (ETA: 4/17/24)
- 10.2.2-h5 (ETA: 4/18/24)
- 10.2.0-h3 (ETA: 4/18/24)
- 10.2.4-h16 (ETA: 4/19/24)
PAN-OS 11.0:
- 11.0.4-h1 (Released 4/14/24)
- 11.0.4-h2 (Released 4/17/24)
- 11.0.3-h10 (Released 4/16/24)
- 11.0.2-h4 (Released 4/16/24)
- 11.0.1-h4 (ETA: 4/17/24)
- 11.0.0-h3 (ETA: 4/18/24)
PAN-OS 11.1:
- 11.1.2-h3 (Released 4/14/24)
- 11.1.1-h1 (Released 4/16/24)
- 11.1.0-h3 (Released 4/16/24)
十、参考链接
CVE-2024-3400 PAN-OS: OS Command Injection Vulnerability in GlobalProtect
Palo Alto - Putting The Protecc In GlobalProtect (CVE-2024-3400)