viernes, 24 de julio de 2015

Crear diccionario para ataques por fuerza bruta con Crunch

No se si la generación de diccionarios para ataques por fuerza bruta es la primera cuestión que debería abordar alguien que quiere dedicarse a la auditoría de seguridad informática pero seguro que estaría dentro de las primeras. Hoy en día se pueden realizar ataques altamente sofisticados para conseguir burlar la seguridad de algún software o instalación aprovechando errores en la validación de usuarios, ejecutando código en lugares no controlados por las aplicaciones,...etc pero ¿Y si podemos entrar por la puerta principal gracias a un estudio previo mediante ingeniería social?.

¿Que es un ataque por fuerza bruta?

Un ataque por fuerza bruta no es más que, previa selección de un conjunto finito de posibles claves/usuarios, irlas probando mediante algún automatismo. Centrándonos en las contraseñas, el problema es que si el conjunto de posibilidades que generamos es muy amplio, el tiempo de computación puede ser inasumible y por lo tanto no servirá para nada. Por esto, el arte de estos ataques radican en la correcta selección del diccionario no generando todas las combinaciones posibles sin antes realizar un estudio previo con las palabras clave que sepamos que el usuario puede utilizar (su nombre o apellidos, fechas de nacimiento, matrícula del coche,...etc) y descartar aquellas contraseñas absurdas tales como “aaeeeiii” con las que perdemos tiempo de computación y es improbable que el usuario las use como password. Como nota adicional, si un usuario genera una contraseña muy fuerte deberemos contemplar el uso de otros mecanismos para obtenerla tales como un ataque por phishing porque será muy complicado genera un diccionario que podamos procesar en un tiempo razonable. Si queremos comprobar la fortaleza de una contraseña podemos hacerlo aquí.

Como generar un diccionario

Podemos generar un diccionario de múltiples maneras (script shell,programas en python, creándolo a mano,...etc) pero una de las mejores utilities que conozco es Crunch gracias a bofh28. Es versátil, admite patrones, segmentación de resultados, partición de ficheros de salida por tamaño,...etc. A continuación explicaré tanto su instalación en linux como un conjunto de casuísticas que por si solas o combinadas podrán resolver casi todas las necesidades que tengamos para crear diccionarios complejos.

Instalar Crunch en linux

Para ello lo primero que tenemos que hacer es descargarnos Crunch con el comando wget:

rencinar@debian8:~/Descargas$ wget http://sourceforge.net/projects/crunch-wordlist/files/crunch-wordlist/crunch-3.6.tgz



Esto nos descargará el archivo crunch-3.6.tgz, en mi caso la descarga la ha realizado en /home/rencinar/Descargas/. Una vez descargado lo descomprimimos con el comando tar -xzvf:

rencinar@debian8:~/Descargas$ tar -xzvf crunch-3.6.tgz
crunch-3.6/
crunch-3.6/crunch.1
crunch-3.6/charset.lst
crunch-3.6/unicode_test.lst
crunch-3.6/Makefile
crunch-3.6/crunch.c
crunch-3.6/COPYING

Una vez descomprimido entraremos en el directorio crunch-3.6 y realizaremos un make y un make install con permisos de root:

rencinar@debian8:~/Descargas$ su -
Contraseña:
root@debian8:~# cd /home/rencinar/Descargas/crunch-3.6/
root@debian8:~#  make
Building binary...
/usr/bin/gcc -pthread -Wall -pedantic -std=c99 -m32 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 crunch.c -lm -o crunch
root@debian8:/home/rencinar/Descargas/crunch-3.6# make install
Creating directories...
sudo /usr/bin/install -d -g root -o root \
/usr/bin \
/usr/share/man/man1 \
/usr/share/crunch \
/usr/share/doc/crunch
Copying binary...
sudo /usr/bin/install crunch /usr/bin
Copying charset.lst...
sudo /usr/bin/install charset.lst /usr/share/crunch
Copying COPYING...
sudo /usr/bin/install COPYING /usr/share/doc/crunch
Installing man page...
sudo /usr/bin/install crunch.1 /usr/share/man/man1

Ejemplos de uso

Una vez tengamos instalado Crunch tendremos disponible el comando crunch en las shell para poder usarlo. Para usarlo tendremos que lanzarlo con la nomenclatura crunch <min> <max> [options]. A continuación paso a explicar unos ejemplos que muestran gran parte de la potencia de este comando (en algunos ejemplos pongo entre "" las secuencias de caracteres para que el caracter ' ' quede reflejado):

Ejemplo crunch 1 3 -o pass.txt

El resultado es un fichero pass.txt con todas las posibles combinaciones de caracteres con longitud de 1 a 3 caracteres alfabéticos en minúsculas por lo tanto tendremos desde la "a" hasta la "zzz".

root@debian8:~# crunch 1 3 -o pass.txt
Crunch will now generate the following amount of data: 72384 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 18278
crunch: 100% completed generating output

Ejemplo crunch 1 3 abcdefg -o pass.txt

El resultado es un fichero pass.txt con todas las posibles combinaciones de caracteres con longitud de 1 a 3 caracteres con el conjunto limitado de datos que le hemos designado (abcdefg) por lo tanto tendremos desde la "a" hasta la "ggg" y nunca tendremos combinaciones como "zzz" o "haa" porque quedan fuera del rango de selección.

root@debian8:~# crunch 1 3 abcdefg -o pass.txt
Crunch will now generate the following amount of data: 1533 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 399
crunch: 100% completed generating output

Ejemplo crunch 1 6 "abcdefg " -o pass.txt

El resultado es un fichero pass.txt con todas las posibles combinaciones de caracteres con longitud de 1 a 6 caracteres con el conjunto limitado de datos que le hemos designado (abcdefg ). La gracia del entrecomillado es que nos incluye el espacio como carácter del conjunto por lo que tendremos desde la "a" hasta la "     g".

root@debian8:~# crunch 1 6 "abcdefg " -o pass.txt
Crunch will now generate the following amount of data: 2054352 bytes
1 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 299592
crunch: 100% completed generating output

Ejemplo crunch 1 3 -f /usr/share/crunch/charset.lst lapsusmentis -o pass.txt

En los ejemplos anteriores hemos tenido que definir el conjunto de valores posibles sobre los que generará las combinaciones de caracteres pero Crunch, para que no tengamos que poner permanentemente todo el listado de caracteres, tiene un fichero maestro con todos los conjuntos más habituales de caracteres (por supuesto podremos añadirle alguno adicional). El fichero lo tendremos ubicado en /usr/share/crunch/charset.lst y para añadir nuestra propia secuencia basta con añadir al fichero una línea con la siguiente estructura:
 
nombre_de_la_secuencia = [conjunto de valores]

Como por ejemplo:

lapsusmentis                   = [abcde1]

El resultado del comando "crunch 1 3 -f /usr/share/crunch/charset.lst lapsusmentis -o pass.txt" es un fichero pass.txt con todas las posibles combinaciones de caracteres con longitud de 1 a 3 caracteres con el conjunto limitado de datos que le hemos designado en el fichero charset.lst para la cadena lapsusmentis (abcde1) por lo tanto tendremos desde la "a" hasta "111". Esto equivaldría a lanzar el comando  crunch 1 3 abcde1 -o pass.txt .

root@debian8:~# crunch 1 3 -f /usr/share/crunch/charset.lst lapsusmentis -o pass.txt
Crunch will now generate the following amount of data: 984 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 258
crunch: 100% completed generating output

Ejemplo crunch 1 3 -f /usr/share/crunch/charset.lst mixalpha-numeric-all-space -o pass.txt

Si quisiéramos utilizar una lista predefinida como por ejemplo mixalpha-numeric-all-space, lo haríamos de la misma manera que en el ejemplo anterior (mixalpha-numeric-all-space = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ]). Generará valores desde "a" hasta "   ".

root@debian8:~# crunch 1 3 -f /usr/share/crunch/charset.lst mixalpha-numeric-all-space -o pass.txt
Crunch will now generate the following amount of data: 3456765 bytes
3 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 866495
crunch: 100% completed generating output


Ejemplo crunch 6 6 -f /usr/share/crunch/charset.lst  mixalpha-numeric-all-space -o pass.txt -t @pio@@ -s cpiosj

Esta es para mi una de las mejores maneras de generar un diccionario. En el ejemplo que pongo indico que vamos a generar palabras de 6 caracteres, con la opción -t le indicamos el patrón a seguir (con la @ le indicamos a crunch que ese caracter es el que tiene que iterarse con el conjunto de valores de la lista mixalpha-numeric-all-space, quedando fija la parte "pio") y con el -s desde donde va a empezar (al indicarle que empiece por "cpiosj" nunca generará "apioaa" por ejemplo). El diccionario empezará en "cpiosj" y acabará en “ pio  ”.

root@debian8:~# crunch 6 6 -f /usr/share/crunch/charset.lst  mixalpha-numeric-all-space -o pass.txt -t @pio@@ -s cpiosj
Crunch will now generate the following amount of data: 5863242 bytes
5 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 837606
crunch: 100% completed generating output

Ejemplo crunch 2 3 -f /usr/share/crunch/charset.lst ualpha  -o pass.txt -s CC

El resultado es un fichero pass.txt con todas las posibles combinaciones de caracteres con longitud de 2 a 3 caracteres con el conjunto limitado de datos ualpha ([ABCDEFGHIJKLMNOPQRSTUVWXYZ]) empezando en "CC" y acabando en "ZZZ" por lo tanto nunca nos generará ni "AA" ni "BZ",...etc.

root@debian8:~# crunch 2 3 -f /usr/share/crunch/charset.lst  ualpha  -o pass.txt -s CC
Crunch will now generate the following amount of data: 72170 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 18198
crunch: 100% completed generating output

Ejemplo crunch 3 3 -p dog

Como podemos ver, el resultado es una permuta de todos los caracteres que componen la palabra dog. La opción -p nos permite realizar este tipo de acciones de permuta de caracteres de palabras.

root@debian8:~# crunch 3 3 -p dog
Crunch will now generate approximately the following amount of data: 24 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 6
dgo
dog
gdo
god
odg
ogd

Ejemplo crunch 4 5 -p la moto grande

En el ejemplo anterior realizábamos permutas entre caracteres de una palabra pero con la opción -p también podemos realizar permutas entre palabras.

root@debian8:~#  crunch 4 5 -p la moto grande
Crunch will now generate approximately the following amount of data: 78 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 6
grandelamoto
grandemotola
lagrandemoto
lamotogrande
motograndela
motolagrande

Ejemplo crunch 1 3 -o START -c 6000 -z bzip2

Con la opción -c 6000 le indicamos el número de palabras máximas por fichero (en este caso rotará el fichero al llegar a 6000 palabras), con el -o  START le indicamos que el nombre del fichero generado tendrá la estructura [la primera palabra del fichero-ultima palabra del fichero] (en el ejemplo los nombres de los ficheros son a-hvt.txt, hvu-qsn.txt, qso-zph.txt, zpi-zzz.txt) y con el -z bzip2 le indicamos que lo comprima con bunzip2.


root@debian8:~#  crunch 1 3 -o START -c 6000 -z bzip2
Crunch will now generate the following amount of data: 26080 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 6702

crunch:  89% completed generating output
Beginning bzip2 compression.  Please wait.
  a-hvt.txt:  5.738:1,  1.394 bits/byte, 82.57% saved, 23272 in, 4056 out.

crunch: 179% completed generating output
Beginning bzip2 compression.  Please wait.
  hvu-qsn.txt:  7.175:1,  1.115 bits/byte, 86.06% saved, 24000 in, 3345 out.

crunch: 268% completed generating output
Beginning bzip2 compression.  Please wait.
  qso-zph.txt:  7.249:1,  1.104 bits/byte, 86.20% saved, 24000 in, 3311 out.

crunch: 272% completed generating output
Beginning bzip2 compression.  Please wait.
  zpi-zzz.txt:  5.196:1,  1.540 bits/byte, 80.76% saved, 1112 in, 214 out.

Ejemplo crunch 4 5 -b 20mib -o START

Con la opción -b 20mib le indicamos que el tamaño máximo por fichero generado será de 20M por lo que rotará el fichero al alcanzar dicho tamaño. Además al indicarle la opción -o START  pondrá como nombre de cada uno de los ficheros siguiendo la estructura [la primera palabra del fichero-última palabra del fichero]. Al ver la salida del comando anterior podremos comprobar que mantiene el tamaño máximo que le hemos indicado.

root@debian8:~# crunch 4 5 -b 20mib -o START
Crunch will now generate the following amount of data: 73573136 bytes
70 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 12338352
crunch:  28% completed generating output
crunch:  57% completed generating output
crunch:  85% completed generating output
crunch: 100% completed generating output

Comprobamos el tamaño de los ficheros generados:

root@debian8:~# ls -ltrh
total 71M
-rw-r--r-- 1 root root  20M jul 23 00:16 aaaa-gvfed.txt
-rw-r--r-- 1 root root  20M jul 23 00:16 gvfee-ombqy.txt
-rw-r--r-- 1 root root  20M jul 23 00:16 ombqz-wcydt.txt
-rw-r--r-- 1 root root  11M jul 23 00:16 wcydu-zzzzz.txt

Ejemplo crunch 3 3 abc + 123 =@# -t @%^

El resultado serán palabras de longitud 3 siguiendo el patrón @%^ utilizando el conjunto de datos abc para la @, 123 para el % y =@# para ^.

root@debian8:~# crunch 3 3 abc + 123 =@# -t @%^
Crunch will now generate the following amount of data: 108 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 27
a1=
a1@
a1#
a2=
a2@
a2#
a3=
a3@
a3#
b1=
b1@
b1#
b2=
b2@
b2#
b3=
b3@
b3#
c1=
c1@
c1#
c2=
c2@
c2#
c3=
c3@
c3#

Ejemplo crunch 3 3 abc + 123 =@# -t ^%@

La misma generación que antes pero cambiando el orden del patrón. El resultado serán palabras de longitud 3 siguiendo el patrón @%^ utilizando el conjunto de datos abc para la @, 123 para el % y =@# para ^.

root@debian8:~# crunch 3 3 abc + 123 =@# -t ^%@
Crunch will now generate the following amount of data: 108 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 27
=1a
=1b
=1c
=2a
=2b
=2c
=3a
=3b
=3c
@1a
@1b
@1c
@2a
@2b
@2c
@3a
@3b
@3c
#1a
#1b
#1c
#2a
#2b
#2c
#3a
#3b
#3c

Ejemplo crunch 4 4 + + 123 + -t %%@^ -o pass.txt

En esta ocasión generaremos palabras siguiendo el patrón %%@^ por esto obtendremos desde "11a!" hasta la "33z " al haber definido el conjunto numérico 123 en las 2 primeras posiciones, una letra minúscula (@) en la tercera posición y un carácter en la cuarta(^).

root@debian8:~# crunch 4 4 + + 123 + -t %%@^ -o pass.txt

Ejemplo crunch 5 5 -t ddd@@ -p dog cat bird

Con el patrón ddd@@ le estamos indicando que las 3 primeras posiciones corresponden a las palabras de 3 letras a permutar y que las 2 últimas posiciones serán letras minúsculas. De esta manera comenzará por "birdcatdogaa" y finalizará en "dogcatbirdzz".

root@debian8:~# crunch 5 5 -t ddd@@ -p dog cat bird
Crunch will now generate approximately the following amount of data: 52728 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 4056
crunch: 100% completed generating output

Ejemplo crunch 4 4 cC -t @ddd -p dog

En esta ocasión utilizamos el patrón @ddd donde el conjunto designado para la @ será cC y con ddd designamos los caracteres a permutar de la palabra dog.

root@debian8:~# crunch 4 4 cC -t @ddd -p dog
Crunch will now generate approximately the following amount of data: 60 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 12
cdgo
Cdgo
cdog
Cdog
cgdo
Cgdo
cgod
Cgod
codg
Codg
cogd
Cogd

Ejemplo crunch 7 7 -t p@ss,%^ -l a@aaaaa

En este caso proponemos el patrón p@ss,%^ pero no queremos que la @ la sustituya por todo el conjunto de letras en minúscula. Para realizar esto usamos la opción -l donde le indicamos con la “a” los caracteres que cogerá del patrón y usamos la @ para iniciar que es fija, por lo tanto en este caso los únicos caracteres que cambiarán son los 3 últimos ("," iterará con todas las letras en mayúscula, % iterará con números y ^ con símbolos). Por esto irá desde "p@ssA0" hasta "p@ssZ9 ".

root@debian8:~# crunch 7 7 -t p@ss,%^ -l a@aaaaa

Ejemplo crunch 5 5 -s @4#S2 -t @%^,2 -e "@8 Q2" -l @dddd -b 10KB -o START

Con la opción -s le indicamos la palabra inicial desde la cual empieza a generar el diccionario y con la opción -e la última palabra que generará. Por esto la primera palabra generada es "@4#S2" y  la última es "@8 Q2".

root@debian8:~# crunch 5 5 -s @4#S2 -t @%^,2 -e "@8 Q2" -l @dddd -b 10KB -o START
Crunch will now generate the following amount of data: 25266 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 4211
crunch: 39% completed generating output
crunch: 79% completed generating output
crunch: 100% completed generating output

Ejemplo crunch 5 5 -d 2@ -t @@@%%

Con la opción -d limitamos el número máximo de caracteres iguales seguidos en la secuencia. En este caso al poner 2@ le indicamos que el número máximo de caracteres repetidos pueden ser 2 letras minúsculas (nunca nos vamos a encontrar "aaa11" ni "nnn45" por ejemplo) por esto empezaremos en la "aab00" y tendremos como palabra final "zzy99".

root@debian8:~# crunch 5 5 -d 2@ -t @@@%%

Ejemplo crunch 5 5 -d 1@ -t @@@%%

En este caso al poner -d 1@ le indicamos que el número máximo de caracteres repetidos pueden ser de 1 letra minúscula (nunca nos vamos a encontrar "aab11" ni "nnb45" por ejemplo) por esto empezaremos en la "aba00" y tendremos como palabra final "zyz99".

root@debian8:~# crunch 5 5 -d 1@ -t @@@%%

Ejemplo crunch 5 5 -t @@%%% -d 1@ -d 2%

En este caso indicamos que tendremos combinaciones de 5 cifras donde solo podrá haber una letra minúscula consecutiva igual y un máximo de 2 números consecutivos iguales (nunca podrá haber ni "aa001" ni "ab000" por ejemplo). La primera palabra será "ab001" y la última será "zy998".

root@debian8:~# crunch 5 5 -t @@%%% -d 1@ -d 2%

Ejemplo crunch 5 5 -d 2@

Crearemos combinaciones de palabras donde el máximo de caracteres vecinos iguales será de 2. La primera palabra será "aabaa" y la última será "zzyzz".

root@debian8:~# crunch 5 5 -d 2@

Ejemplo crunch 4 4 -f /home/rencinar/Descargas/crunch-3.6/unicode_test.lst japanese -t @@%% -l @xdd

Crunch también nos permite la generación de diccionarios con caracteres japoneses (japanese) o griegos (the-greeks) gracias a unicode_test.lst . En el siguiente ejemplo vamos a combinar los caracteres japoneses (japanese = [日本語]) con la @ y numéricos con el %, para ellos usaremos unicode_test.lst  con el conjunto de caracteres  japanese. El primer valor es "@日00" y el último es "@語99".

root@debian8:~# crunch 4 4 -f /home/rencinar/Descargas/crunch-3.6/unicode_test.lst japanese -t @@%% -l @xdd               
Notice: Detected unicode characters.  If you are piping crunch output
to another program such as john or aircrack please make sure that program
can handle unicode input.
Do you want to continue? [Y/n] Y
Crunch will now generate the following amount of data: 2100 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 300

3 comentarios:

  1. Muy buena guia pero me he terminado haciendo un lio mental, como puedo hacer para pedirle una combinacion de 2 letras fijas mas 5 numeros del 0 al 9? gracias :)

    ResponderEliminar
    Respuestas
    1. Muchas gracias y por favor si te ha gustado compártelo!!
      Para hacer lo que quieres basta con utilizar la siguiente expresión cambiando las letras as por las que quieras y te generará combinaciones desde as00000 hasta as99999
      crunch 7 7 -t as%%%%%
      Espero haberte entendido bien la pregunta :-)

      Eliminar
  2. Como lo harias para que los 5 primeros se han sólo letras mayusculas y los 5 ultimos sean sólo números. Grasias

    ResponderEliminar