Tuesday 22 January 2008

Parche para el módulo http de THC-Hydra: error manejando los códigos de respuesta HTTP

THC-Hydra es una conocidísima herramienta de pentest, la cual ocupa el puesto 15 en el ranking 'top 100 de herramientas de seguridad de red' de insecure.org, y es parte de nessus (la herramienta de análisis de vulnerabilidades de mayor renombre del mundo UNIX).
Permite realizar ataques de diccionario por red soportando más de 30 protocolos, con el fin de comprobar la seguridad de nuestros servicios.

Como comentan en su página:

"Number one of the biggest security holes are passwords, as every password security study shows. Hydra is a parallized login cracker which supports numerous protocols to attack. New modules are easy to add, beside that, it is flexible and very fast."

El número uno de los grandes agujeros de seguridad son las contraseñas, como muestra cada estudio de seguridad de contraseñas. Hydra es un crackeador de login paralelizado que soporta numerosos protocolos de ataque. Añadir nuevos modulos es sencillo, ademas que, es flexible y muy rápido.

"This tool is a proof of concept code, to give researchers and security consultants the possiblity to show how easy it would be to gain unauthorized access from remote to a system."

Esta herramienta es un código de prueba de concepto, para dar a los investigadores y consultores de seguridad la posibilidad de mostrar lo fácil que sería obtener acceso no autorizado a un sistema remoto

Hace unos días estuve probando el módulo hydra-http, uno de los módulos de THC-Hydra en su última versión (la 5.4) referente al protocolo http, y me dí cuenta que no funcionaba como yo esperaba en determinadas situaciones.

En concreto, da falsos positivos debido a que no parsea correctamente los códigos de estado del protocolo http devueltos por el servidor al realizar las consultas para saber si un usuario es válido en el servidor http o no. Es decir, hay casos en los cuales el usuario es valido pero THC-Hydra no nos informa de ello.

Pongamos un escenario en el cual sabemos que existe un directorio protegido con autenticación, por ejemplo /protected/ en el cúal no existe index.html ni ninguna página por defecto (los usuarios legítimos acceden mediante la uri /protected/path_desconocido), nosotros pasaríamos al thc-hydra como parámetros la dirección del servidor, el usuario y el password (o las listas de estos), así como el path que queremos comprobar (en nuestro caso /protected/).

La herramienta se pondrá en funcionamiento, y realizará una petición a /protected/, si el usuario NO es válido el código de estado que devuelve el servidor será 401 (Authentication Requiered), sin embargo si el usuario es correcto, al no existir un index.html ni similares el código de retorno será 403 (Forbidden), pero debido a un fallo en el manejo de los código de estado http devuetos no nos informará que el usuario es correcto. El mismo error sucede con códigos como 404 (Not found), ya que hydra-http busca el código de respuesta http 200 (Correcto) o 301 (Redirect).

He escrito un parche que corrige este bug, aqui lo teneis:
--- hydra-http_orig.c 2007-12-31 14:51:42.000000000 +0100
+++ hydra-http.c 2007-12-31 15:50:29.000000000 +0100
@@ -53,7 +53,7 @@
*/

