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 et .
locale
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.
Corrigé dans : v1.11.11 (commit de correctif 24c82b0…)
Idée générale (comment fonctionne le PoC)
À 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 :
root@kitploit:~
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é)
root@kitploit:~
python3 pterodactyl_rce.py <LHOST> <LPORT>
<LHOST> : votre IP de rappel accessible par le serveur de laboratoire
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.
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.
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.