Saltar la navegación

Ejemplo de ataque contra contraseñas

Existen multitud de programas dedicados a descifrar las contraseñas (password cracking) haciendo uso del método de fuerza bruta, que consiste en ir probando todas y cada una de las posibles contraseñas de distinta longitud. John the Ripper (JtR) (paquete john en Debian), hashcataircrack, Cain&Abel, etc. son aplicaciones de este tipo muy utilizadas actualmente.

John the Ripper

Estos programas se usan en seguridad, ya que permiten a los administradores de sistemas comprobar que las contraseñas de los usuarios son suficientemente buenas si estas no son descubiertas por dichos programas.

La aplicación John de Ripper, en su versión libre (licencia GPL), puede ser instalada en Debian usando el paquete john:

# aptitude install john

Una vez instalado dicho paquete, se puede personalizar su funcionamiento a través del fichero /etc/john/john.conf, y podemos comprobar que funciona correctamente ejecutando el test que incorpora:

# john --test
Benchmarking: descrypt, traditional crypt(3) [DES 128/128 SSE2-16]... DONE
Many salts:    3826K c/s real, 3842K c/s virtual
Only one salt:    3725K c/s real, 3725K c/s virtual

Benchmarking: bsdicrypt, BSDI crypt(3) ("_J9..", 725 iterations) [DES 128/128 SSE2-16]... DONE
Many salts:    126899 c/s real, 127408 c/s virtual
Only one salt:    123631 c/s real, 124126 c/s virtual

Benchmarking: md5crypt [MD5 32/64 X2]... DONE
Raw:    10443 c/s real, 10527 c/s virtual

Benchmarking: bcrypt ("$2a$05", 32 iterations) [Blowfish 32/64 X2]... DONE
Raw:    658 c/s real, 658 c/s virtual

Benchmarking: LM [DES 128/128 SSE2-16]... DONE
Raw:    49950K c/s real, 50150K c/s virtual

Benchmarking: AFS, Kerberos AFS [DES 48/64 4K]... DONE
Short:    351641 c/s real, 351641 c/s virtual
Long:    1161K c/s real, 1168K c/s virtual

Benchmarking: tripcode [DES 128/128 SSE2-16]... DONE
Raw:    3426K c/s real, 3433K c/s virtual

Benchmarking: dummy [N/A]... DONE
Raw:    55533K c/s real, 55980K c/s virtual

Benchmarking: crypt, generic crypt(3) [?/64]... DONE
Many salts:    287617 c/s real, 289346 c/s virtual
Only one salt:    284371 c/s real, 284371 c/s virtual

el cual nos muestra para cada uno de los algoritmos de cifrado con los que puede trabajar, el número de claves por segundo que puede comprobar usando el hardware donde se está ejecutando.

La lista de algoritmos puede verse junto a la opción --format de la breve ayuda que se muestra cuando ejecutamos el comando sin argumentos:

# john 
John the Ripper password cracker, version 1.8.0
Copyright (c) 1996-2013 by Solar Designer
Homepage: http://www.openwall.com/john/

Usage: john [OPTIONS] [PASSWORD-FILES]
--single                   "single crack" mode
--wordlist=FILE --stdin    wordlist mode, read words from FILE or stdin
--rules                    enable word mangling rules for wordlist mode
--incremental[=MODE]       "incremental" mode [using section MODE]
--external=MODE            external mode or word filter
--stdout[=LENGTH]          just output candidate passwords [cut at LENGTH]
--restore[=NAME]           restore an interrupted session [called NAME]
--session=NAME             give a new session the NAME
--status[=NAME]            print status of a session [called NAME]
--make-charset=FILE        make a charset, FILE will be overwritten
--show                     show cracked passwords
--test[=TIME]              run tests and benchmarks for TIME seconds each
--users=[-]LOGIN|UID[,..]  [do not] load this (these) user(s) only
--groups=[-]GID[,..]       load users [not] of this (these) group(s) only
--shells=[-]SHELL[,..]     load users with[out] this (these) shell(s) only
--salts=[-]N               load salts with[out] at least N passwords only
--save-memory=LEVEL        enable memory saving, at LEVEL 1..3
--node=MIN[-MAX]/TOTAL     this node's number range out of TOTAL count
--fork=N                   fork N processes
--format=NAME              force hash type NAME: descrypt/bsdicrypt/md5crypt/
                           bcrypt/LM/AFS/tripcode/dummy/crypt

Como se ve, la versión libre no trabaja con muchos algoritmos de cifrado, por ejemplo, no está el algoritmo NTLM, el cual utilizan las últimas versiones de Windows. Para comprobar la fortaleza de las contraseñas de los usuarios en Windows deberíamos descargar la versión Jumbo de John the Ripper e instalarla a través de la compilación de sus ficheros fuentes. Esta versión incluye más algoritmos de cifrado.

El test anterior, se podría aplicar únicamente a un algoritmo en concreto de la siguiente manera:

# john --test --format=md5crypt
Benchmarking: md5crypt [MD5 32/64 X2]... DONE
Raw:    10800 c/s real, 10887 c/s virtual

# john --test --format=md5crypt
Benchmarking: md5crypt [MD5 32/64 X2]... DONE
Raw:    10863 c/s real, 10951 c/s virtual

Como vemos, los resultados del test no son siempre iguales, aunque se ejecuten en el mismo ordenador, pero sí parecidos, todo dependerá de lo ocupada que esté la CPU en el momento de ejecutar el test.

Se puede descargar un manual en español en la siguiente dirección:

http://www.elmonton.net/hacking/manuales/varios/manual-del-programa-john-the-ripper-v1-5/2745/

o bien en inglés, desde la página oficial:

http://www.openwall.com/john/doc/

Cada usuario puede personalizar el funcionamiento de JtR a través de uno de estos dos ficheros: ~/.john/john.ini o ~/.john/john.conf. En los cuales, se pueden establecer valores por defecto para las opciones de la línea de comandos, definir listas de palabras, definir reglas para el modo single crack, definir parámetros para los modos incrementales o incluso definir nuevos modos de cracking. Si alguno de estos ficheros no existiera, la configuración que se utiliza es la general, especificada en /etc/john/john.conf.

JtR trabaja en tres modos de funcionamiento distintos:

  • Single crack: Es el modo con el que se comienza el chequeo de las contraseñas cuando no se indica ninguno. Este modo lo que hace es probar como contraseñas candidatas el nombre de usuario, el nombre real, el nombre del directorio home y combinaciones de estos nombres con números y letras. Esta información es la que se encuentra en el fichero /etc/passwd, que contiene una línea de información para cada usuario del sistema (campos login, home, GECOS, etc.)
  • Wordlist: Este modo se basa en un fichero con una lista de palabras, una por línea, que serán probadas secuencialmente para ver si se corresponden con la clave. Existen en Internet muchos ficheros wordlist, por ejemplo en: ftp://ftp.fr.openwall.com/pub/, donde los hay para múltiples idiomas.
  • Incremental: Es el modo más potente, es el método de fuerza bruta, pues comprueba todas las combinaciones posibles de caracteres. Normalmente habrá que interrumpirlo después de un tiempo, pues las combinaciones posibles son enormes. Se puede especificar la longitud de la clave y el juego de caracteres.

Para ver algunos ejemplos, lo primero que se necesita es un fichero de claves. En el caso de GNU/Linux podemos usar el comando unshadow (se instala junto con JtR) para unir los datos de /etc/passwd (serán usados por el modo Single crack) con las contraseñas cifradas que están en /etc/shadow:

# unshadow /etc/passwd /etc/shadow > claves

Podemos aplicar secuencialmente los tres modos de JtR (single, wordlist e incremental) para ver si alguna clave es débil:

# john claves
Loaded 2 password hashes with 2 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:05 84% 1/3 0g/s 244.2p/s 244.2c/s 244.2C/s Root62..root99999
0g 0:00:00:12 0% 2/3 0g/s 187.5p/s 243.2c/s 243.2C/s kelly..snickers
0g 0:00:00:19 0% 2/3 0g/s 167.4p/s 247.2c/s 247.2C/s keller..nation
0g 0:00:00:28 1% 2/3 0g/s 154.5p/s 249.4c/s 249.4C/s nina..Joanna
0g 0:00:00:39 3% 2/3 0g/s 145.7p/s 250.9c/s 250.9C/s Dreamer..Theresa
0g 0:00:00:45 4% 2/3 0g/s 143.3p/s 251.4c/s 251.4C/s Woody..Blowme
0g 0:00:01:59 9% 2/3 0g/s 132.4p/s 251.5c/s 251.5C/s Williams1..Benson1

En el ejemplo anterior, durante la ejecución, cada vez que se pulsa una tecla (cualquiera menos q o ctrl+c), se muestra el estado de la búsqueda de contraseñas. La última línea de información indica que va por el 9% del paso 2 de 3, es decir, el modo wordlist.

En cualquier momento podemos parar el comando pulsando la tecla q o ctrl+c:

# john claves
Loaded 2 password hashes with 2 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:05 84% 1/3 0g/s 244.2p/s 244.2c/s 244.2C/s Root62..root99999
0g 0:00:00:12 0% 2/3 0g/s 187.5p/s 243.2c/s 243.2C/s kelly..snickers
0g 0:00:00:19 0% 2/3 0g/s 167.4p/s 247.2c/s 247.2C/s keller..nation
0g 0:00:00:28 1% 2/3 0g/s 154.5p/s 249.4c/s 249.4C/s nina..Joanna
0g 0:00:00:39 3% 2/3 0g/s 145.7p/s 250.9c/s 250.9C/s Dreamer..Theresa
0g 0:00:00:45 4% 2/3 0g/s 143.3p/s 251.4c/s 251.4C/s Woody..Blowme
0g 0:00:01:59 9% 2/3 0g/s 132.4p/s 251.5c/s 251.5C/s Williams1..Benson1
0g 0:00:03:34 16% 2/3 0g/s 129.2p/s 250.6c/s 250.6C/s TOTOTO..DONKEY
Session aborted

Y puede continuarse en otro momento a partir del punto en el que se detuvo, el cual se almacena en el fichero ~/.john/john.rec:

# john --restore
Loaded 2 password hashes with 2 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:03:40 17% 2/3 0g/s 128.9p/s 250.7c/s 250.7C/s XANADU..NERMAL

JtR guarda las contraseñas craqueadas en ~/.john/john.pot. Para mostrar las contraseñas encontradas en el fichero claves ejecutaremos el siguiente comando:

# john --show claves

Es posible utilizar solo uno de los modos de funcionamiento, por ejemplo, para aplicar únicamente el modo single crack ejecutaríamos:

# john --single claves

Para los otros modos sería:

# john --incremental claves

y

# john --wordlist=diccionario.lst --rules claves

donde diccionario.lst contiene la lista de palabras (wordlist) que queremos que se utilicen para chequear el fichero claves. La opción --rules, al especificarse, hace que las palabras que utilizará JtR sean las generadas por una serie de reglas de transformación que actuan sobre cada una de las palabras del diccionario; si no se pone esta opción, solo se utilizan las palabras del diccionario.

Si queremos chequear varios ficheros de contraseñas, se tardará menos tiempo si los chequeamos a la vez, en vez de independientemente. De esta manera, deberíamos ejecutar:

# john --single claves-1 claves-2 claves-3

o bien:

# john --single claves-*

Para chequear solo las contraseñas de algunos usuarios en concreto por el método single crack:

# john --single users:juan,pepe claves

y si queremos justo lo contrario, es decir, chequear a todos los usuarios menos a juan y pepe:

# john --single users:-juan,pepe claves

Licencia: licencia de software libre GPL