martes, 19 de febrero de 2013

GeneratorBF | Generando nuestros propios diccionarios para BruteForce

Buen día.


Unos de los ataques más usuales en Criptoanálisis, o al menos en el Criptoanálisis que nos cubre en este ciber mundo, es el uso de ataques por fuerza bruta y ataques por diccionario, ya sea para permitirnos el ingreso a un sistema o para obtener la password de una caja fuerte; Así que hoy vamos a explicar ambos ataques y además vamos a crear nuestra propia tool, la cual nos permitirá de manera fácil y sencilla, la creación de nuestros propios diccionario hechos a nuestras necesidades (explicamos más adelante).
 

--- Ataque por Fuerza Bruta (BF):

Este ataque consiste como su nombre lo indica, en hacer uso exclusivamente de la fuerza, en este caso, la fuerza se ve representada en la cantidad de procesamiento de nuestro computador, en la cantidad de peticiones que nuestro router puede enviar o en su defecto la cantidad de peticiones que el servidor tiene permitido recibir. Si llevamos esto al campo informático y al campo de la criptografía, tendremos que su funcionamiento básico consiste en probar todas las posibles combinaciones que un sistema nos permite, para poder entender esto un poco más fácilmente vamos a representarlo con un ejemplo:



1) Supongamos que tenemos una bicicleta y que mientras dábamos un paseo por las "bellas" calles de nuestra ciudad, tuvimos un deseo o impulso de entrar a un centro comercial, ya sea por que están vendiendo la ultima consola de videojuegos, o por que miramos a una linda chica... El caso es que tenemos que dejar nuestra bicicleta a fuera durante unos minutos, pero como nosotros somos chicos muy responsables, no podemos dejar la bicicleta desprotegida ante los ojos y manos inescrupulosas de aquellos que pasen por dicho lugar, así que sacamos nuestro candado para bicicleta, el cual tiene una clave que solo nosotros conocemos y que nos dá esa sensación de seguridad que todos deseamos, bueno, después fijamos la bicicleta a un lugar firme y revolvemos todas los números de nuestra clave para que nadie la sepa y así nosotros podemos deleitarnos, mientras observamos a tan bella mujer que en principio llamo nuestra atención.



Ahora cambiemos un poco los papeles, en este caso, no seremos aquel enamorado que a la primera mirada quedo profundamente flechado de la susodicha mujer, que todos creemos bella y quizás hermosa. Seremos la otra cara de la moneda, seremos el vil e inescrupuloso "dueño de lo ajeno", que tratará de hacerse a la bicicleta, pero para eso primero tendrá que saltar o vulnerar la seguridad de la misma (el candado), así que manos a la obra, pues solo nos quedan unos minutos antes de que el enamorado salga de su trance y vuelva por su bicicleta.

¿En principio con qué nos encontramos?, Tenemos una bicicleta que esta anclada a un lugar firme, y que lo único que nos detiene de moverla es un candado con una clave que no conocemos, ¿será que nos damos por vencidos y huimos mientras podemos?, aunque no sería mala idea,  vamos a analizar un poco más la situación antes de huir. Por la fisionomia del candado, podemos ver que es una clave numerica de 4 digitos, que colocados en el orden correspondiente, nos dan acceso o nos liberan del candado. Eso parece ser todo, no hay más seguridad en dicho candado, así que vamos a ver como podemos vulnerarlo.

- 4 digitos
- es numerica

Con esos datos, es sumamente fácil llegar a la conclusión de que la clave para dicho candado se encuentra en el rango de 0000 a 9999, lo cual nos deja con 10000 mil posibles claves :'( ... bueno, creo que en este punto todo "amigo de lo ajeno" resolvería por huir y quizás buscar otra bicicleta... pero nosotros no harémos eso, ya hemos llegado muy lejos y es momento de actuar, así que concientes del corto tiempo que tenemos, comenzamos a probar todas las posibles claves -> 0001 -> 0002 -> 0003 -> ... -> 0546 -> 0547 -> ... -> 1234 -> 1235 -> ... 4532 -> 4533 .. bueno, aquí tenemos que hacer una pausa pues no es tan creible la velocidad de este personaje, pero supongamos que nuestro enamorado tuvo exito con su impulso y la bella chica ahora le esta hablando, le esta preguntando y quizás le este aceptando un café para amenizar la charla, así que nosotros seguimos en lo nuestro .. 5555 -> 5556 -> ... -> 6012 -> 6013 -> ... -> 6665 -> 6666 (Eureka!!!), hemos encontrado la clave para abrir el candado, así qué sin pensarlo dos veces, abrimos el candado y liberamos la bicicleta, ahora sí, a huir!!! (O.O)!!! ...

Yo sé, esto no esta bien :'( ... pero ps no lo mirén así, quizás aquel joven enamorado e impulsivo, perdio una bicicleta, pero pudo ganar el amor de su vida (doble moral).. jajajaja.. bueno, eso está mal, notesé que solo era para ilustrar el ejemplo.

Así que volviendo a la definición principal e incluyendo el ejemplo, lo único que hicimos nosotros fue probar todas las posibles combinaciones que el sistema nos permitia, en este caso, el sistema es (0123456789) y nos limitaba a cambinaciones de 4 digitos, así que tenemos 10^4 = 10000 posibles combinaciones (la longitud del sistema, elevada la cantidad de digitos maxima que tendrá).


--- Ataque por Diccionarios: 

En comparación, este ataque también se puede considerar como una variación del anterior (BF), solo que con una pequeña diferencia, y es que el ataque por diccionarios no consiste en un uso excesivo de la fuerza sino por el contrario, se podría decir que se enfoca más a un uso "racional" e "inteligente" de los recursos o sistemas disponibles. Para verlo un poco mejor, vamos a ilustrarlo con un ejemplo, en este caso una variante del primer ejemplo.

2) Sin tener que repetir el ejemplo anterior, supongamos que nosotros como "amigos de lo ajeno", tenemos mucha experiencia vulnerando la seguridad de los candados, y es especial los de las bicicletas, pues llevamos muchos años de experiencia haciendonos a bicicletas ajenas y encontrando las claves por medio de Fuerza Bruta. Pero ha ocurrido algo increible, nos hemos dado cuenta de que las claves en su mayoria se repiten!!..  ya sea por la marca del candado, o por la aparente edad del candado o  por la personalidad del ciclista, etc...

Nuestra experiencia en este campo de lo "ajeno" nos ha dado muchos trucos, para que a la hora de enfrentarnos al candado no tener que probar las 10^n posibilidades que la fuerza bruta nos propone, sino que intentemos probar inmediatamente algunas claves que creemos que serán las correctas; Estas creencias muchas veces no solo se fundamentan en la experiencia, sino también en la investigación (la marca y la edad de cada candado)...

- Las empresas generalmente piensan en cantidad y no en calidad.
- Las claves en los candados vienen por defecto en los mismos.
- Al escoger claves numericas, generalmente se utilizan combinaciones faciles de recordar o con algún significado, personal o costumbrista.
- La invidualidad humana no es más que un simple conjunto de invidualistas, regidos por las mismas leyes o los mismos pensamientos.

Si pensamos bien en cada uno de esos puntos, podemos ver que por ejemplo, las empresas pueden fabricar cientos o miles candados con la misma clave, y pues que dichas claves generalmente estan pensadas para ser facilmente recordadas (1234 - 4321- 5555 - 7777 - 2233 - 2000 - 2012 - 6666...), y en caso de que uno sea quien escoga la clave, tendremos que muchas de esas claves se encontraran en el rango de (1980 a 2000) pues es el año de nacimiento de muchos ciclista jovenes; y con esto hago referencia al ultimo punto, aunque cada uno piense diferente, siempre tendremos tendencias generales, y es aquí donde entramos a aprovechar.



Resumiendo un poco, un ataque por diccionario consiste en probar solo las claves que creemos que podrían ser, esto teniendo como criterio ya sea la edad de la victima, los gustos, la empresa que le proporciona seguridad, o tantos factores como creamos necesarios.


--- Nuestra Tool [GeneratorBF]: 

Aunque existen muchas tools que hacen este tipo de ataques, nosotros crearemos una que se ajuste a nuestras exigencias; y es por esto que primero plantearemos las cosas que necesitamos y después si desarollamos.

1) Necesitamos la posibilidad de escoger nuestro propio sistema a utilizar, en este caso ya empezamos a hablar de abecedario o cantidad de caraceteres distintos.

2) Necesitamos generar las posibles combinaciones no solo con una longitud determinada, sino que también necesitamos generarla de varias longitudes.

3) Si ya tenemos un diccionario de BF creado, que no sea necesario volverlo a crear sino arrancar desde él en adelante. 

¿Por qué estas exigencias?, generalmente todas las tools que manejan estos sistemas de ataques, necesitan el manejo de archivos donde esten contenidos todas las palabras a probar, y pues nuestro proposito es hacer eso, crear nuestros propios archivos, con nuestros propios sistemas. por ejemplo.

Si sabemos que una determinada plataforma tiene como usuario "Admin" y estamos seguros (información recopilada) de que la password es numerica, y de una longitud maxima de 6, entonces simplemente tendremos que usar nuestro diccionario con todos los 10^6 = 1000000 posibles passsword, y no tener que utilizar caracteres alfabeticos; o por el contrario, tenemos que la password es alfabetica, pero que estamos seguros de que tiene una longitud de 6 y además no usa el abecedario normal, sino que no usa ni la (H - J - K - W - Q - Z - X - Y - V) en su password, entonces tenemos (26-9)^6 = 24137569 password..

No se asusten por esos numeros, en realidad nuestras computadoras ahora tienen una capacidad de procesamiento realmente increible, y no se asombren si no es necesario que pasen mas de 1 o 2 min en recorrer todas las posibles password.


Empezaremos con la función más importante de nuestro programa:

def generador(abecedario,cadena,n,m,procesos):   
    if n!=m:
        global porc,cont
        if ((cont*100.)/procesos)>=porc-1 and ((cont*100.)/procesos)<=porc+1:
            print "#",
            porc+=5
           
        for x in abecedario:
            crack=cadena+x
            generador(abecedario,crack,n+1,m,procesos)
            cont+=1
    else:
        archivo=open("diccionario_"+str(n)+".txt","a")
        for x in abecedario:
            final=cadena+x
            archivo.write(final+"\n")
            cont+=1
        archivo.close()

Sin entrar en tanto detalle, nosotros tratamos de llevar el funcionamiento normal de los BruteForce, a una función recursiva que se ajustara a nuestras necesidades. El funcionamiento "normal", consiste en la anidación de varios ciclos for, pero nosotros simulamos el mismo funcionamiento desde una función recursiva que basicamente hace lo mismo, nos anida una cantidad n de ciclos for y almacena todos los datos obtenidos en un archivo .txt; sé que si entro a explicar detalladamenta la función, este post se volverá más largo y tedioso de lo normal, pues es necesario explicar varios conceptos, que no sé como hacerlo, así que espero lo analicen y sí tienen cualquier duda, nos la pueden hacer llegar.

Nuestro programa nos genera 3 opciones posibles y nos da la posibilidad de escoger una y el sistema/diccionario que deseemos utilizar:

    [1] Generar Diccionario de longitud fija.
    [2] Generar Diccionarios en rango de longitudes.
    [3] Generar Diccionarios desde cero hasta una longitud.


Es importante recalcar, que al momento de escoger alguna de las opciones, también tenemos la posibilidad de escoger nuestro diccionario a utilizar, y esto lo hacemos así: primero indicamos alguna de las 3 opciones y con el caracter "|" separamos y luego indicamos el sistema a utilizar.

Por ejemplo, quiero crear un diccionario de longitud 4, pero que sea numerico, entonces tecleamos lo siguiente:

1|0123456789

El caracter "|" separa a la opcion seleccionada del diccionario a utilizar. Lo mismo ocurre para las demás opciones, al momento de definirlas podemos también definir el sistema que utilizaremos, pero en caso de que no lo hagamos, el programa nos deja por defecto el siguiente sistema "abcdefghijklmnopqrstuvwxyz".

La opción 2, nos da la posibilidad de crear varios diccionarios, por ejemplo si solo queremos crear diccionarios que tengan longitudes de 3 a 5, entonces esta opción nos va a crear un diccionario de longitud 3, 4 y 5, utilizando el diccionario por defecto o el que se indico.

la opción 3, nos da la posibilidad de crear todos los diccionarios desde la longtiud 1, hasta la longitud N que nosotros le indiquemos, por ejemplo N=5, entonces él nos creará el diccionario de longitud 1, 2, 3, 4 y 5, con el sistema que haya definido.









Sí tienen alguna pregunta, duda o comentario, siempre son bienvenidos, y todo el equipo de TrackMaze esta a disposición para responder. Espero qeu lo hayan disfrutado y que le saquen todo el provecho que deseen.

Bytez.

7 comentarios:

  1. Sigue así!!!
    Muchas gracias por compartir esta valiosa informacion.

    ResponderEliminar
  2. Ando averiguando sobre Python ver. 2.7, estoy ejecutándolo en el CMD en windows7, entro el código pero no arranca, ¿Sera que este código arranqua solo en Terminal Linux? ¿Sera que este código será para Python 3.4?, ya que los códigos simples se me ejecutan bien, pero el tuyo como es mas complejo; puede que tenga yo un problema de compatibilidad.

    Trato de valérmelas por mi mismo, pero internet ofrece tanta información que llega a confundir, espero entiendas.

    Saludos y gracias por el Post

    ResponderEliminar
    Respuestas
    1. Buen día.

      En realidad sí es muy probable que los errores que presentes se deban a ello, pues aunque ambas versiones son parecidas en algunas cosas, no son compatibles con estilos de sintaxis o gramaticales (en cuanto al lenguaje de programación se refiere), por tanto te recomiendo que uses python 2.7 para correr el script y no te preocupes por nada, tanto en windows como en linux, se pueden tener ambos a la vez y ejecutar uno u otro según la situación en la que nos encontremos.

      Espero haberte ayudado y ante cualquier otra inquietud, no duden en preguntar,

      Bytez

      Eliminar
  3. Hola amigo no tiene un ejecutable para descargar para windows? Se puede configurar un prefijo para el diccionario?

    ResponderEliminar
  4. Buenos días Rodrigo, Con respecto al ejecutable en windows puedes instalarte el interprete de python(ActivePython) para que puedas correr el script una vez que puedas correr el script puedes modificarlo para configurar el prefijo que necesitas según el perfilamiento del diccionario que deseas obtener.

    Salud2

    ResponderEliminar
  5. Hola, disculpa pero me podras orientar sobre algun software que genere diccionarios basandose en palabras clave??

    Expecificamente si tienes por ejemplo la palabra "evento", que genera posibles contraseñas como "3v3nt0", "Ev3nto", "ev3nto", etc.

    gracias.

    ResponderEliminar