Una de las aplicaciones web que mas se esta usando para armar sitios es
WordPress. Como muchas otras aplicaciones web, su instalacion por defecto, es vulnerable a
ataques de fuerza bruta.
Auditando contraseñas debilesUtilizando un password "fuerte" (largo, que incluya numeros, letras y no se predecible), sumado a la latencia de la red (no pudiendo probar tantos passwords por segundo) hacemos que un ataque de fuerza bruta sea impractico. Pero la experiencia nos demuestra que muchos usuarios no suelen preocuparse mucho por la complejidad de sus contraseñas, mas bien piensan "quien va a intentar "hackear" a mi blog?". Lo cierto es que este tipo de ataques pueden automatizarse y quiza a nadie le interese "hackear" tu blog especificamente, pero si puede interesarle a alguien tener un espacio en un hosting en donde alojar scripts (
malware,
botnets, etc) o contenido (imagenes, musica, peliculas, etc) sin tu permiso.
Habiendo dejado en claro que para un ataque practico sea practico debemos buscar passwords cortas y predecibles, podemos utilizar la herramienta
wpbf (WordPress BruteForce) con un diccionario chiquito y su opcion por defecto de utilizar keywords del blog como contraseñas.
La herramientaEl
wpbf esta desarrollado en Python bajo licencia GPL y su codigo es accesible a traves del
repositorio en GitHub de wpbf. Entre sus caracteristicas principales podemos destacar:
- Soporte para threads (hilos) que hacen mas rapida las pruebas con diccionarios grandes
- Utilizacion de palabras clave del sitio en la lista contraseñas
- Enumeracion y deteccion de usuarios
- Soporte para proxy HTTP
- Utilizacion de la libreria logging de Python permitiendo registro avanzado y configurable
Una vez descargada, la descomprimimos en un directorio y ya podemos comenzar a utilizarla: no tiene dependencias mas que la libreria estandar de Python e incluye un pequeño diccionario de pruebas.
Vamos un ejemplo sobre un blog de prueba ejecutando el script sin ninguna opcion:
$ ./wpbf.py http://localhost/wordpress/
2011-07-01 18:33:03,757 - wpbf - INFO - Target URL: http://localhost/wordpress/wp-login.php
2011-07-01 18:33:03,759 - wpbf - INFO - Checking URL & username...
2011-07-01 18:33:08,139 - wpbf - INFO - Load into queue additional words using keywords from blog...
2011-07-01 18:33:08,802 - wpbf - INFO - Bruteforcing...
3 words left
2011-07-01 18:33:21,012 - wpbf - INFO - Password 'qawsed' found for username 'admin' on http://localhost/wordpress/wp-login.php
Despues de verificar la existencia del formulario de login (default: wp-login.php) y la validez del nombre de usuario (default: admin, puede cambiarse utilizando la opcion -u) se buscan palabras clave para agregar al diccionario y el script lanza threads para iniciar las pruebas. Un detalle de actividad del script puede verse en el archivo "wpbf.log" y en caso de encontrar una contraseña valida se guardara en el log y se mostrara en pantalla.
Solo la mitad del trabajoPara este ataque necesitamos dos datos: usuario y contraseña. Debido a ciertos aspectos de WordPress podemos enumerar usuarios y comprobar que esos usuarios sean validos. La enumeracion de usuarios se puede hacer mediante la deteccion de redirecciones de la query "?author=" incrementando un entero que corresponderia al ID de usuario (ver
TALSOFT-2011-0526) o mediante el analisis de la "Author's archive page" del blog. La herramienta
wpbf incorpora estas dos tecnicas para buscar automaticamente un usuario valido antes de comenzar el ataque.
$ ./wpbf.py -eu http://localhost/wordpress/
2011-07-01 19:16:02,092 - wpbf - INFO - Target URL: http://localhost/wordpress/wp-login.php
2011-07-01 19:16:02,093 - wpbf - INFO - Enumerating users...
2011-07-01 19:16:03,615 - wpbf - INFO - Usernames: admin, caco, test
Un video demostrativoEn este video se muestra un ataque como el mencionado anteriormente y enumeracion de usuarios en varios blogs elegidos al azar. Hay que verlo en pantalla completa y la calidad del video deja mucho que desear... pero bueno, aqui esta:
Mitigando el ataquePara el bruteforce existen dos plugins llamados:
User Locker y
Login LockDown, no probe ninguno de los dos pero si hacen bien lo que dicen hacer deberia alcanzar para evitar el ataque por fuerza bruta.
Respecto a validar que un usuario sea correcto o no, habria que modificar los mensajes de error del formulario de ingreso al administrador de WordPress unificando los mensajes de contraseña invalida con los de usuario invalido (ver post de EthicalHack3r con una
propuesta de patch).
Evitar la enumeracion de usuarios por redireccion ya funciona en las ultimas versiones de WordPress, pero queda pendiente de solucion la extraccion de datos del usuario desde la pagina de archivo del usuario. Nuevamente, habria que modificar el codigo de WordPress y eliminar esta funcionalidad o evitar exponer el nombre de usuario en este tipo paginas.