ptr = ((char *) index(buf, ' ')) + 1;
- if (ptr != NULL && (*ptr == '2' || strncmp(ptr, "301", 3) == 0)) {
+ if (ptr != NULL && (*ptr == '2' || *ptr== '3' || strncmp(ptr, "403", 3) == 0 || strncmp(ptr, "404", 3) == 0)) {
hydra_report_found_host(port, ip, "www", fp);
hydra_completed_pair_found();
} else {

para aplicarlo simplemente entrar en el directorio de THC-Hydra 5.4 y patch -p0 < hydra-http.patch
seguidamente compilar de nuevo.


Un ejemplo práctico:

Supongamos que sabemos que existe un recurso protegido llamado /protected/ (pero no tiene un fichero por defecto):

Petición sin usuario:
user@host:~$ wget http://server/protected/ 2>&1 |grep HTTP
Petición HTTP enviada, esperando respuesta... 401 Authorization Required

Petición con un usuario válido:
user@host:~$ wget --http-user=user --http-password=password http://server/protected/ 2>&1 |grep HTTP
Petición HTTP enviada, esperando respuesta... 403 Forbidden

entonces correriamos el hydra, (para simplificar el ejemplo usare solo un usuario/password):
user@host:~/hydra-5.4-src$ ./hydra server http-head -l user -p password -m /protected/
Hydra v5.4 (c) 2006 by van Hauser / THC - use allowed only for legal purposes.
Hydra (http://www.thc.org) starting at 2007-12-31 16:00:09
[DATA] 1 tasks, 1 servers, 1 login tries (l:1/p:1), ~1 tries per task
[DATA] attacking service http-head on port 80
[STATUS] attack finished for server (waiting for childs to finish)
Hydra (http://www.thc.org) finished at 2007-12-31 16:00:10

No encuentra que el usuario sea válido, aunque si lo es!

Sin embargo, aplicamos el parche
user@host:~/hydra-5.4-src$ patch -p0<hydra-http.patch
patching file hydra-http.c

/* recompilamos */
user@host:~hydra-5.4-src$ make clean && ./configure && make

ejecutamos de nuevo con los mismos parámetros:
user@host~/hydra-5.4-src$ ./hydra server http-head -l user -p password -m /protected/
Hydra v5.4 (c) 2006 by van Hauser / THC - use allowed only for legal purposes.
Hydra (http://www.thc.org) starting at 2007-12-31 16:01:08
[DATA] 1 tasks, 1 servers, 1 login tries (l:1/p:1), ~1 tries per task
[DATA] attacking service http-head on port 80
[STATUS] attack finished for server (waiting for childs to finish)
[80][www] host: server login: user password: password
Hydra (http://www.thc.org ) finished at 2007-12-31 16:01:09

bingo! ahora sí lo encontro!, simplemente era un problema manejando los códigos del protocolo HTTP (buscaba el código 200 o 301). Pero en este caso el código devuelto es 403 (forbidden) y también indica que el usuario es válido (al igual que si hubiera sido 404 (not found).

ACTUALIZACIÓN: Link en inglés: Patch for the THC-Hydra 5.4 error handling http response codes.

Saludos

3 comments:

  1. Tio... La fecha del parche es 31/12/2007 a las 3 de la madrugada. A esa hora deberías estar borracho intentando tirarte a cualquier cosa que lleve chirla.

    Luego claro, los informáticos somos raros...

    ReplyDelete
  2. jajaja, a saber como ha llegado hasta ahí esa fecha y a esas horas, supongo que sería del medio día.
    Por si hubiera dudas lo cambio a una hora que no estuviera felicitando el año nuevo. :)

    Un Saludete!

    ReplyDelete
  3. hola, soy nuevo utilizando el programa, se pocas cosas sobre programación, he intentado instalar el parche pero me marca un error, no se si alguien pudiera ayudarme, gracias, aqui paso datos que podrian ser útilies

    User:~/desktop/dra-src nickuser$ patch -p0 -F0 -l -i hydra-http.patch
    missing header for unified diff at line 8 of patch
    (Patch is indented 4 spaces.)
    can't find file to patch at input line 8
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf440
    |{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
    |{\colortbl;\red255\green255\blue255;}
    |\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
    |
    |\f0\fs24 \cf0 \'d1 hydra-http_orig.c 2007-12-31 14:51:42.000000000 +0100\
    | +++ hydra-http.c 2007-12-31 15:50:29.000000000 +0100\
    --------------------------
    File to patch: hydra
    patching file hydra
    patch: **** malformed patch at line 9: */\

    no tengo idea de que estoy haciendo mal, todo ha sido experimentacion, copie tu código y lo guarde en un archivo del Xcode con el nombre hydra-http.patch lo guarde y lo puse en la carpeta de instalación, luego hice todo lo de arriba, nunca había trabajado en una mac de esta forma no se si alguien me pudiera ayudar.

    gracias

    ReplyDelete