miércoles, 5 de agosto de 2015

Ataque por fuerza bruta con THC Hydra

¿Qué es THC Hydra?

THC Hydra es una potente herramienta para realizar autenticaciones en sistemas remotos mediante fuerza bruta (login cracker) desarrollada por van Hauser. Aunque ha perdido popularidad frente a otros como medusa sigue siendo para mi uno de los mejores para estas auditorías de acceso por la gran cantidad de protocolos soportados y la capacidad de controlar la paralelización/tempo del ataque (cosa imprescindible para burlar sistemas que impidan la realización de esta técnica de cracking). Actualmente Hydra es compatible con:
  • AFP, Cisco AAA, Cisco auth, Cisco enable, CVS, Firebird, FTP, FTPS, HTTP-FORM-GET, HTTP-FORM-POST, HTTP-GET, HTTP-HEAD, HTTP-PROXY, HTTP-PROXY-URLENUM, ICQ, IMAP, IRC, LDAP2, LDAP3, MS-SQL, MYSQL, NCP, NNTP, Oracle, Oracle-Listener, Oracle-SID, PC-Anywhere, PCNFS, POP3, POSTGRES, RDP, REXEC, RLOGIN, RSH, SAP/R3, SIP, SMB, SMTP, SMTP-Enum, SNMP, SOCKS5, SSH(v1 and v2), SSHKEY, Subversion, Teamspeak (TS2), Telnet, VMware-Auth, VNC y XMPP.

Instalar THC Hydra

Lo primero que haremos es descargarnos Hydra con el comando wget.
root@metempsicosis:~# wget https://github.com/vanhauser-thc/thc-hydra/archive/master.zip


Tras esto nos habremos descargado el archivo master.zip. Ahora solo tendremos que descomprimirlo y entrar en el directorio thc-hydra-master.
root@metempsicosis:~# unzip master.zip
root@metempsicosis:~# cd thc-hydra-master/
A partir de este punto deberemos estar logados con un usuario que tenga permisos de root. Ahora tendremos que lanzar el comando ./configure .
root@metempsicosis:~/thc-hydra-master# ./configure


Como podemos apreciar en la imagen, al lanzar el comando ./configure nos verifica si tenemos instaladas todas las librerías que necesitan los módulos de Hydra para funcionar correctamente. En este caso al faltar alguna, por ejemplo la librería libpq.so y libpq-fe.h, no podríamos realizar un ataque contra bases de datos postgreSQL por lo que tendremos que irlas instalando nosotros en función de lo que queramos auditar. El ejemplo de instalación de las librerías que pongo a continuación es para Debian Jessie por lo que aquellos que utilicen otras distribuciones deberán buscar la equivalencia de los paquetes.
Instalación de librerías adicionales:

root@metempsicosis:~/thc-hydra-master# apt-get install libssl-dev libssh-dev libidn11-dev libpcre3-dev libgtk2.0-dev libmysqlclient-dev libpq-dev libsvn-dev firebird2.1-dev 

Y como libncp-dev no está en los repositorios de Debian Jessie la instalo a mano de la siguiente manera:
root@metempsicosis:~# wget https://packages.debian.org/wheezy/libncp-dev
root@metempsicosis:~# wget https://packages.debian.org/wheezy/libncp


Esto nos descarga el archivo libncp-dev_2.2.6-9_i386.deb y libncp_2.2.6-9_i386.deb. Ahora los instalamos con el comando dpkg -i :

root@metempsicosis:~# dpkg -i libncp_2.2.6-9_i386.deb
root@metempsicosis:~# dpkg -i libncp-dev_2.2.6-9_i386.deb

Si ahora lanzamos de nuevo el comando ./configure comprobaremos que tenemos activos casi todos los módulos de Hydra:

root@metempsicosis:~/thc-hydra-master# ./configure
Starting hydra auto configuration ...
Detected 32 Bit Linux OS
Checking for zlib (libz.so, zlib.h) ...
                                        ... found
Checking for openssl (libssl, libcrypto, ssl.h, sha.h) ...
                                                       ... found
Checking for idn (libidn.so) ...
                             ... found
Checking for curses (libcurses.so / term.h) ...
                                            ... NOT found, color output disabled
Checking for pcre (libpcre.so, pcre.h) ...
                                       ... found
Checking for Postgres (libpq.so, libpq-fe.h) ...
                                             ... found
Checking for SVN (libsvn_client-1 libapr-1.so libaprutil-1.so) ...
                                                               ... found
