cracking passwords
Password overview
Las contraseñas o passwords son una forma de autenticación que hace uso de un secreto que solo nosotros sabemos (el password) para acreditar nuestra identidad.
Este método de autenticación se remonta a la antigüedad y hoy en día es el método más extendido entre los sistemas informáticos. Aunque como veremos a lo largo del post, este método por sí solo no es un método de autenticación robusto y es muy recomendable complementarlo con otras medidas de seguridad.

Solo como elemplo, ya que no es el objeto de este post, en la actualidad existen varios métodos para autenticarse en un sistema informático:
. Algo que sé - básicamente contraseñas.
. Algo que tengo - tarjetas de identificación como PKI, DNI electrónico, tokens, …
. Algo que soy - datos biométricos, como la huella dactilar, biométrica facial, …
Para que podamos decir que un sistema de autenticación es robusto se tendrían que combinar al menos dos de las tres opciones mencionas anteriormente.
Obtención de credenciales
Antes de romper o crackear un password es posible que nos sea más simple obtenerlo, ya sea de alguna fuente pública, de algún data leak, mediante phishing, realizando un man in the middle en el caso de una red local o abusando de alguna mala configuración o protocolo.
Idealmente los servicios de autenticación dispondrán de métodos de seguridad que protejan la información, o sea, la contraseña. Dependiendo de la implementación y del entorno podremos obtener la contraseña en texto plano o en formato cifrado, es decir el hash.
Data leaks
Existen muchas bases de datos donde se han almacenado las credenciales obtenidas en diferentes brechas de seguridad. Algunas de ellas pueden ser obtenidas gratuitamente, y aunque puede que los passwords que nos proporcione no estén actualizados, la información no deja de ser valiosísima ya que muchos usuarios usan patrones para la generación de sus passwords.
Existen servicios, como haveibeenpwned donde podemos verificar si nuestras cuentas han sido comprometidas y que información se ha filtrado con ellas. Muy recomendable verificar, aunque sea de vez en cuando, nuestras cuentas.
Es posible descargar algunas de las bases de datos donde se almacenan las contraseñas que han sido comprometidas desde hace años. un ejemplo fácil de obtener es Collection #1 con sus casi 90 Gb de credenciales y 21 millones de passwords únicos es una de las bases de datos más pequeñas. Según la información publicada en la wiki anterior juntando diferentes bases de datos es posible obtener hasta 500 Gb de credenciales.
Para facilitar su consulta publico, aquí un microservicio que creé en su momento en el que podréis consultar tanto vuestros correos electrónicos como realizar búsquedas por dominio, puede ser muy útil para crear diccionarios personalizados o evaluar la complejidad de las contraseñas de vuestras organizaciones.
Default passwords
Puede que parezca absurdo, pero una de las formas más habituales de comprometer servicios es el de las credenciales por defecto. Poco a poco los fabricantes empiezan a crear procesos para no tener que hacer uso de ellas, pero todavía es una práctica habitual. Podéis ver algún ejemplo en la categoría de shodan default passwords.
Gessing passwords
Si no hemos podido obtener la contraseña nos tocará crackearla. Existen distintos métodos para el cracking de contraseñas, dependiendo del tipo de servicio o contraseña estas se tendrán que romper online, directamente contra el servicio publicado, como puede ser el protocolo WEP de las redes wifi o como el password de un servicio ssh. Este método suele ser lento y muy ruidoso, facilitando que seamos detectados durante el proceso. Siempre que podamos intentaremos realizar la operación offline, ya sea por fuerza bruta, diccionario o rainbow tables la velocidad dependerá de nuestro hardware y de la información que hayamos podido obtener previamente. Dicho de otro modo, la velocidad del crackeo dependerá de la inversión que realicemos.
Online
Existen distintos sistemas para la obtención de contraseñas de servicios online, en este caso pondremos como ejemplo la obtención de una credencial ssh, sistema para la administración de equipos de forma remota, pero con la misma técnica y herramientas es aplicable a muchísimos servicios. Podéis visitar el github de hydra para ver algunos ejemplos más e insisto en que esta es una herramienta conocida y fácil de usar, pero no es la única, existen muchas especificas según el servicio. No es la única técnica, pero sirve para ilustrar el proceso.

