Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2025-49132-PoC — Эксплойт-доказательство концепции для CVE-2025-49132, обеспечивающий неавторизованное удаленное выполнение кода в Pterodactyl Panel <= 1.11.10 через инъекцию параметра локали. Включает режимы проверки и эксплуатации. | Kitploit
Инструменты/GitHubGitHub/kerburenthusiasm/cve-2025-49132-poc
Генерация полезной нагрузкиАнализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийТестирование на Проникновение
GitHubkerburenthusiasm/cve-2025-49132-poc

CVE-2025-49132-PoC

Эксплойт-доказательство концепции для CVE-2025-49132, обеспечивающий неавторизованное удаленное выполнение кода в Pterodactyl Panel <= 1.11.10 через инъекцию параметра локали. Включает режимы проверки и эксплуатации.

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий
6 месяцев назадЕщё не проверено

CVE-2025-49132-PoC

Proof-of-Concept для CVE-2025-49132 — удаленное выполнение кода в Pterodactyl Panel <= 1.11.10

Этот PoC основан на

  • https://www.exploit-db.com/exploits/52341
  • https://github.com/63square/CVE-2025-49132

Использование

root@kitploit:~
# Check if the web application is vulnerable
python3 poc.py -u <url> -m check

# Do something funny 
python3 poc.py -u <url> -m exploit -p <path_to_pear_dir> -t <path_to_write_to>

Технические детали

Анализируя git diff файла LocaleController.php между версиями v1.11.10 и v1.11.11 (ссылка), мы видим, что контроллер принимает параметры locale и namespace без какой-либо проверки или санитизации.

Чтобы понять, почему это опасно, посмотрим на маршрутизацию, настроенную в panel/routes/base.php. Маршрут явно удаляет промежуточное ПО, связанное с аутентификацией, позволяя неавторизованным пользователям обращаться к /locales/locale.json и передавать необходимые параметры запроса, такие как locale и namespace. Это означает, что теперь этими параметрами управляет пользователь.

root@kitploit:~
Route::get('/locales/locale.json', Base\LocaleController::class)
    // Remove authentication middleware for this endpoint
    ->withoutMiddleware(['auth', RequireTwoFactorAuthentication::class]);

Возвращаясь к LocalController.php, следующая строка кода обеспечивает RCE-магию.

root@kitploit:~
$this->loader->load($locale, str_replace('.', '/', $namespace))

Функция load взята из фреймворка перевода Laravel (здесь):

root@kitploit:~
public function load($locale, $group, $namespace = null) # 1
{
    if ($group === '*' && $namespace === '*') { # 2
        return $this->loadJsonPaths($locale);
    }

    if (is_null($namespace) || $namespace === '*') { # 3
        return $this->loadPaths($this->paths, $locale, $group); # 4
    } 

    return $this->loadNamespaced($locale, $group, $namespace);
}
  • В #1 мы видим, что функция load принимает 3 аргумента. Хотя на первый взгляд это сбивает с толку, значение str_replace('.', '/', $namespace) на самом деле передается во второй аргумент $group.
  • В #2 $namespace никогда не будет *, так как он всегда будет NULL. Аналогично $group никогда не будет *, так как мы можем контролировать, что передается сюда.
  • В #3, поскольку $namespace равно null, будет выбрана ветвь, что приведет к выполнению loadPaths в #4.

Понимая это, переходим к анализу loadPaths, где и происходит настоящая магия:

root@kitploit:~
protected function loadPaths(array $paths, $locale, $group)
{
    return (new Collection($paths))
    ->reduce(function ($output, $path) use ($locale, $group) {
        if ($this->files->exists($full = "{$path}/{$locale}/{$group}.php")) { # 1
            $output = array_replace_recursive($output, $this->files->getRequire($full)); # 2
        }

        return $output;
    }, []);
}
  • В #1 загрузчик формирует ожидаемое имя файла перевода, добавляя .php.
  • В #2, если этот файл существует, он загружается через getRequire(), который выполняет PHP-файл и возвращает его массив.

Поскольку мы контролируем URL-параметр namespace, мы можем влиять на то, какой файл попытается загрузить приложение. Указав значение, которое соответствует .php-скрипту, мы можем заставить сервер выполнить этот скрипт. Например, чтобы загрузить phpinfo.php, мы можем установить параметр: namespace=phpinfo.

Пояснения к PoC

PoC пытается выполнить произвольную запись файла через pearcmd.php. Этот метод использовался во многих подобных PoC и исследованиях безопасности:

  • https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/
  • https://medium.com/@lashin0x/local-file-inclusion-to-remote-code-execution-rce-bea0ec06342a

Обратите внимание, что pearcmd.php может находиться в разных каталогах, например:

  • /usr/share/php/pearcmd.php
  • /usr/share/php/PEAR/pearcmd.php
  • /usr/lib/php/pearcmd.php

и многих других.

Записываемый файл будет содержать типичный вредоносный PHP-код.

Отказ от ответственности / Ответственное использование

Только для авторизованного тестирования. Не используйте в системах, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
Вы несете ответственность за соблюдение всех применимых законов; авторы не несут ответственности за неправомерное использование.

Проблема

Библиотека Python requests немного слишком услужлива: она кодирует символы в предоставленном URL. Потратил много времени, пытаясь решить эту проблему, и в итоге просто использовал curl напрямую. Буду благодарен, если кто-нибудь сможет помочь с этим вопросом.

Скачать инструмент