Checking for firebird (libfbclient.so) ...
                                       ... found
Checking for MYSQL client (libmysqlclient.so, math.h) ...
                                                      ... found
Checking for AFP (libafpclient.so) ...
                                   ... NOT found, module Apple Filing Protocol disabled - Apple sucks anyway
Checking for NCP (libncp.so / nwcalls.h) ...
                                         ... found
Checking for SAP/R3 (librfc/saprfc.h) ...
                                      ... NOT found, module sapr3 disabled
Get it from http://www.sap.com/solutions/netweaver/linux/eval/index.asp
Checking for libssh (libssh/libssh.h) ...
                                      ... found
Checking for Oracle (libocci.so libclntsh.so / oci.h and libaio.so) ...
                                                                    ... NOT found, module Oracle disabled
Get basic and sdk package from http://www.oracle.com/technetwork/database/features/instant-client/index.html
Checking for GUI req's (pkg-config, gtk+-2.0) ...
                                              ... found
Checking for Android specialities ...
                                  ... rindex() found
                                  ... RSA_generate_key() found
Checking for secure compile option support in gcc ...
                                                  Compiling... yes
                                                  Linking... yes
Hydra will be installed into .../bin of: /usr/local
  (change this by running ./configure --prefix=path)
Writing Makefile.in ...
now type "make"



Ahora lanzamos los comandos make y make install:
root@metempsicosis:~/thc-hydra-master# make
root@metempsicosis:~/thc-hydra-master# make install
Tras esto tendremos Hydra correctamente instalado.

Si nuestra red necesita especificar un proxy de salida deberemos hacer persistentes las siguientes variables de entorno para que Hydra funcione correctamente (no es necesario poner todas, solo las que requiramos):
  • HYDRA_PROXY_HTTP="http://192.168.10.1:8080/"
  • HYDRA_PROXY_CONNECT=anonymous.proxy.com:8000
  • HYDRA_PROXY_AUTH="login:password"

Ejemplos de uso

A continuación pongo ejemplos de uso que van a servir para explicar las opciones más utilizadas del comando hydra.

Ejemplo hydra localhost -l rencinar -P pass.txt -t 1 -vV -W 1 -s 22 ssh
En este ejemplo el objetivo es localhost, con la opción -l le indicamos que el usuario con el que hacer login es rencinar, con la opción -P le indicamos el diccionario de contraseñas con las que probar, con la opción -t le indicamos el número de conexiones simultáneas que va a realizar Hydra (a mayor número, más rápido irá el ataque pero también mayor es la probabilidad de que nos detecten y también mayor probabilidad de tener falsos positivos), con la opción -W indicamos el tiempo en segundos de espera entre una conexión y otra (cuanto menor sea el número más rápido irá Hydra pero también tendremos más riesgo de detección y menor fiabilidad en los resultados), con -s le indicamos el puerto y a continuación pondremos el protocolo, en mi caso será una conexión por ssh. Como podemos ver en la siguiente imagen en el diccionario he puesto la clave del usuario rencinar que es la "12345678".


Ejemplo hydra localhost -l rencinar -P pass.txt -t 64 -vV -W 1 -s 22 ssh
Este ejemplo es el mismo que el anterior pero con la opción -t 64. Al parametrizarlo de esta manera lanzará 64 conexiones simultáneas y cómo podemos comprobar en la imagen puede ser que saturemos al objetivo dándonos en multitud de ocasiones "could not connect to target port 22". Como he explicado en el primer ejemplo, al lanzarlo de esta manera tan agresiva el número de falsos positivos o negativos se incrementa muchísimo.


Ejemplo hydra -S -l rencinar@gmail.com -P /root/pass.txt -e ns -t 1 -vV -W 1 -s 465 smtp.gmail.com smtp
En este caso vamos a utilizar Hydra para auditar la contraseña de un correo electrónico. Con la opción -S le indicamos que la conexión va a ser mediante SSL, con -l le indicamos la dirección de correo electrónico, con -P le indicamos el diccionario a utilizar, con -e le indicamos opciones adicionales ("n" para que tenga en cuenta las contraseñas nulas y "s" para que realice la acción de login), -vV para que nos muestre toda la información de lo que va pasando, -s para indicarle el puerto, smtp.gmail.com para indicarle la dirección smtp del servidor de correo y smtp para indicarle el protocolo. Por mi experiencia tanto Exchange como MDaemon son relativamente sencillos de atacar y se les puede dar mucha caña pero gmail detecta este tipo de ataques y suele dar muchos falsos positivos, por esto le tendremos que ponerlo muy soft.


