WordPress, una de las plataformas predilectas para la administración de blogs y publicaciones, contiene un fallo de seguridad de tipo “Lógico“, que captó mi atención desde el primer momento en que la conocí.
Hace ya mas de un año, realizando pruebas de rutina sobre una pantalla de login de WP, me encuentro con un detalle poco usual. El sistema devolvía demasiada información a mis errores cometidos. El primer intento fallido que realice, me devolvió la siguiente respuesta:
Usuario Y contraseña, incorrectos
Continué probando mientras prestaba atención solamente al usuario, hasta recibir el siguiente mensaje
Contraseña incorrecta
Lo cual me llevo a reflexionar sobre el hecho de que estaba utilizando el User correcto, pero la contraseña en este caso, era invalida.
Las nuevas versiones de WP discriminan los siguientes casos:
- Usuario Incorrecto

Password Incorrecta PARA usuario “X”

Me detengo para hacer un paréntesis y mirar los hechos desde un ángulo mas matemático:
Premisas:
- No tengo forma de comprobar a priori, sin estar ya LOGGEADO, si el usuario ingresado es correcto.
- Tampoco podría comprobar si la contraseña es valida hasta no haber descubierto el usuario, lo cual nuevamente seria imposible sin estar loggeado.
- El usuario tiene como máximo de 6 caracteres [alpha] (Planteo un numero máximo para determinar relativamente el peor de los casos).
- La password tiene como máximo 10 caracteres [alfanumérico] (Ídem punto anterior).
Habiendo planteado mis premisas, y sin mas preámbulos:
La cantidad de usuarios posibles con un máximo de 6 caracteres es: 27^6 = 387.420.489
La cantidad de passwords posibles con un máximo de 10 caracteres es: 37^10 = 4,808 x 10^15
La cantidad de combinaciones posibles en el peor de los casos para lograr determinar la combinacionÚNICA de user/pass: (387.420.489)^(4,808 x 10^15) = 1,96 x 10^56
Suponiendo que una computadora promedio pueda comprobar 100 user/pass por segundo, el tiempo necesario para descubrir la combinación sería aproximadamente de 6,75 x 10^48 años . Lo cual supone un numero extremadamente grande.
Volviendo al caso e intentando demostrar el punto desde las matemáticas, procedo a plantear la siguiente cuenta teniendo en cuenta:
- Puedo determinar el usuario sin necesidad de loggearme (Vulnerabilidad de Enumeración de usuarios de WordPress).
- Una vez determinado el usuario, solo resta probar las contraseñas posibles, hasta poder loggearme.
La cantidad de usuarios posibles con un máximo de 6 caracteres sigue siendo la misma que en el caso anterior, y la cantidad de passwords posibles también. La variación reside en la combinatoria entre user/pass , ya que al poder determinar en primera instancia al usuario, en el peor de los casos tendríamos que haber probado con 387.420.489 , y de ahí determinar cual es la pass correcta entre las 4,808 x 10^15posibles.
Lo cual nos da un numero aproximado de: (387.420.489 + 4,808 x 10^15) Que básicamente sigue siendo 4,8 x 10^15 .
Para lograr ingresar a un sistema con las características presentadas, en el peor de los casos, tendríamos un costo de 169.619.501 años, lo cual es un 2,45 x 10^ -39 % del caso anterior !!!! (Si, leyeron bien, es un ” -39 ” ). Los números son IRRISORIOS! logramos reducir el costo en cantidades mas que abismales.
WordPress presenta por defecto, mensajes de error en el inicio de sesión, en los cuales discrimina entre usuario invalido y, contraseña no valida para un usuario determinado. Con lo cual nos sitúa dentro de nuestro segundo caso hipotético ya demostrado.
Metasploit posee un modulo auxiliar ” wordpress_login_enum ” que nos permite explotar dicha vulnerabilidad.
Las opciones mas destacadas son :
BRUTEFORCE –> Utiliza el metodo de fuerza bruta para lograr el acceso
PASS_FILE —> Utiliza un diccionario de datos
USERNAME —> Permite ingresar un nombre de usuario ya determinado (La fortaleza del ataque)
USERPASS_FILE –> En el caso de no haber reconocido previamente al usuario, esta opción sigue siendo de gran importancia, ya que como demostramos anteriormente, WordPress advierte cuando un usuarios es valido o no. Esto significa que metasploit no tiene que comprobar todas las pass para todos los user posibles, sino que primero determina el usuario, y luego busca la password para el mismo.
VALIDATE_USERS —> Determina los nombres de usuarios Validos / Enumeración de usuarios

Una vez configurado el módulo, simplemente esperamos que la aplicación haga su trabajo esperando tener resultados positivos como en el siguiente caso.

Este error puede ser solucionado con tan solo agregar la siguiente linea de código en el archivo “functions.php” ubicado en el directorio ../wp-content/themes/Nombre_theme_utilizado/ :
add_filter(‘login_errors’,create_function(‘$a’, “return null;”));
Es importante modificar el script para evitar este tipo de ataques. También de ser posible restringir la cantidad de intentos fallidos para el acceso es una buena forma de mitigar cualquier tipo de ataque por fuerza bruta.
Fuente: Gustavo Nicolas Ogawa, de la redacción del Blog de Mkit Argentina