¿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;
Por DMK
Hakuna Matata!

1 Comentario

  1. Responder

    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?

Deja un comentario

Your email address will not be published. Required fields are marked *

You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>