Hashcat es una conocida herramienta de cracking de contraseñas para Linux, Windows y macOS. De 2009 a 2015 era software propietario, pero desde entonces se ha publicado como código abierto. Gracias a su excelente compatibilidad con GPU, permite descifrar una gran variedad de hashes. Al igual que John, Hashcat admite múltiples modos de ataque (cracking) que permiten atacar hashes de contraseñas de forma eficiente.
La sintaxis general utilizada para ejecutar hashcat es la siguiente:
<hashes> es una cadena hash o un archivo que contiene uno o más hashes de contraseña del mismo tipo
[wordlist, rule, mask, ...] es un marcador de posición para argumentos adicionales que dependen del modo de ataque
Tipos de hash
Hashcat admite cientos de tipos de hash diferentes, cada uno con un ID asignado. Se puede generar una lista de ID asociados ejecutando hashcat --help.
afsh4ck@kali$ hashcat --help
...SNIP...
- [ Hash modes ] -
# | Name | Category
======+============================================================+======================================
900 | MD4 | Raw Hash
0 | MD5 | Raw Hash
100 | SHA1 | Raw Hash
1300 | SHA2-224 | Raw Hash
1400 | SHA2-256 | Raw Hash
10800 | SHA2-384 | Raw Hash
1700 | SHA2-512 | Raw Hash
17300 | SHA3-224 | Raw Hash
17400 | SHA3-256 | Raw Hash
17500 | SHA3-384 | Raw Hash
17600 | SHA3-512 | Raw Hash
6000 | RIPEMD-160 | Raw Hash
600 | BLAKE2b-512 | Raw Hash
11700 | GOST R 34.11-2012 (Streebog) 256-bit, big-endian | Raw Hash
11800 | GOST R 34.11-2012 (Streebog) 512-bit, big-endian | Raw Hash
6900 | GOST R 34.11-94 | Raw Hash
17010 | GPG (AES-128/AES-256 (SHA-1($pass))) | Raw Hash
5100 | Half MD5 | Raw Hash
17700 | Keccak-224 | Raw Hash
17800 | Keccak-256 | Raw Hash
17900 | Keccak-384 | Raw Hash
18000 | Keccak-512 | Raw Hash
6100 | Whirlpool | Raw Hash
10100 | SipHash | Raw Hash
70 | md5(utf16le($pass)) | Raw Hash
170 | sha1(utf16le($pass)) | Raw Hash
1470 | sha256(utf16le($pass)) | Raw Hash
...SNIP...
El sitio web hashcat alberga una lista completa de hashes de ejemplo que pueden ayudar a identificar manualmente un tipo de hash desconocido y determinar el identificador del modo hash Hashcat correspondiente.
Alternativamente, se puede utilizar hashID para identificar rápidamente el tipo de hash hashcat especificando la flag -m
Hashcat tiene muchos modos de ataque diferentes, incluyendo dictionary, mask, combinator y association. En esta sección, repasaremos los dos primeros, ya que probablemente sean los más comunes que necesitarás usar.
Ataque de diccionario
El ataque de diccionario (-a 0) es, como su nombre indica, un ataque de diccionario. El usuario proporciona hashes de contraseñas y una lista de palabras como entrada, y Hashcat prueba cada palabra de la lista como una posible contraseña hasta encontrar la correcta o hasta agotar la lista.
Por ejemplo, imaginemos que extrajimos el siguiente hash de contraseña de una base de datos SQL: e3e3ec5831ad5e7288241960e5d4fdb8. Primero, podríamos identificarlo como un hash MD5, cuyo ID de hash es 0. Para intentar descifrar este hash usando la wordlist rockyou.txt, se usaría el siguiente comando:
Una lista de palabras por sí sola no suele ser suficiente para descifrar el hash de una contraseña. Como en el caso de John, se puede usar rules para realizar modificaciones específicas en las contraseñas y generar aún más intentos. Los archivos de reglas que vienen con hashcat se encuentran generalmente en /usr/share/hashcat/rules:
Como otro ejemplo, imaginemos que se filtró un hash MD5 adicional de la base de datos SQL: 1b0556a75770563578569ae21392630c. No pudimos descifrarlo usando rockyou.txt , así que, en un intento posterior, podríamos aplicar algunas transformaciones comunes basadas en reglas. Un conjunto de reglas que podríamos probar es best64.rule, que contiene 64 modificaciones estándar de contraseñas, como añadir números o sustituir caracteres por sus equivalentes "leet". Para realizar este tipo de ataque, añadiríamos la opción -r <ruleset> al comando, como se muestra a continuación:
El ataque de máscara (-a 3) es un tipo de ataque de fuerza bruta en el que el espacio de claves lo define explícitamente el usuario. Por ejemplo, si sabemos que una contraseña tiene ocho caracteres, en lugar de probar todas las combinaciones posibles, podríamos definir una máscara que pruebe combinaciones de seis letras seguidas de dos números.
Una máscara se define combinando una secuencia de símbolos, cada uno de los cuales representa un conjunto de caracteres integrado o personalizado. Hashcat incluye varios conjuntos de caracteres integrados:
Símbolo
Charset
?l
abcdefghijklmnopqrstuvwxyz
?u
ABCDEFGHIJKLMNOPQRSTUVWXYZ
?d
0123456789
?h
0123456789abcdef
?H
0123456789ABCDEF
?s
«space»!"#$%&'()*+,-./:;<=>?@[]^_`{
?a
?l?u?d?s
?b
0x00 - 0xff
Los conjuntos de caracteres personalizados se pueden definir con los argumentos -1, -2, -3, y -4, y luego hacer referencia a ellos con ?1, ?2, ?3, y ?4.
Supongamos que queremos probar contraseñas que empiezan con una letra mayúscula, continúan con cuatro letras minúsculas, un dígito y finalmente un símbolo. La máscara hashcat resultante sería ?u?l?l?l?l?d?s.