domingo, 24 de enero de 2010

Ataques de fuerza bruta

Buenas a todos, muchas veces en la vida de un informático se requiere el desarrollo de algoritmos que utilicen la fuerza bruta para romper algo, por ejemplo, claves. Un ejemplo de ello es el del programa Brutus, que hace muchos años se utilizaba para romper claves web:

brutus1

Y es que era un programa Bruto en toda regla :), como los populares personajes de la serie Halo de la Xbox:

wp_brut_hammer1024

Anubis, en una de sus herramientas utiliza un ataque de fuerza bruta, para ello usa el algoritmo mas eficiente y a la vez mas sencillo para romper claves mediante permutaciones de un abecedario alfanumérico iterativamente.

Partimos de que tenemos un Array l, que contiene desde el principio todas las letras del abecedario alfanumérico. Por otro lado partimos de que tenemos una Cola vacía a la que hemos llamado cola (que ocurrentes :)), y dos funciones llamadas encolar(String,TCola) y desencolar(TCola), que obviamente hacen su acometido. Finalmente tenemos una constante llamada ULTIMA_LETRA_ABECEDARIO que contendrá el numero de letras y números totales de nuestro abecedario alfanumérico que sino me fallan las cuentas son 36 y una variable String denominada Tag.

Contendrá también una función llamada probar(), que deberéis adaptar dependiendo del sistema que necesitéis romper.

El algoritmo para hacer fuerza bruta es el siguiente:

for(x=0;x<ULTIMA_LETRA_ABECEDARIO;x++)
{
    probar(l[x]);
    encolar(l[x], Cola);
}

While(!PulseFin())
{
    for(x=0;x<ULTIMA_LETRA_ABECEDARIO;x++)
    {
        tag=Cola[1]+l[x];
        probar(tag);
        encolar(tag,Cola);
    }
    desencolar(Cola);
}

Si lo analizamos detenidamente se puede ver como en el primer for, se analizan que las contraseñas puedan tener una sola letra, se prueban todas una a una y se van encolando, teniendo finalmente la cola así:

Cola->a->b->c->…->z->0->1->2->…->9

En la segunda parte del algoritmo, se probará infinitamente hasta que el usuario pare la ejecución del algoritmo todas las combinaciones de letras. Por ejemplo tras la primer iteración del bucle While quedaría la Cola así:

Cola ->b->c->…->z->0->1->2->…->9->ab->ac->…->az->a1->a2->…->a9

Como veis hemos probado todas las combinaciones de dos letras que comienzan por la primera letra del abecedario, la “a”, la hemos eliminado de nuestra cola, y hemos añadido todas las combinaciones probadas. De esta manera podremos ir probando infinitamente hasta que nuestra paciencia finalice todas las contraseñas existentes :)

Si creéis que la contraseña que queréis romper tiene otros símbolos que no son números y letras podéis añadirlos a vuestro abecedario, pero hay que tener en cuenta que el tiempo de ruptura de la clave es directamente proporcional al número de elementos del abecedario que aumentará exponencialmente con respecto vayan pasando las iteraciones.

Esta técnica que parece la mas sencilla del mundo, bien utilizada puede dar muchos beneficios incluso hoy en día que parece ser que los sistemas son seguros a la fuerza bruta. Dentro de poco os enseñaré la herramienta de Anubis que utiliza esta técnica y que obtiene cosas muy bonitas que ahora mismo estoy analizando y podréis disfrutar en poco tiempo.

Hasta el próximo post, Saludos!!

No hay comentarios: