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.
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:
root@kitploit:~
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)
root@kitploit:~
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
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=
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.