Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2025-49132-PoC — Exploit proof-of-concept per CVE-2025-49132 che consente l'esecuzione remota di codice non autenticata in Pterodactyl Panel <= 1.11.10 tramite iniezione del parametro locale. Include modalità di verifica e exploit. | Kitploit
Strumenti/GitHubGitHub/kerburenthusiasm/cve-2025-49132-poc
Generazione di PayloadAnalisi delle VulnerabilitàAnalisi del CodiceExploitSfruttamento di Applicazioni WebPenetration Testing
GitHubkerburenthusiasm/cve-2025-49132-poc

CVE-2025-49132-PoC

Exploit proof-of-concept per CVE-2025-49132 che consente l'esecuzione remota di codice non autenticata in Pterodactyl Panel <= 1.11.10 tramite iniezione del parametro locale. Include modalità di verifica e exploit.

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Vedi Repository
27 mesi faNon ancora revisionato
Condividi

CVE-2025-49132-PoC

Prova di concetto per CVE-2025-49132 per esecuzione di codice remoto in Pterodactyl Panel <= 1.11.10

Questa PoC prende riferimenti da

  • https://www.exploit-db.com/exploits/52341
  • https://github.com/63square/CVE-2025-49132

Usage

root@kitploit:~
# Check if the web application is vulnerable
python3 poc.py -u <url> -m check

# Do something funny 
python3 poc.py -u <url> -m exploit -p <path_to_pear_dir> -t <path_to_write_to>

Dettagli Tecnici

Analizzando il git diff di LocaleController.php tra la v1.11.10 e la v1.11.11 (link), possiamo vedere che il controller accetta i parametri locale e namespace senza alcuna validazione o sanitizzazione.

Per capire perché questo è pericoloso, esamineremo il routing configurato in panel/routes/base.php. La route rimuove esplicitamente i middleware relativi all'autenticazione, consentendo a utenti non autenticati di chiamare /locales/locale.json e fornire i parametri di query richiesti come locale e namespace. Ciò significa che questi parametri sono ora controllati dall'utente.

root@kitploit:~
Route::get('/locales/locale.json', Base\LocaleController::class)
    // Remove authentication middleware for this endpoint
    ->withoutMiddleware(['auth', RequireTwoFactorAuthentication::class]);

Tornando a LocalController.php, la seguente riga di codice fornisce la magia dell'RCE.

root@kitploit:~
$this->loader->load($locale, str_replace('.', '/', $namespace))

La funzione load proviene dal framework di traduzione di Laravel (qui):

root@kitploit:~
public function load($locale, $group, $namespace = null) # 1
{
    if ($group === '*' && $namespace === '*') { # 2
        return $this->loadJsonPaths($locale);
    }

    if (is_null($namespace) || $namespace === '*') { # 3
        return $this->loadPaths($this->paths, $locale, $group); # 4
    } 

    return $this->loadNamespaced($locale, $group, $namespace);
}
  • Al #1, vediamo che la funzione load prende 3 argomenti. Sebbene possa creare confusione all'inizio, il valore str_replace('.', '/', $namespace) viene effettivamente passato al secondo argomento $group.
  • Al #2, $namespace non sarà mai * poiché sarà sempre NULL. Allo stesso modo $group non sarà mai * poiché possiamo controllare ciò che viene passato.
  • Al #3, dato che $namespace è null, viene preso il ramo che porta all'esecuzione di loadPaths al #4.

Compreso quanto sopra, passiamo ad analizzare loadPaths dove avviene la vera magia:

root@kitploit:~
protected function loadPaths(array $paths, $locale, $group)
{
    return (new Collection($paths))
    ->reduce(function ($output, $path) use ($locale, $group) {
        if ($this->files->exists($full = "{$path}/{$locale}/{$group}.php")) { # 1
            $output = array_replace_recursive($output, $this->files->getRequire($full)); # 2
        }

        return $output;
    }, []);
}
  • Al #1, il loader costruisce il nome del file di traduzione previsto aggiungendo .php.
  • Al #2, se il file esiste, viene caricato tramite getRequire(), che esegue il file PHP e restituisce il suo array.

Poiché controlliamo il parametro URL namespace, possiamo influenzare quale file l'applicazione tenta di caricare. Fornendo un valore che corrisponde a uno script .php, possiamo far eseguire al server tale script. Ad esempio, per caricare phpinfo.php, possiamo impostare il parametro a: namespace=phpinfo

Spiegazioni della PoC

La PoC tenta di eseguire una scrittura arbitraria di file tramite pearcmd.php. Questo metodo è stato utilizzato in molte PoC simili e ricerche sulla sicurezza.

  • https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/
  • https://medium.com/@lashin0x/local-file-inclusion-to-remote-code-execution-rce-bea0ec06342a

Nota che pearcmd.php può trovarsi in diverse directory come

  • /usr/share/php/pearcmd.php
  • /usr/share/php/PEAR/pearcmd.php
  • /usr/lib/php/pearcmd.php

e molte altre.

Il file scritto conterrà il tipico codice PHP malevolo.

Disclaimer / Uso Responsabile

Solo per test autorizzati. Non utilizzare su sistemi che non possiedi o per i quali non hai esplicita autorizzazione.
Sei responsabile di rispettare tutte le leggi applicabili; gli autori non si assumono alcuna responsabilità per un uso improprio.

Problema

La libreria Python requests è un po' troppo disponibile perché codifica i caratteri nell'URL fornito. Ho passato molto tempo a cercare di risolvere questo problema e ho finito per usare direttamente curl. Apprezzerei se qualcuno potesse fornire aiuto per questo problema.

Scarica lo strumento