Como ya he indicado usaremos un clásico de las herramientas de pentest, hydra y atacaremos un servicio ssh publicado en un equipo de laboratorio. Importante: el uso de estas técnicas, contra sistemas que no nos pertenecen, no es licita y nos puede ocasionar problemas legales.
En el primer caso verificamos si usuario y password son admin.
1 | ~:$ hydra -l admin -p admin 192.168.1.10 -t 4 ssh |
En este ejemplo hydra nos indica que hemos acertado el usuario y password, pero en la vida real no nos resultara tan fácil, por lo que tendremos que hacer uso de otros recursos.
Uno de ellos son los diccionarios. El diccionario que empleemos será determinante en el tiempo de obtención del password. Estos pueden ser diccionarios conocidos, como es el caso de rockyou o uno personalizado que hayamos podido crear con información obtenida previamente.
1 | ~:$ hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.1.10 -t 4 ssh |
En el siguiente ejemplo generamos un pequeño diccionario con contraseñas de solo 4 caracteres y con unas pocas letras, las justas para conseguir nuestro objetivo.
En un caso real buscaríamos información de nuestro objetivo, passwords usados anteriormente en sus cuentas, información de redes sociales, página web, políticas de passwords de la empresa, etc. para poder crear un diccionario que con un menor tamaño pueda ofrecernos una gran efectividad.
1 | ~:$ crunch 5 5 adimn -o new-dic.txt |
Posteriormente lo usaremos como en el ejemplo anterior.
Hash
Antes de continuar, es importante destacar las características básicas de los hashes, el hash realmente es una función de resumen, tiene como entrada una o más cadenas y se obtiene una salida de tamaño fijo.
Una de las características de este tipo de operaciones matemáticas es que no se pueden revertir, es decir que desde la clave obtenida, el hash no es posible regenerar la cadena original. Es por eso por lo que se emplean para almacenar nuestras contraseñas.
¿Y como podemos entonces crackear las contraseñas a partir de un hash como se mostrará a continuación? Pues aunque como veremos hay varias técnicas, todas se basan en el mismo proceso. Dado que la operación que se realiza si que es conocida, se aplica a una entrada “posible contraseña”, se genera el hash y se compara con el que queremos obtener. Por eso es más correcto decir password gessing en lugar de password cracking, ya que al final no es que estemos rompiendo el protocolo de cifrado, sino que estamos adivinando la contraseña.
Offline
Como se ha comentado anteriormente es mucho más efectivo, si tenemos la posibilidad, realizar la acción de crackear el password de forma offline. Para ello tendremos que obtener el hash de la contraseña, este proceso dependerá del servicio con el que estemos trabajando y no es el objeto de este post.

Para el cracking de contraseñas offline la herramienta más usada es hashcat, que trabaja tanto con CPU como con GPU (tarjeta gráfica) que en muchos de estos retos es mucho más eficiente. Propongo este benchmarking donde se muestra la cantidad de contraseñas que se pueden probar por segundo según protocolo y modelo de tarjeta gráfica.
Diccionarios
Igual que en los ejemplos anteriores el uso de un diccionario optimizado nos ayudara a ser más eficientes en la obtención de la credencial. Por ello recomiendo también el uso de las rules como es el caso de las nsa-rules que aplican distintos cambios en cada una de las entradas de nuestro diccionario ampliando las posibilidades de éxito, aunque también el tiempo de ejecución.
A continuación, dos ejemplos. Primer ejemplo: Ejecutaremos hashcat contra el mismo hash NTML (usado por Microsoft Windows para almacenar y compartir nuestras credenciales) con y sin rules y usando el diccionario rockyou.
1 | ~:$ ./hashcat64.bin -a 0 -m 1000 ../passwords/ntml-test.txt ../passwords/rockyou.txt |
Como podemos observar, en esta primera ejecución no hemos obtenido el password, vemos que el Status nos marca Exhausted, que significa que he recorrido todo el diccionario y que en Recovered nos indica que no ha recuperado ninguna contraseña.
Segundo ejemplo: Ejecutaremos de nuevo hashcat contra el mismo hash, esta vez aplicando las rules, en este caso las que vienen con hashcat best64.
1 | ~:$ ./hashcat64.bin -a 0 -m 1000 ../passwords/ntml-test.txt ../passwords/rockyou.txt -r rules/best64.rule |
En este el Status es Cracked y vemos que en Recovered nos indica que ha recuperado la contraseña.
Otra diferencia muy interesante es ver que, con el mismo diccionario, que en este caso tiene 14344384 palabras aplicando las rules hemos obtenido 1104517568 palabras.
También me parece relevante destacar que, en este caso, con un equipo portátil hemos obtenido la contraseña en 6 segundos, la contraseña es hashcat, como vemos no es un password complejo y es por ello por lo que nos ha resultado tan fácil obtenerlo. Por este motivo se insiste siempre en crear contraseñas de cierta complejidad, que requieran cierto esfuerzo para crackearlas.
Bruteforce
Este diría que es el último recurso del que podemos disponer, cuando no hay diccionario posible o ya hemos consumido sin éxito los que tenemos, podemos realizar ataques de fuerza bruta, que quiere decir que probaremos todas las combinaciones posibles. Aunque, si disponemos de alguna información siempre nos será de ayuda, porque tal y como veremos en el caso de la fuerza bruta los tiempos de crackeo suelen ser muy largos.
1 | ~:$ ./hashcat64.bin -a 3 -m 1000 ../passwords/ntml-test.txt ?l?l?l?l?l?l?l |
En este caso, siendo un ejemplo simple y conociendo la longitud hemos conseguido adivinar el password de nuevo, pero no siempre tendremos el viento a favor.
Soy consciente de que no se ha profundizado en las técnicas mostradas en el post, pero espero haber arrojado la suficiente luz sobre las distintas temáticas para que cada uno pueda profundizar en ellas.
No quiero terminar sin aportar una pequeña recomendación. Como hemos podido observar no es complejo obtener las credenciales de nuestros sistemas, por lo que el uso de un segundo factor de autenticación, un gestor de contraseñas para que podamos establecer una distinta para cada servicio que dispongamos o el uso de strong authentication como pueden ser sistemas biométricos, tarjetas PKI, etc … serán siempre una buena opción.
Hasta aquí el post de hoy. Espero haya sido de vuestro interés.
No dudéis en contactar mediante el formulario para hacerme llegar vuestros comentarios.