En este tutorial se va a hablar del ataque de fuerza bruta y se mencionarán algunas herramientas para llevar a cabo este ataque. Lo primero de todo es decir de qué se trata la fuerza bruta, aunque por su nombre uno se lo puede imaginar.
Es una técnica que se basa en la prueba y error, se utiliza para obtener contraseñas o descifrar datos, este método no busca una estrategia inteligente, si no que prueba todas las posibles combinaciones hasta encontrar la clave.
¿Es posible sacar cualquier contraseña o descifrar cualquier archivo? Si nuestro tiempo fuera infinito probablemente, pero al no serlo, la respuesta es no, contraseñas o claves largas y con varios factores (mayúsculas, minúsculas, números, caracteres especiales) nos llevaría mucho tiempo sacarlas por este método (vamos que en una vida no se conseguiría).
Podemos utilizar este método para comprobar la seguridad de nuestras contraseñas o cifrados ante este tipo de ataques. Si quieres saber cómo crear una contraseña segura, aconsejo leer este tutorial. Un algoritmo de cifrado vulnerable a este tipo de ataque es el DES, lo contrario sucede con el AES, que no es vulnerable a la fuerza bruta. Lo mejor es entender bien el campo de la Criptografía.
Tener una contraseña segura es el primer paso, pero puedes además poner una capa de protección más, usando el doble factor de autenticación en tus cuentas (por lo menos las más valiosas), hoy en día ya hay servicios que lo ofrecen integrado y de manera gratuita, como pueden ser Google, Twitter y Linkedin. Estos sistemas normalmente envían un mensaje a tu móvil con un código una vez hayas introducido la contraseña correcta, así hasta que no introduzcas ese código no podrás entrar a tu cuenta.
Cabe destacar que la fuerza bruta se suele combinar con ataques de diccionario, este ataque consiste en tener un archivo con contraseñas más típicas (la gente suele emplear palabras conocidas para sus contraseñas, así las recuerdan mejor) y probarlas todas, hasta encontrar la clave o acabar las contraseñas sin éxito. El ataque en general es más eficiente, aunque si usamos varios factores en nuestra contraseña las probabilidades de éxito disminuyen considerablemente.
Herramientas de fuerza bruta
Es de código abierto y gratuito, normalmente lo encontrarás distribuido en código fuente, Su principal objetivo es encontrar contraseñas débiles en sistemas operativos UNIX.
Esta herramienta te permite aplicar la fuerza bruta a servicios de autenticación remotos. Puedes realizar ataques de diccionario contra más de 50 protocolos.
Es una herramienta modular, trabaja de forma paralela realizando fuerza bruta a los inicios de sesión. Compatible con protocolos como FTP, HTTP, IMAP, SSH, etc.
Es una herramienta para crackear autenticaciones de red, trabaja de forma rápida. Puedes ampliar la herramienta creando tus propios módulos.
Es una herramienta destinada a la recuperación de contraseñas en Windows, para crackear te permite utilizar fuerza bruta, pero también ataques de diccionario y ataques mediante tablas de arco iris (Rainbow Table).
Voy a poner a continuación un código en Python que obtiene contraseñas que contienen solo números de una página web, hasta 5 dígitos, se podría hacer también con letras, mayor longitud, etc. Primero os dejo el código que atiende las peticiones post en PHP:
<?php $usuario = $_POST['usuario']; $password = $_POST['pass']; $user='josue'; $pass='2087'; if( $usuario == $user and $password == $pass ){ header('HTTP/1.1 200 OK'); echo "Acceso autorizado"; }else{ header('HTTP/1.1 403 Forbidden'); echo 'Acceso denegado'; }?>Vemos que no tenemos límites de intentos, que el usuario y su contraseña están definidos ahí mismo (para evitar bases de datos y complicaciones al código), si el usuario y contraseña son correctos devolvemos un código 200 y si no un 403.
A continuación dejo el código de Python que se encarga de mandar peticiones al código anterior.
import http.client, urllib.parsefrom time import timeobjetivo = "/bruteForce/index.php"headers = { "Content-type": "application/x-www-form-urlencoded", "Accept": "application/xhtml+xml,text/html;q=0.9,text/plain;",}encontrado = Falsepassword = 0inicio = time()while password <= 99999 and not encontrado: parametros = urllib.parse.urlencode({ 'usuario': 'josue', 'pass': password }) conexion = http.client.HTTPConnection("localhost") conexion.request("POST", objetivo, parametros, headers) respuesta = conexion.getresponse() if(respuesta.status == 200): print("Contraseña encontrada para usuario josue, es", password) print("Se ha tardado: {0:.2f}s".format((time()-inicio))) encontrado = True else: print(password) conexion.close() password += 1if not encontrado: print("No se encontro contraseña para josue")Este código hace las peticiones post, en cada pasada al bucle lo único que hacemos es cambiar la contraseña y sumarle 1, así probaremos todas las posibles contraseñas de 0 a 99999 (si no la encontramos antes). Pinta todos los números que va encontrando, por que así lo he querido para el ejemplo, lo puedes quitar, para ello eliminas el else. Vamos a ejecutar este código a ver si encuentra las contraseñas.
El primer ejemplo vamos a lanzarlo para encontrar la contraseña 2087, a continuación está la imagen, podéis ver que no tardo ni 18 segundos en sacarla.
Si le quito el else para que no pinte por pantalla cada número tarda bastante menos, aquí podéis ver una captura:
Ahora para el segundo y último intento pongo la contraseña 20870, a ver cuánto tarda esta vez.
Se nota la diferencia, al añadirle un carácter más a la contraseña, pero aun así es un tiempo que podemos esperar sin problemas, además si metemos hilos el tiempo disminuiría. Por eso utilicemos contraseñas seguras y en nuestras aplicaciones autenticaciones robustas, que no nos puedan automatizar este ataque.
Si quieres ver un ejemplo práctico en el que se rompe la contraseña de un zip o un rar, puedes visitar el siguiente tutorial: