¿Qué es y cómo funciona un ataque por fuerza bruta?
Para comenzar a explicar en que consiste un ataque de fuerza bruta primero debemos definirlo:
Un Ataque de fuerza bruta dentro del campo de la criptografía es una técnica que permite probar todas las combinaciones posibles hasta encontrar la palabra o texto legible que fue cifrado para obtener el criptograma. Imaginen nada más una caja negra donde se conoce la salida, el proceso NPI (No Poseo Información) y lo único que se sabe fue que tuvo que haberse dado una entrada legible para obtener ese cifrado.
Luego de tanta teoría y pasando un poquito mas a la practica, un bruteforce consta de 4 cosas vitales.
1- Un Charset o alfabeto utilizado para obtener todas las posibles combinaciones.
2- Una longitud de palabra, la cual nos determina todas las posibles combinaciones de la siguiente manera. longitud_palabra ^ longitud_charset, esto quiere decir que por ejemplo para una palabra de 2 letras con un alfabeto de 26 letras obtenemos 67108864 combinaciones posibles.
2^26 = 67108864 (Combinaciones).
Entre mas grande es la palabra ó entre mas grande es el charset, mayor es el número de combinaciones y mayor es el tiempo invertido en obtener una posible respuesta… todo es directamente proporcional.
3- Palabra cifrada, la cual va a ser usada para romper el ciclo de iteraciones en caso de encontrar la palabra legible.
4-Algoritmo o función de cifrado, ya que sin esta no es posible hacer el bruteforce ¿de qué sirve tener un poco de palabras y letras, si no tenemos como cifrarlas?
Programando un ataque por fuerza bruta
Bien, ya con la teoría y la cabeza un poco mas caliente voy a dejar la estructura base para cualquier bruteforce (Si hay otra forma mas eficiente, les agradecería publicar). Este es un bruteforce en JavaScript, pero aplica para cualquier lenguaje:
//Definicion del charset o alfabeto alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //Variable donde quedara la respuesta resp = ""; //Cada for representa una letra mas en la palabra //En el siguiente caso hay cuatro ciclos for, por lo tanto las combinaciones de palabras //siempre son de cuatro letras. for(i=0; i<alpha.length; i++) //Letra 1 for(k=0; k<alpha.length; k++) //Letra 2 for(h=0; h<alpha.length; h++) //Letra 3 for(l=0; l<alpha.length; l++){ //Letra 4 //Guardo la respuesta temporal usando las combinaciones de cada iteracion //Trabajando con los indices del alfabeto resp = alpha.charAt(i) + alpha.charAt(k) + alpha.charAt(h) + alpha.charAt(l); //Paso por parametro la palabra temporal a la funcion criptografica y la comparo //Contra la palabra ya cifrada para saber si los resultados son iguales if(funcion_criptografica(resp) == "6c35a810d9b4ef7fa9f694d1c00e7593c08143f6"){ //En caso de ser iguales, sencillamente muestro la respuesta y rompo el ciclo =) alert("esta es : " + resp); //Rompo el bucle break;
Rams
Siempre he querido saber cómo se programa un Bruteforce, gracias! y cómo sería para una palabra que contenga un número indeterminado de caractéres?