domingo, octubre 28, 2012

¿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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//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;

No hay comentarios:

Publicar un comentario