Ataques de fuerza bruta a formularios web

Durante una auditoría de seguridad, es frecuente encontrarse con formularios web de acceso que no incorporan un sistema de ‘captchas’ para evitar los ataques por fuerza bruta.

Ejemplos de esta clase de formularios es fácil encontrarlos en todo tipo de organizaciones, grandes y pequeñas, y pueden ser un importante vector de riesgo si un atacante, armado con un buen diccionario, intenta averiguar credenciales de acceso.

Para hacerlo aun más ‘divertido’ existen herramientas que permiten crear un diccionario en base al contenido de una web. Extraen todas las palabras, y con ello generan un diccionario de términos relacionados con la organización. En muchos casos el ratio de éxito con esos diccionarios es asombrosamente alto. Un ejemplo de este tipo de herramientas es WLAuthor o CeWL

Hoy voy a explicar cómo implementar un ataque a esos formularios de una forma artesanal, paso a paso y construyendo nuestro propio código para explotar la vulnerabilidad.

Ejemplo práctico de un ataque a un formulario


Tomemos como ejemplo este formulario web que lleva asociado un fichero .php que procesa las peticiones de login. El ejemplo es MUY sencillo, el script en php tan solo comprueba contra un usuario / contraseña predefinido en el código. Claramente, en un escenario real, realizaría esta comprobación contra un backend SQL. No obstante, la técnica que voy a explicar es plenamente válida tanto en este escenario como en otros más complejos.

Si colgamos estos ficheros en un servidor y accedemos a index.html nos encontramos con lo siguiente:

El formulario nos pide un usuario y una contraseña. Si probamos uno cualquiera, nos encontramos con lo siguiente:

Un mensaje de error diciendo ‘Acceso denegado’

El siguiente paso es averiguar que ha pasado y como hemos llegado a ese mensaje de error. Hay que analizar exactamente como se construye esa petición. Para ello podemos hacer uso de una extensión para Firefox llamada Tamper Data que, entre otras cosas, permite ver las peticiones del navegador en crudo.

Si lanzamos ‘Tamper Data’ y repetimos la petición podemos ver lo siguiente:

Ahí tenemos exactamente los datos de la petición que genera el formulario web. Es una petición de tipo POST con los valores :

username
password
Submit

De lo que se infiere que realmente los dos parámetros que tenemos que adivinar son username y password.

Para ello vamos a crearnos nuestro propio script para lanzar un ataque de fuerza bruta contra ese formulario. Usaremos como lenguaje de programación Perl, dado que es un lenguaje flexible y muy rico en módulos que simplifican las tareas a la mínima expresión. Además, todo lo que vamos a desarrollar va a funcionar tanto en Windows como en Linux

El último dato necesario para poder construir nuestro script es hacer ‘fingerprinting‘ de los mensajes de la aplicación, lo que buscamos es un patrón fijo que indique error para poder buscar justamente lo contrario: la ausencia de ese mensaje, que será señal de que hemos acertado en nuestras pruebas.
Si analizamos la respuesta con Tamper Data (botón derecho —> ver fuente):

Vemos la respuesta HTTP del servidor en caso de un intento fallido. Con esa información es más que suficiente para programar el script

El script funciona de la siguiente manera:

  1. Carga los módulos necesarios para lanzar peticiones http

  2. Abre un fichero llamado diccionario.txt que empleará para el ataque de fuerza bruta (podéis obtener diccionarios para pruebas desde PacketStorm http://packetstormsecurity.org/Crackers/wordlists/ )

  3. Con una función de tipo ‘foreach’ (función de bucle ultra-optimizada) recorre el diccionario y va construyendo pares usuario / contraseña

  4. Lanza la petición http de tipo POST contra el servidor por cada par usuario / contraseña

  5. ‘Parsea’ la respuesta en busca del patrón ‘MUY mal’

  6. Si no encuentra ese texto en la respuesta, asume que ha encontrado el usuario / contraseña y lo muestra

Podemos verlo en acción:

$ perl brutter.pl http://127.0.0.1/test/login.php 

Enhorabuena ! usuario—> pedro password —> 123456

Más información | Tamper Data

Yago Jesús es profesional de la Seguridad informática desde el 2001 ha colaborado profesionalmente con los equipos de seguridad en grandes empresas del sector telecomunicaciones, entidades bancarias, organismos del sector defensa, y participado activamente en el despliegue de la PKI del DNI Electrónico.

Editor del blog Security By Default, ha desarrollado multitud de herramientas entre las que destacan Unhide herramienta para realizar análisis forenses en sistemas Unix/Windows que forma parte de las principales distribuciones Linux (Debian, Ubuntu, RedHat) O Patriot NG herramienta anti-Malware para entornos Microsoft

Puedes seguirlo en Twitter: @YJesus


Portada de Genbeta