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
-
mode 6 / 7
- Se combina un diccionario con una máscara. Dependiendo del orden se usa el modo 6 o el 7.
-a 6 example.dict ?d?d?d?d -a 7 ?d?d?d?d example.dict
- https://hashcat.net/wiki/doku.php?id=hybrid_atttack_with_rules
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
-
https://www.onlinehashcrack.com (De pago, a los 6 meses te muestra gratis los passwords)