WordPress y el mundo de los CMS I – Enumerando usuarios

Buenas compis,

Tras la buena acogida de las guías de pentesting y hardening de Moodle:

Pentesting Moodle – Parte I Desde fuera

 

Pentesting Moodle II – Desde dentro

Pentesting Moodle III – Hardening Moodle

me ha motivado para comenzar otra pero esta vez me voy a centrar en WordPress, el CMS (Gestor de contenidos) más popular y empleado ( y el más atacado) en la actualidad.

 

cve_vulnerabilidades

Fuente: https://www.cvedetails.com/product/4096/Wordpress-Wordpress.html?vendor_id=2337

Como se puede observar desde el año 2012 se han incrementado notablemente el número de vulnerabilidades publicadas de acuerdo al crecimiento en el uso de wordpress.

A pesar de que WordPress se ha puesto las pilas en los últimos años corrigiendo las numerosas vulnerabilidades que tenía, todavía presenta vulnerabilidades en su configuración por defecto. Cabe destacar la problemática de la configuración por defecto que provoca un notable nivel de exposición que facilita el trabajo a los malos.

Como esto es una guía similar a la que se hizo con Moodle, en este post se va detallar como desde fuera (lo que sería una caja negra) se pueden enumerar usuarios. Wordpress presenta esta vulnerabilidad que se reproduce hasta con ¡4 interacciones!

Antes de comenzar…como somos éticos y eso, para realizar esta guía he montado un servidor en local en el que he instalado wordpress (recordar dejando la configuración por defecto) para jugar sin meternos en líos

Esta vulnerabilidad se basa en la enumeración de usuarios, otra de los principales pruebas que sugiere OWASP. Como se ha mencionado anteriormente, se tienen hasta 4 interacciones:

  • Formulario de inicio de sesión.
  • Recuperación de la contraseña.
  • Pico y pala con el directorio «author»
  • Comparando tiempos con la respuesta del servidor en el time.

 

  • Formulario de login

Accediendo al panel de login de wordpress:

DOMINIO/wp-login.php

Dos pruebas a realizar: introducir usuarios no válidos e introducir usuarios válidos. La pregunta es ¿De dónde sacamos usuarios válidos? Típicos usuarios por defecto o hacking con buscadores.

Usuario no válido

usuario_no_valido

 

Aquí para empezar ya no está configurado correctamente, pues indica que de los dos campos introducidos el nombre de usuario es incorrecto. Ya directamente con el error mostrado sabemos que el usuario introducido es incorrecto independientemente de la contraseña. Lo ideal sería que el mensaje de respuesta fuera: «El nombre de usuario introducido y/o la contraseña es incorrecta»

Usuario válido

 

usuario_valido

Una de las típicas prueba es probar si el usuario admin existe. Tal y como está desarrollado wordpress responde con un mensaje de error confirmando que el usuario introducido está registrado. Este es el típico caso del usuario admin empleado en la instalación que se ha olvidado cambiar de nombre o desactivarlo.

  • Formulario de recuperación de la contraseña

Desde el panel de login clicando en la opción de “¿Has perdido tu contraseña?» Se puede resetear la contraseña introduciendo el correo electrónico del usuario registrado o bien su nombre de usuario. Al permitir dos valores posibles, obviamente parece a priori mucho más sencillo deducir el nombre de usuario que su correo. De esta manera, a través de la respuesta del servidor se conoce si dicho usuario se encuentra registrado o no.

Usuario no válido:

usuario_no_valido_correo

Usuario válido:

Directamente redirecciona a la página de login principal mostrando un mensaje indicando que se ha enviado un enlace para restablecer la contraseña.

 

  • Pico y pala con el directorio «author»

WordPress crear en el directorio author una carpeta llamada con el nombre de usuario para guardar las entradas en el blog, de esta manera.

Por lo tanto, introduciendo en la url:

DOMINIO/?author=i donde i= 0,1,2,..N

Se obtienen los usuarios registrados en wordpress.

enumeracion_author1

 

En el caso de que no tengan ninguna publicación se mostrado un error, pero en el título de la página se está mostrando el usuario al que pertenece ese identificador:

enumeracion_author2

 

Del mismo modo, si no nos diésemos cuenta de ese detalle, viendo el código fuente de la web en la etiqueta html del tittle aparece:

enumeracion_author5

Es posible que el nombre que veamos siempre coincida, esto es debido a que wordpress distingue entre nombre de usuario (para loguearse) y nombre y apellidos que el usuario puede configurar. En este caso, para el usuario “follow the rabbit” se da que su nombre de usuario es rabbit pero su nombre en wordpress es rabbit, de ahí que más abajo sea la url:

/wp/author/rabbit

  • Comparando tiempos con la respuesta del servidor en el time

Calculando los tiempos de repuesta del servidor se pueden obtener patrones que pueden indicar que el usuario se encuentra registrado o no en la aplicación web.

Estadísticas usuario válido:

593 ms 578 ms 608 ms 605 ms 573 ms

 

Estadísticas usuario no válido:

530 ms 531 ms 527 ms 580 ms 561 ms

 

De 5 intentos sólo en una ocasión el tiempo de respuesta del servidor para una petición de usuario no válido entro en los tiempos de repuesta de un usuario válido.

Usuario válido:

timer_user_valido

Usuario no válido:

timer_user_no_valido

Finalmente, citar que estas pruebas se han realizado en sistemas virtuales y controlados con fines educativos, por lo que no nos hacemos responsables de uso para cualquier otro fin.

Saludos.

Naxhack5

La mejor defensa es un buen ataque