Ejemplo hydra -R
Cuando estamos lanzando un ataque y paramos la ejecución con un CRT+C o se nos corta de manera involuntaria, Hydra genera un archivo ./hydra.restore donde guarda el progreso que llevamos. Para continuar con la ejecución en el punto donde nos habíamos quedado basta con lanzar el comando hydra -R. En el ejemplo anterior corté la ejecución voluntariamente y en la imagen que pongo a continuación podemos comprobar que tras ejecutar Hydra con la opción -R continúa donde se había quedado.


Ejemplo hydra localhost -l rencinar -P pass.txt -t 64 -vV -W 1 -s 21 ftp
Es el mismo caso que en los anteriores pero atacando al puerto 21 con el protocolo ftp.

Ejemplo hydra 10.0.10.7 -l postgres -P pass.txt -t 64 -vV -W 1 -s 5432 postgres
Es el mismo caso que en los anteriores pero atacando a una base de datos postgreSQL al puerto 5432 y al servicio postgres.



Ejemplo web login
Además de los ejemplos anteriores Hydra nos permite realizar fuerza bruta en formularios de acceso web (todo lo que digo a continuación está probado pero para evitar complicaciones lo pongo con datos ficticios). Estos formularios casi siempre dan un resultado si el login ha sido erróneo y en muy pocos casos dan un resultado afirmativo si el login ha sido correcto. Por esto lo más recomendable es verificar cuales son los usuarios/contraseñas erróneas y el resto serán las correctas.
Para ello y asumiendo que el servidor web es la IP 10.0.10.12, que el diccionario de usuarios es user.txt, que el diccionario de contraseñas es pass.txt, que el login se realiza mediante el método HTTP POST (como muestra el siguiente ejemplo de login.php) y está situado en el raíz (10.0.10.12/login.php) :

Ejemplo de login.php

<?php
session_start();

include_once "conexion.php";
function verificar_login($user,$password,&$result)
    {
        $sql = “SELECT * FROM usuarios WHERE usuario = ‘$user’ and ‘$password’ = ‘$password’”;
        $rec = mysql_query($sql);
        $count = 0;
        while($row = mysql_fetch_object($rec))
        {
            $count++;
            $result = $row;
        }
        if($count == 1)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }

if(!isset($_SESSION['userid']))

{
    if(isset($_POST['login']))

    {
        if(verificar_login($_POST['user'],$_POST['password'],$result) == 1)

        {
            $_SESSION['userid'] = $result->idusuario;
            header("location:index.php");
        }
        else
        {
            echo '<div class="error">
Acceso Denegado</div>'; 
        }
    }
?>
<form action="" method="post" class="login">
    <div><label>Username</label><input name="user" type="text" ></div>
    <div><label>Password</label><input name="password" type="password"></div>
    <div><input name="login" type="submit" value="login"></div>
</form>
<?php
} else {
    echo 'Su usuario ingreso correctamente.';
    echo '<a href="logout.php">Logout</a>';
}
?>


El comando a lanzar sería el siguiente:
root@metempsicosis:~# hydra 10.0.10.12  http-form-post "/login.php:username=^USER^&password=^PASS^:Acceso Denegado" -L  user.txt -P pass.txt -t 5 -w 15

Por supuesto hay más variantes dependiendo si el login se realiza por HTTP/HTTPS y POST/GET, por ejemplo si el login se realizase por HTTPS POST el comando sería:
root@metempsicosis:~# hydra 10.0.10.12  https-form-post "/login.php:username=^USER^&password=^PASS^:Acceso Denegado" -L  user.txt -P pass.txt -t 5 -w 15

Hydra tiene más opciones como -x que nos permite generar un diccionario directamente sin cogerlo de un fichero (pero es mucho menos potente que crunch y por eso no merece la pena explicarlo) o la opción -C <fichero> que nos permite atacar con un fichero cuya estructura sea usuario:contraseña probando así pares de usuario y contraseñas pero son opciones que en rarísimas ocasiones vamos a tener que usar.
La generalidad del comando en el 90% de los casos es:

 hydra <IP/host objetivo> -l <usuario> -P <fichero con contraseñas> -t <número de ataques simultáneos> -vV -W <tiempo entre ejecución y ejecución> -s <puerto> <protocolo>

2 comentarios: