Introducción al Password Cracking

En esta guía se hace un resumen sobre el cracking de contraseñas, utilizando el software hashcat.

Además se incluye unas recomendaciones sobre la metodología a seguir a la hora de romper un hash.

Tipos de hashes

Si estás leyendo esto, se supone que ya sabes lo que es un hash, hagamos un breve resumen de los diferentes algoritmos de hash que podemos encontrar.

Existen multitud de algoritmos de hash. Cada algoritmo tiene una complejidad distinta a la hora de calcularlo, lo que se traduce en que unos son más fáciles de crackear que otros.

Además, es posible combinar diferentes algoritmos, o el mismo algoritmo múltiples veces, lo que ofrece infinitas posibilidades. Este tema lo explicaremos más adelante.

Algunos algoritmos truncan la entrada a un tamaño máximo, como es el caso de descrypt a 8 caracteres y LM a 7. Además, LM también convierte las letras a mayúsculas.

Además, algunos hashes incorporan Salt, haciendo que el rendimiento se reduzca entre el número total de salts a crackear. Este salt puede ser conocido, como es el caso de los hashes de Linux md5crypt, descrypt, etc. Aunque también puede ser desconocido si no disponemos del código de la aplicación o si se encuentra en un archivo de configuración al que no tenemos acceso.

Benchmark

Hashcat nos permite hacer un benchmark para determinar la velocidad para cada tipo de hash. Los resultados no siempre son precisos, ya que hay muchos factores que influyen en esta medida, como son la limitación de potencia, el nivel de overclock y la temperatura de la GPU.

En esta tabla comparativa se observa la complejidad entre cada algoritmo utilizando hashcat y diferentes modelos de tarjeta gráfica.

Algoritmo GTX1080 GTX1080 Ti RTX2080 S RTX4090
NTLM 44 GH/s 59 GH/s 70 GH/s 288.5 GH/s
MD5 28 GH/s 35 GH/s 42 GH/s 164.1 GH/s
NetNTLMv1 24.5 GH/s 32 GH/s 38.5 GH/s 160.1 GH/s
LM 22.5 GH/s 30.5 GH/s 35,5 GH/s 151.1 GH/s
SHA1 9300 MH/s 12369 MH/s 13350 MH/s 50638.7 MH/s
SHA-256 3480 MH/s 4344 MH/s 5700 MH/s 21975.5 MH/s
NetNTLMv2 1980 MH/s 2433 MH/s 2850 MH/s 11764.8 MH/s
SHA-512 1138 MH/s 1505 MH/s 1850 MH/s 7483.4 MH/s
descrypt 950 MH/s 1320 MH/s 1420 MH/s 6276.6 MH/s
KRB 5 AS-REQ 330 MH/s 432 MH/s 480 MH/s 3599.6 MH/s
KRB 5 TGS-REP 330 MH/s 434 MH/s 482 MH/s 3478.0 MH/s
md5crypt 10500 kH/s 11996 kH/s 16750 kH/s 61283.8 kH/s
WPA / WPA2 450 kH/s 575 kH/s 645 kH/s 2533.3 kH/s
sha512crypt 155 kH/s 217 kH/s 280 kH/s 1179.6 kH/s
bcrypt 16200 H/s 21619 H/s 19480 H/s 184.0 kH/s

Hay que tener en cuenta que el benchmark es un caso ideal, y que la velocidad real suele ser inferior. En los ataques de máscara es algo inferior, y en ataques con diccionario puede disminuir hasta el 50%.

La lista de todos los hashes soportados por hashcat asi como su formato se puede encontrar en su wiki: https://hashcat.net/wiki/doku.php?id=example_hashes

Identificación del tipo de hash

Existen hashes que llevan incluido algún tipo de identificación, como por ejemplo en el archivo shadow de linux, $1$... para md5crypt o $6$... sha512crypt.

Para hashes que no tienen firma, sin más información no podemos afirmar con certeza qué algoritmo se ha utilizado. Una cadena de 32 caracteres hexadecimales podría ser LM, NTLM, MD4, MD5, MD5 doble, md5 triple, md5(sha512(pass)), etc. Si sólo tenemos una cadena hexadecimal tampoco podemos conocer si se ha utilizado un salt.

Hay herramientas que pueden ayudar a identificar hashes, como ya hemos comentado, no son totalmente fiables, pero nos ofrecen una lista con la que poder empezar a trabajar.

En Kali tenemos 2 de estas herramientas, hash-identifier y hashid.


Hashcat: Tipos de ataques

Hagamos un resumen de los diferentes modos de ataque que tiene hashcat.

Dictionary attack

  • Mode 0. Es el modo por defecto y no es necesario utilizar -a 0.

  • Se prueban todas las palabras de un diccionario.

  • Es posible combinarlo con reglas.

  • Se pueden incluir múltiples diccionarios en la misma tarea:

    hashcat hash.txt dict1.txt dict2.txt dict3.txt
    hashcat hash.txt ../my_files/*.dict
    

Combinator attack

  • Mode 1 -a 1.

  • Se combinan las palabras de 2 diccionarios.

  • En este modo la cantidad de palabras final puede ser muy elevada si se utilizan 2 diccionarios grandes.

  • Se puede utilizar una única regla tanto con el primer diccionario, como con el segundo.

    -j,  --rule-left=RULE
    -k,  --rule-right=RULE
    

Brute-force/Mask attack

  • Mode 3 -a 3.

  • Hashcat utiliza máscaras para realizar ataques de fuerza bruta.

  • Es posible utilizar archivos con múltiples máscaras.

  • Las máscaras predefinidas son:
     ?l = abcdefghijklmnopqrstuvwxyz
     ?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ
     ?d = 0123456789
     ?h = 0123456789abcdef
     ?H = 0123456789ABCDEF
     ?s = «space»!"#$%&'()*+,-./:;<=>?@[\]^_\`{|}~
     ?a = ?l?u?d?s
     ?b = 0x00 - 0xff
    
  • También es posible definir hasta 4 máscaras personalizadas
    -1 ?l?u?d
    -2 0123456789abcdef
    -3 charsets/special/Spanish/es_ISO-8859-15-special.hcchr
    -4 aeiou
    hashcat -a 3 hash.txt -1 ?l?u?d -2 ?l?u ?2?2?2?1?1?1?1
    
  • Password length increment Con el parámetro --increment o –i se puede lanzar una máscara incremental, por ejemplo ?l?l?l?l?l?l?l?l se convierte en:
     ?l
     ?l?l
     ?l?l?l
     ?l?l?l?l
     ?l?l?l?l?l
     ?l?l?l?l?l?l
     ?l?l?l?l?l?l?l
     ?l?l?l?l?l?l?l?l
    
    --increment-min Start mask incrementing at X
    --increment-max Stop mask incrementing at X
    

Hybrid attack - combining wordlists+masks


Reglas

El ataque basado en reglas es uno de los modos de ataque más complicados. La razón para esto es muy simple.

El ataque basado en reglas es como un lenguaje de programación diseñado para la generación de candidatos de contraseñas. Tiene funciones para modificar, cortar o extender palabras y tiene operadores condicionales para omitir algunos, etc.

Eso lo convierte en el ataque más flexible, preciso y eficiente.

En el apartado de metodología se hablará más detalladamente sobre este tema.

What is a keyspace?

Keyspace es el término utilizado para referirse a la cantidad de combinaciones posibles para un ataque específico. En hashcat, tiene un significado especial que no es exactamente el mismo que el significado habitual.

La salida de --keyspace está diseñada para ser utilizada en cracking distribuido, es decir, se puede usar el valor de –keyspace y dividirlo en N fragmentos y usar los parámetros -s/-l (skip/limit) para el crackeo distribuido.

Por tanto, la salida de este comando no es una representación real del número de combinaciones a realizar.

Por otro lado, conocer el número de combinaciones a realizar en cada ataque es muy importante para optimizar el tiempo que vamos a dedicar a cada tarea de cracking. Se muestra un resumen de como calcular este número para cada modo de trabajo de hashcat.

-a 0 – number of words in wordlist
-a 0 + rules – number of words in wordlist * number of rules
-a 1 – number of words of the larger word list out of the 2 word lists specified (left_wordlist, right_wordlist)
-a 3 – multiply the number of possible characters in each mask position for the base loop mask, excluding the mod loop mask
-a 6/7 – keyspace wordlist * keyspace mask

Una vez conocido el número total de combinaciones, para conocer el tiempo total de la tarea se realiza el cálculo siguiente:

tiempo total = combinaciones/potencia

Como se comentó en el apartado de benchmark, hay que tener en cuenta que la velocidad de hashcat depende del tipo de ataque.

Opciones hashcat

A continuación mostramos otras opciones de hashcat que consideramos interesantes, es muy recomendable el uso de -O -w 3 para conseguir un mayor rendimento.

username

Con el modificador --username podemos hacer que hashcat utilice el nombre de usuario en una lista de hashes.

Por ejemplo, si tenemos una lista de usuarios con su hash md5, podriamos incluirla de la siguiente forma:

patatas:49a416dd8757970b71dd363545942a7c
admin:21232f297a57a5a743894a0e4a801fc3
root:e10adc3949ba59abbe56e057f20f883e

La ventaja de esto es que una vez obtengamos los resultados sabremos inmediatamente a qué usuario pertenece cada contraseña.

optimized-kernel-enable

A partir de la versión 4 de hashcat, se ha reescrito el kernel de muchos algoritmos, permitiendo crackear contraseñas de hasta 256 caracteres. Aunque esto parece una mejora, el rendimiento de estos nuevos kernels ha disminuido.

Para utilizar el kernel optimizado hay que usar:

-O, --optimized-kernel-enable

Por ejemplo, en una tarjeta GTX1080Ti el benchmark para hashes NTLM baja de 59286 MH/s a 19465 MH/s si no se utiliza -O.

Referencia: https://hashcat.net/forum/thread-6965.html

workload profile

Si vamos a dedicar un equipo únicamente a cracking, se recomienda utilizar un valor de 3, o incluso de 4. Es conveniente hacer un benchmark con cada uno de los valores, y usar el que mejor se adapte.

-w, --workload-profile

- [ Workload Profiles ] -

  # | Performance | Runtime | Power Consumption | Desktop Impact
 ===+=============+=========+===================+=================
  1 | Low         |   2 ms  | Low               | Minimal
  2 | Default     |  12 ms  | Economic          | Noticeable
  3 | High        |  96 ms  | High              | Unresponsive
  4 | Nightmare   | 480 ms  | Insane            | Headless

Metodología

Llegamos a la parte más difícil de todas, decidir que tarea lanzar, y en que orden para conseguir los mejores resultados en el menor tiempo posible.

Brute Force

Realizar fuerza bruta con la máscara ?a de hashcat (los 95 caracteres ascii).

En principio se realiza desde 1 a 7 caracteres. Aunque si disponemos de suficiente tiempo es posible realizar también fuerza bruta con 8 caracteres.

# hashcat -a 3 ?a?a?a?a?a?a?a -i

Esta fuerza bruta no sería estrictamente necesaria si existe una política de complejidad de contraseñas en la que se obliga a un mínimo de 8 caracteres, aunque hay que tener en cuenta que puede haber contraseñas anteriores al establecimiento de esa política.

El tiempo estimado para estas máscaras se muestra en la tabla siguiente, teniendo en cuenta la potencia de diferentes tarjetas gráficas:

  2xGTX1080 2xGTX1080 RTX4090 RTX4090
Algoritmo ?a*7 ?a*8 ?a*7 ?a * 8
NTLM 13 min 21 horas 4 min 6h 20min
MD5 21 min 33 horas 7 min 11h 13min
NetNTLMv1 24 min 38 horas 7 min 11h 30min
LM 26 min* 41 horas* 8 min 12h 11min
SHA1 1 hora 4 días 22 min 36h (1.5 días)
SHA-256 3 horas 11 días 52 min 83h (3.5 días)
NetNTLMv2 5 horas 19 días 1h 38min 6.5 días
SHA-512 9 horas 34 días 2h 35min 10 días
descrypt 10 horas 40 días 3 horas 12 días
KRB 5 AS-REQ 30 horas 117 días 6 horas 21 días
KRB 5 TGS-REP 30 horas 117 días 6 horas 21 días
md5crypt 38 días 10 años 13 días 3.5 años
WPA / WPA2 3 años*   319 días* 83 años
sha512crypt 7 años   2 años 178 años
bcrypt 69 años   12 años  
Se incluye el tiempo estimado a nivel comparativo.
* LM no utiliza minusculas y se trunca a 7 carácteres.
* WPA2 requiere un minimo de 8 caracteres.

Diccionarios, calidad vs cantidad.

Aunque por internet es posible encontrar todo tipo de diccionarios, algunos de tamaño considerable, debemos establecer una estructura ordenada en nuestros diccionarios para optimizar lo mejor posible el tiempo utilizado.

El método que considero mas óptimo consiste en agrupar y eliminar duplicados. De forma que utilicemos 2 o 3 diccionarios, uno de menor tamaño con las contraseñas mas utilizadas, en el que poder aplicar gran cantidad de reglas, y otros de mayor tamaño que solo podremos utilizar sin reglas, o con un numero reducido de ellas, como best64.

En mi caso, he decidido agrupar múltiples diccionarios de tamaño reducido, entre ellos rockyou, del que se obtiene un diccionario de aproximadamente 300MB. Luego otro diccionario de aproximadamente 1GB y finalmente otro mucho más extenso de hasta 30GB.

Otro detalle importante, es tener ordenados los diccionarios de mayor a menor número de apariciones, para mantener este orden debemos eliminar los duplicados sin ordenar alfabeticamente. Podemos usar la herramienta de hashcat rli para quitar las palabras que ya aparecen en rockyou de los demás diccionarios que vamos a juntar.

Reglas

El uso de reglas es uno de los puntos fuertes de hashcat, ya que nos permite generar mutaciones en nuestro diccionarios.

Hashcat incluye diversos archivos de reglas. Podemos destacar el archivo best64 que obtiene un buen resultado con un pequeño número de reglas. Entre las transformaciones que realiza se encuentran:

  • Invertir la palabra.
  • Cambiar a mayúsculas toda la palabra.
  • Cambiar de minúsculas a mayusculas la primera letra.
  • Añadir al final de la palabra: 0, 1, 2 … 8, 9, 00, 11, … 99, 123, e, s, man, dog …
  • Añadir al principio de la palabra: the, 1

También son eficaces d3adone con 34000 reglas y dive con 99000 reglas.

Como resumen, este es el número de reglas de cada archivo.

     15 toggles1.rule
     29 leetspeak.rule
     59 combinator.rule
     77 best64.rule
    120 toggles2.rule
    211 specific.rule
    256 oscommerce.rule
    482 T0XlC-insert_space_and_special_0_F.rule
    575 toggles3.rule
   1603 T0XlC-insert_top_100_passwords_1_G.rule
   1940 toggles4.rule
   3073 unix-ninja-leetspeak.rule
   3254 InsidePro-PasswordsPro.rule
   4019 T0XlC-insert_00-99_1950-2050_toprules_0_F.rule
   4088 T0XlC.rule
   4943 toggles5.rule
   6746 InsidePro-HashManager.rule
  11934 T0XlCv1.rule
  14733 generated.rule
  15487 Incisive-leetspeak.rule
  30000 rockyou-30000.rule
  34101 d3ad0ne.rule
  65117 generated2.rule
  99092 dive.rule

Otros archivos de reglas son:

Por mi parte he creado varios archivos de reglas enfocados en las contraseñas con el formato Palabra + Número, bastante eficaz contra usuarios de dominio.

Además, para simplificar todo el proceso se pueden agrupar todos estos archivos de reglas en un único archivo. Por ejemplo, es posible unificar todas las regla que incluye hashcat en un único archivo, optimizando el proceso.

A la hora de lanzar las tareas deberemos tener en cuenta el tipo de hash y su complejidad/potencia. Por normal general empezaremos con los diccionarios pequeños con el archivo de reglas best64. En el caso de que estemos con un tipo de hash extremadamente lento, lanzaremos únicamente rockyou con best64.

Después de este proceso, se lanzan todos los diccionarios grandes, y si es posible con las reglas best64.

El siguiente paso es lanzar los diccionarios pequeños con todas las demás reglas. Proceso que tarda desde varias horas a unos pocos días.

Otra técnica interesante consiste en utilizar las reglas más de una vez, o combinarlas entre ellas. aunque esto incrementa considerablemente el tiempo total y la cantidad de memoria de la GPU utilizada.

# hashcat [hashfile] [dict] -r rules/patatas -r rules/best64
# hashcat [hashfile] [dict] -r rules/best64 -r rules/best64
Algoritmo patatawordlist-small + all hashcat rules
NTLM 31 min
MD5 49 min
NetNTLMv1 56 min*
LM 61 min
SHA1 3 horas
SHA-256 7 horas
NetNTLMv2 12 horas*
SHA-512 20 horas
descrypt 24 horas
KRB 5 AS-REQ 69 horas
KRB 5 TGS-REP 69 horas
md5crypt 91 días
WPA / WPA2 5 años
sha512crypt 17 años
bcrypt 161 años
* Por cada salt

Máscaras

Las máscaras se utilizan cuando no es viable realizar fuerza bruta a una determinada longitud. Por lo que si el tiempo lo permite es recomendable realizar fuerza bruta. Y reservar las máscaras para longitudes superiores.

Hashcat incluye varios archivos de máscaras basados en el diccionario rockyou, el inconveniente es que incluye máscaras de todos los tamaños. Por lo que recomiendo eliminar todas las máscaras de una longitud de 7 caracteres o menor, ya que estas longitudes pueden ser exploradas por fuerza bruta.

egrep '^.{14,}$' rockyou-7-2592000.hcmask > rockyou-7chrs.hcmask
egrep '^.{16,}$' rockyou-7-2592000.hcmask > rockyou-8chrs.hcmask
egrep '^.{18,}$' rockyou-7-2592000.hcmask > rockyou-9chrs.hcmask

Realimentación

Es recomendable utilizar la información obtenida de las contraseñas crackeadas y lanzar un ataque de diccionario+reglas con estas, ademas de incluir estas contraseñas en los diccionarios para posteriores trabajos.

Hate Crack

Hate Crack es una herramienta para realizar cracking automatizado utilizando hashcat. Entre sus opciones se incluye la opción de lanzar automáticamente una metodología muy similar a la presentada anteriormente.

Extensive Pure_Hate Methodology Crack

  • Brute Force Attack (7 characters)
  • Dictionary Attack
    • All wordlists in “hcatOptimizedWordlists” with “best64.rule”
    • wordlists/rockyou.txt with “d3ad0ne.rule”
    • wordlists/rockyou.txt with “T0XlC.rule”
  • Top Mask Attack (Target Time = 4 Hours)
  • Fingerprint Attack
  • Combinator Attack
  • Hybrid Attack
  • Extra - Just For Good Measure
    • Runs a dictionary attack using wordlists/rockyou.txt with chained “combinator.rule” and “InsidePro-PasswordsPro.rule” rules

Patatawordlist + Patatarules

Webs de Cracking online

Referencias

Categorías:

Actualizado: