Network Packet Manipulation es una herramienta con la que podemos modificar consultas MySQL al vuelo en aquellas conexiones a bases de datos no cifradas. Sobre ello llegamos a la conclusión de que podríamos modificar fácilmente las consultas que un WordPress realiza sobre la base de datos. Echando una pensada, podríamos crearnos con un filtro un usuario en el sistema y poder entrar a través del panel de administración en WP-Admin o, incluso, actualizar el campo contraseña de un usuario y robar directamente dicha cuenta. ¿Te imaginas haciendole esto al usuario admin de WordPress? y ¿Sabes que es altamente ilegal?
La primera traba que muchos pueden pensar es: la mayoría de los servidores WordPress instalan en la misma máquina la base de datos y la aplicación web. Esto es cierto, puede que en un alto porcentaje de usuarios este hecho sea así, pero en muchas ocasiones, en entornos empresariales estas dos capas se separan. Es decir, encontraríamos la aplicación web por un lado, y la base de datos por otro.
En un escenario de auditoría interna podremos encontrar una oportunidad para realizar este tipo de manipulaciones y poder llegar a tomar el control del gestor de contenidos. Por defecto, la aplicación web de WordPress no va cifrada, y las consultas contra el motor MySQL tampoco, y son tareas de fortificación que deben hacerse para evitar los ataques de red.
Preliminares: Analizando las consultas de WordPress
En primer lugar hay que estudiar qué tipo de peticiones realiza WordPress contra el servidor MySQL. Como se puede ver en la siguiente imagen, las consultas van en plano, por lo que basándonos en el ataque de Network Packet Manipulation podemos modificar las consultas y tomar el control de la máquina.
El siguiente paso es acudir al panel de control de un WordPress y ver qué tipo de peticiones realiza cuando accedemos a la gestión de usuarios. El objetivo es claro, entender qué consulta SQL o conjunto de consultas SQL realiza la aplicación de WordPress a MySQL cuando damos de alta un nuevo usuario o modificamos algún parámetro.
Analizando las peticiones podemos encontrar que la inserción o alta de usuarios se realiza a través de una instrucción SQL de tipo INSERT INTO en la tabla wp_users y se pasan una serie de parámetros. En la imagen inferior se puede visualizar parte de dicha sentencia.
La idea será capturar un paquete que encaje con un patrón y modificar la consulta por la que nosotros queramos, por ejemplo una consulta UPDATE que permita modificar la contraseña de un usuario existente con el fin de robar una cuenta, o una inserción que nos permita crear un nuevo usuario en la base de datos.
Ataque 1: Cambiando las passwords a los usuarios
Ahora llega el momento de crear los filtros con Etterfilter. El primer filtro que crearemos será el que nos posibilite cambiar las contraseñas del WordPress. Para ello la sentencia que debemos tener en mente será “UPDATE wp_users SET user_pass = [contraseña hasheada]». Antes de mostrar el filtro debemos tener en cuenta una cosa. En los paquetes de MySQL hay un campo denominado Packet_Length. Este valor le indica al motor de MySQL cuantos bytes debe leer y ejecutar en la base de datos. Debemos localizar una consulta común de WordPress y utilizarla modificando el Packet_Length.
El primer filtro detecta si el paquete está destinado al puerto 3306, que es el que utilizar MySQL por defecto, y decodifica el mensaje filtrando por la palabra “SELECT”. En primer lugar reemplazaremos el Packet_Length, que en el caso del paquete seleccionado es x49x00x00, por el tamaño que estipulemos que será la longitud de nuestra consulta en hexadecimal. En el caso del valor del user_pass pondremos una que queramos, hasheada con el mismo algoritmo que utiliza WordPress.
Una vez creado el filtro se debe compilar con la herramienta Etterfilter mediante la instrucción etterfilter –o wp.ef wp.filter, siendo wp.filter el nombre del fichero dónde escribimos el filtro. Una vez compilado se debe ejecutar Ettercap para realizar el ataque de MiTM entre el servidor web donde corre WordPress y el servidor donde corre el motor de bases de datos MySQL mediante la instrucción ettercap –T –q –i [interfaz de red] –F wp.ef –M ARP. Si hiciéramos una consulta antes de envenenar con ARP Spoofing veríamos lo siguiente:
El valor de user_pass está preparado para cambiar, aunque en este caso no es un hash real y se ha puesto esa cadena solo para que se vea más claro. Una vez el filtro es ejecutado y un usuario refresca la página principal de control de WordPress se interceptará un paquete MySQL que coincide con lo que nuestro filtro busca y se llevará a cabo el proceso de actualización. Con la ejecución del mismo, todas las contraseñas de las cuentas de WordPress serán modificadas y actualizadas a la contraseña que nosotros queramos, eso sí hasheada.
En esta imagen se puede ver el cambio gracias al filtro ejecutado y el ataque de ARP Spoofing. Ahora mismo ya tenemos acceso al WordPress, simplemente conociendo uno de los usuarios, por ejemplo el usuario wordpress o root habrán sido afectados por esta actualización.
Ataque 2: Creando un usuario de WordPress
A continuación os muestro el segundo filtro. Este filtro crea un usuario para que el administrador del WordPress no detecte tanto el robo. La consulta SQL para crear un usuario es INSERT INTO, tal y como hemos visto antes, sobre la tabla wp_users con, al menos, los atributos de contraseña, usuario e id. Hay que tener en cuenta de nuevo el tamaño correcto del paquete.
De nuevo elegimos la consulta SQL de tipo SELECT option_val para generar el filtro y reemplazamos el tamaño del paquete por el hexadecimal 0x71, ya que nuestra consulta tiene dicho tamaño.
De nuevo hay que compilar el filtro con Etterfilter y ejecutar un ataque de spoofing de ARP con la herramienta Ettercap. El resultado es el que se puede ver en la imagen, donde obtenemos un nuevo usuario denominado pablo con un id alto, para no colisionar con otros posibles usuarios, y con la contraseña hasheada que queramos, en ese instante el pentester tendrá acceso al panel de WordPress con este usuario recién creado.
En conclusión, además de todas las opciones de fortificación de WordPress para evitar ataques a las cuentas de usuario, hay que cifrar las consultas SQL que se realicen entre los frontales web y los motores MySQL. Si un atacante puede colocarse en medio de la comunicación todo el servidor WordPress podría quedar a merced de éste por no haber fortificado la cadena de conexión.