Introducción:

En un mundo cada vez más digital, la seguridad informática es una prioridad tanto para empresas como para usuarios individuales. A medida que las amenazas cibernéticas se vuelven más sofisticadas, es fundamental contar con herramientas que ayuden a proteger nuestros sistemas. Existen diversas soluciones diseñadas específicamente para detectar, prevenir y mitigar riesgos en los entornos digitales, ayudando a mantener una infraestructura segura y confiable.

Entre estas herramientas destacan los escáneres de vulnerabilidades, que nos permiten identificar fallos de seguridad antes de que puedan ser explotados. Los sistemas de detección de intrusos ayudan a monitorear el tráfico de red y alertan sobre posibles ataques. Además, la comprobación de integridad de ficheros garantiza que nuestros archivos no han sido modificados por agentes maliciosos. Por último, las herramientas que analizan la fortaleza de las contraseñas contribuyen a prevenir accesos no autorizados a nuestros sistemas.

Objetivo:

En este artículo, veremos la instalación, configuración y prueba de uso de dos herramientas de comprobación de fortaleza de contraseñas: John the Ripper e Hydra.

¿Qué es John The Ripper?

img

Destaca como uno de los programas más conocidos y ampliamente utilizados para descifrar contraseñas en sistemas operativos como Windows, Linux y MacOS. Este software de código abierto, se especializa en descifrar contraseñas mediante dos enfoques principales: fuerza bruta y diccionario.

La eficiencia de este programa para descifrar los hashes de contraseñas es notablemente rápida, siendo su velocidad dependiente de la potencia del procesador del dispositivo. Esta herramienta, escrita en C , tiene como propósito principal evaluar la resistencia de las contraseñas ante ataques de fuerza bruta. Con la capacidad de descifrar hashes como MD5, SHA-1 y otros ampliamente utilizados.

Una característica es su capacidad automática para identificar el tipo de hash, simplificando el proceso de descifrado para el usuario, eliminando la preocupación por el tipo específico de hash que se está intentando romper.

John the Ripper destaca por su adaptabilidad , optimizado para diversos modelos de procesadores y compatible con varias arquitecturas de PC y sistemas operativos. Aunque es funcional en diversos entornos, encuentra su principal aplicación en sistemas operativos basados en Linux, siendo incorporado de forma predeterminada en las principales distribuciones orientadas a pruebas de penetración y seguridad informática como “Kali Linux”.

Permite definir la longitud a probar de una contraseña, generando todas las combinaciones posibles para alcanzar el objetivo de descifrar el hash. Asimismo, ofrece la configuración de rangos de letras, números o símbolos para probar la contraseña, junto con la posibilidad de incluir reglas para guiar las variaciones.

John the Ripper brinda flexibilidad al permitir pausar y reanudar el proceso de descifrado, para situaciones en las que es necesario apagar el equipo o servidor. Además, puede automatizarse para iniciar el descifrado de contraseñas específicas al arrancar el ordenador, sin requerir intervención del administrador de sistemas.

Entre sus usos, su aplicación en la administración de contraseñas, emplea para evitar que los usuarios establezcan contraseñas con bajos niveles de seguridad.

Diferencia entre versiones.

En la actualidad, existen tres variantes de este software:

  • John The Ripper (la versión gratuita).

  • John the Ripper Pro

  • John The Ripper Jumbo.

Este software es de código abierto y se distribuye bajo la licencia GPL, lo que permite el uso de algunas partes con otras licencias, mientras que otras están en el dominio público. Aunque inicialmente fue diseñado para sistemas Unix, en la actualidad es compatible con alrededor de 15 sistemas operativos diferentes, incluyendo once tipos de Unix, MS-DOS, Windows, BeOS y OpenVMS. Sin embargo, su presencia más común se encuentra en las distribuciones de Linux.

En cuanto a la versión Pro, ofrece ventajas como detectar automáticamente cualquier mejora en la tecnología compatible con el procesador de la máquina en la que está instalado. Además, proporciona un diccionario con más de 4 millones de entradas, donde las mejoras se detectan de forma automática, ahorrando tiempo al evitar la necesidad de realizar actualizaciones manuales.

Por último, John the Ripper Jumbo es un parche que amplía la capacidad para trabajar con una mayor variedad de algoritmos. Al ser una versión en desarrollo, algunas de sus funciones pueden no estar completamente optimizadas, lo que podría llevar a inconvenientes ocasionales.

Esta herramienta realiza pruebas de fortaleza de contraseñas en un sistema, siguiendo un proceso estructurado para llevar a cabo estas tareas:

  1. Recopilación de Contraseñas: El primer paso implica recopilar las contraseñas cifradas o en formato hash dentro del sistema. Este proceso puede involucrar la obtención de archivos de contraseñas, bases de datos, registros, entre otros métodos.
  2. Selección del Ataque: Con la base de datos de contraseñas disponible, se elige el modo de ataque más adecuado según el caso. Esta elección se basa en la información disponible sobre las contraseñas y el tiempo disponible para descifrarlas.
  3. Diccionario de Contraseñas: Se utiliza un diccionario de contraseñas para el descifrado. Este diccionario puede obtenerse de diversas formas, siendo común incluir palabras clave, nombres propios y términos ampliamente utilizados.
  4. Fuerza Bruta: Si el método de ataque seleccionado no tiene éxito, se recurre a la fuerza bruta para descifrar las contraseñas, es decir, probar y probar hasta encontrar la contraseña correcta. En este paso, se realizan pruebas con diferentes combinaciones de caracteres hasta lograr una coincidencia exacta con la contraseña.
  5. Hashcat: En caso de que las contraseñas estén protegidas por funciones hash muy fuertes, la herramienta utiliza hashcat para intentar descifrarlas. Esta herramienta aprovecha la potencia de procesamiento de la GPU para acelerar el proceso.
  6. Descifrado: Una vez localizada la coincidencia de la contraseña, se procede al descifrado y se muestra al usuario.

Este proceso demuestra la metodología utilizada por la herramienta para evaluar y, en última instancia, descifrar contraseñas dentro de un sistema.

Instalación:

Para poder instalar la versión gratuita de esta herramienta en un equipo Debian, hay diferentes formas, como descargarla desde su web, compilandolo para otras distribuciones o simplemente desde la terminal que es el caso que se va a realizar a continuación:

sudo apt install john

Con la herramienta instalada, uno de los primeros pasos a comprobar es que rendimiento tiene en mi ordenador, por lo que, para hacer una prueba es con el comando:

john --test

Con el cual se mide la potencia de procesamiento del procesador, lo que a su vez significa la velocidad que tardará en hacer determinadas tareas.

Al introducir el comando “john” devuelve los parámetros que se pueden usar, que van variando dependiendo de la versión que tengamos de la herramienta.

| Opción               | Descripción                                                   |
|-----------------------|---------------------------------------------------------------|
| --single              | Modo "single crack"                                           |
| --wordlist=FILE       | Modo "wordlist", leer palabras desde FILE o stdin              |
| --rules               | Habilitar reglas de manipulación de palabras para el modo wordlist |
| --incremental[=MODE]  | Modo "incremental" [usando la sección MODE]                    |
| --external=MODE       | Modo externo o filtro de palabras                              |
| --stdout[=LENGTH]     | Solo mostrar contraseñas candidatas [cortar en LENGTH]         |
| --restore[=NAME]      | Restaurar una sesión interrumpida [llamada NAME]               |
| --session=NAME        | Darle un nombre a una nueva sesión                              |
| --status[=NAME]       | Imprimir el estado de una sesión [llamada NAME]                |
| --make-charset=FILE   | Crear un conjunto de caracteres, FILE será sobrescrito         |
| --show                | Mostrar contraseñas crackeadas                                 |
| --test[=TIME]         | Ejecutar pruebas y benchmarks durante TIME segundos            |
| --users               | [No] cargar solo este (estos) usuario(s)                       |
| --groups              | Cargar [no] usuarios de este (estos) grupo(s)                  |
| --shells              | Cargar usuarios con [sin] esta (estas) shell(s)                |
| --salts               | Cargar sales con [sin] al menos N contraseñas                  |
| --save-memory=LEVEL   | Habilitar ahorro de memoria, en Niveles 1..3                    |
| --node=MIN[-MAX]/TOTAL| Rango del número de este nodo fuera del recuento TOTAL         |
| --fork=N              | Bifurcar N procesos                                            |
| --format=NAME         | Forzar tipo de hash NAME: descrypt/bsdicrypt/md5crypt/bcrypt/LM/AFS/tripcode/dummy/crypt |

Archivos de configuración:

/etc/john/john.conf → archivo de configuración.
/root/.john/john.pot → archivo donde se almacenan las contraseñas vulneradas.
John.rec → archivo donde se almacena el estado, para poder continuar cualquier operación incluso
si se podrucen cortes. (Se actualiza cada 10 minutos)

Si se ejecuta el comando john sin opciones, este por defecto ejecutará los modos configurados en el primer fichero john.conf que encuentre, el cual busca en:

~/.john
/etc/john
/usr/share/john

Este proceso consiste en lo siguiente:

  • Comienza con el modo single crack, aplicando las reglas especificadas en dicha sección a las palabras que obtiene de la información de /etc/passwd.

  • Ejecuta el modo wordlist (diccionarios), aplicando sus reglas a cada una de las palabras del fichero que indique la variable Wordlist. Si dicha variable no contiene ningún valor, usa el fichero /usr/share/john/password.lst.

  • Aplica el modo incremental de nombre ASCII, y si no estuviera definido, muestra un mensaje de error.

Sintaxis:

Se tiene en cuenta la distinción entre mayúsculas y minúsculas. Por ejemplo:

  • --single es correcto, --Single incorrecto.

Se pueden abreviar las opciones tanto como se quiera, siempre que no haya ambigüedad con otra opción. Por ejemplo:

  • --single y --si es lo mismo y correcto, -s es incorrecto.

Pueden ir con un guión o con dos. Por ejemplo:

  • --single y -single es lo mismo y correcto.

Los argumentos de las opciones se pueden separar con : o con =. Por ejemplo:

  • -w:palabras.lst y -w=palabras.lst es lo mismo y correcto.

La opción --single[=SECCIÓN] se utiliza para lanzar solo el modo single crack. Si no se especifica ninguna sección se utilizan las reglas de la sección [List.Rules:Single].

Ataques de Diccionario:

Al obtener uno o varios diccionarios de contraseñas, la herramienta se encargará de evaluar exhaustivamente cada una de estas claves en un intento por descifrar el hash asociado a la contraseña.

El procedimiento implica la generación del hash para cada contraseña, seguido de la comparación con el hash objetivo que buscamos romper. Si los hashes coinciden, hemos descifrado la contraseña, de lo contrario, debemos continuar con la prueba.

Este proceso de descifrado puede llevarse a cabo de manera completamente automatizada para todas las contraseñas presentes en los diccionarios de claves.

Un elemento notable es que la herramienta no se limita únicamente a probar las claves directamente de los diccionarios sino que también incorpora números, letras mayúsculas, minúsculas y símbolos a las palabras ingresadas. Además, tiene la capacidad de combinar palabras para explorar aún más combinaciones de contraseñas y descubrir la clave utilizada.

John va a necesitar 2 archivos, el diccionario y el archivo con el hash que contiene los hashes.

1. Ataque Básico:

Opción: --wordlist=rutadiccionario

Ejemplo:

john --wordlist=/rutadiccionario.txt archivohash

2. Incluir Reglas Adicionales:

Opción: --rules

Ejemplo:

john --wordlist=diccionario.txt --rules archivohasheado

3. Fuerza Bruta con Caracteres Específicos (más en su sección):

Opción: --incremental=modo

Ejemplo:

john --incremental=ascii archivohasheado

4. Ataque por Defecto (Wordlist + Reglas):

Opción: --pot=archivo

Ejemplo:

john --wordlist=diccionario.txt --rules --pot=hashes.pot archivohasheado

5. Ataque a Contraseñas de Longitud Específica:

Opción: --min-length=n --max-length=m

Ejemplo:

john --wordlist=diccionario.txt --min-length=6 --max-length=8 archivohasheado

6. Uso de Formatos Específicos:

Opción: --format=formato

Ejemplo:

john --wordlist=diccionario.txt --format=md5 archivohasheado

7. Diccionarios por defecto:

John The Ripper (por norma general aunque se puede especificar la ruta) guarda en /usr/share/john los diccionarios por defecto. En mi caso con la versión estandar en Debian al hacer un ls de esa ruta me devuelve este contenido:

img

img

Los archivos de caracteres (*.chr) son utilizados por John the Ripper para generar posibles contraseñas durante un ataque de fuerza bruta. Cada archivo representa un conjunto específico de caracteres que puede contener una contraseña.

El diccionario password.lst es un diccionario común que contiene palabras y contraseñas conocidas. Puedes usar este diccionario para realizar ataques de diccionario durante pruebas de seguridad.

Aunque uno de los más famosos es el diccionario Rockyou, el cual actualmente, cuenta con su versión 2024 (pero NO viene incluido por defecto).

8. Reglas de Diccionarios de John:

Sintaxis de Reglas de Wordlist para John the Ripper

Las reglas de wordlist se utilizan para generar wordlists personalizadas basadas en patrones y transformaciones especificadas.

Las reglas consisten en banderas de rechazo, constantes y variables numéricas, clases de caracteres, comandos simples, comandos de cadena, comandos de control de longitud, comandos de gramática inglesa, comandos de inserción/eliminación, comandos de conversión de conjunto de caracteres, comandos de acceso a memoria, comandos numéricos, comandos de clases de caracteres y comandos adicionales para el modo “single crack”.

Banderas de Rechazo de Reglas:

-: No realiza ninguna acción; sin rechazo.
-c: Rechaza a menos que el tipo de hash actual sea sensible a mayúsculas y minúsculas.
-8: Rechaza a menos que el tipo de hash actual utilice caracteres de 8 bits.
-s: Rechaza a menos que algunas contraseñas hayan sido divididas al cargar.
-p: Rechaza a menos que los comandos de pares de palabras estén permitidos actualmente.

Constantes y Variables Numéricas:

0...9: Representando de 0 a 9.
A...Z: Representando de 10 a 35.
*: Para max_length (longitud máxima).
-: Para (max_length - 1).
+: Para (max_length + 1).
a...k: Variables numéricas definidas por el usuario.
l: Longitud inicial o actual de la palabra.
m: Posición inicial o recordada del último carácter de la palabra.
p: Posición del último carácter encontrado con los comandos "/" o "%".
z: Posición o longitud "infinita" (más allá del final de la palabra).

Clases de Caracteres:

??: Coincide con "?".
?v: Coincide con vocales: "aeiouAEIOU".
?c: Coincide con consonantes: "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ".
?w: Coincide con espacios en blanco: espacio y tabulación horizontal.
?p: Coincide con puntuación: ".,:;'?!`" y comillas dobles.
?s: Coincide con símbolos "$%^&*()-_+=|<>[]{}#@/~".
?l: Coincide con letras minúsculas [a-z].
?u: Coincide con letras mayúsculas [A-Z].
?d: Coincide con dígitos [0-9].
?a: Coincide con letras [a-zA-Z].
?x: Coincide con letras y dígitos [a-zA-Z0-9].
?z: Coincide con todos los caracteres.

Comandos Simples:

: (dos puntos): No realiza ninguna acción (no-op).
l: Convertir a minúsculas.
u: Convertir a mayúsculas.
c: Capitalizar.
C: Minúsculas para el primer carácter y mayúsculas para el resto.
t: Cambiar mayúsculas y minúsculas en toda la palabra.
TN: Cambiar mayúsculas y minúsculas del carácter en posición N.
r: Invertir la palabra.
d: Duplicar la palabra.
f: Reflejar la palabra.
{: Rotar la palabra a la izquierda.
}: Rotar la palabra a la derecha.
$X: Agregar el carácter X a la palabra.
^X: Prefijar la palabra con el carácter X.

Comandos de Control de Longitud:

<N: Rechazar la palabra a menos que tenga menos de N caracteres.
>N: Rechazar la palabra a menos que tenga más de N caracteres.
'N: Truncar la palabra a una longitud de N.

9. Ejemplos de usos varios:

Ejemplo 1: Aplicar una Regla a un Wordlist Existente:

Por ejemplo, con un wordlist llamado passwords.txt , quiero aplicar la regla de duplicar cada palabra.

john --wordlist=passwords.txt --rules=:d

Ejemplo 2: Crear un Wordlist con Transformaciones:

Por ejemplo, generar un wordlist que contenga todas las combinaciones de una palabra en minúsculas, mayúsculas y con un dígito al final.

john --wordlist=wordlistviejo.txt --rules=:l$[0-9]

Ejemplo 3: Fuerza Bruta con Variaciones de Longitud:

Por ejemplo, probar todas las combinaciones de una palabra con longitudes diferentes.

john --incremental=Digits

Ejemplo 4: Integración de un Filtro Externo:

Por ejemplo, para añadirle al ataque archivo llamado filtro.txt con palabras específicas.

john --wordlist=passwords.txt --external=filtro.txt

Generación de diccionarios con Crunch:

img

Crunch es una herramienta que nos permite generar palabras para un diccionario basándose en los parámetros que le especifiquemos. Genera listas de palabras basadas en patrones y reglas específicas para la creación de diccionarios que luego se utilizarán en diversos ataques de diccionario. En pocas palabras, genera diccionarios personalizados siguiendo las reglas que se le ordene.

Instalación:

sudo apt install crunch

En el uso de crunch se necesitan al menos 3 parámetros:

crunch 2 7 -o /tmp/diccionario.lst
  • Primer parámetro: cantidad mínima de caracteres.
  • Segundo parámetro: cantidad máxima de caracteres.
  • -o: Donde se guardara la salida del comando.

Ejemplos de uso:

Diccionario de 14 caracteres que incluye letras mayúsculas, la palabra Palabra, números de tres dígitos y el carácter ‘0’.

crunch 14 14 -o diccionario.txt -t @@Palabra%03d0

img

img

  • -t @@Palabra%03d0: Aquí, @@ se reemplazará por letras en mayúsculas, Palabra permanecerá como está, %03d generará números de tres dígitos y 0 al final será constante.

Diccionario con palabras de 8 caracteres que consisten en letras minúsculas, números y los caracteres especiales !, %, ^, 1, 2, 3, y 4.`

crunch 8 8 -o diccionario.txt -t @%\!^1234

img

img

Diccionario con palabras de 5 caracteres combinando las letras a, b, c, d, y los números 1, 2, 3, 4.

crunch 5 5 -o diccionario.txt -p abcd1234

img

img

Fuerza Bruta o modo incremental:

El modo de fuerza bruta o incremental en John the Ripper consiste en probar todas las combinaciones posibles de contraseñas hasta encontrar la correcta. Este método puede ser efectivo, pero también es intensivo en recursos y lleva tiempo. Algunas de las opciones de john (base) son:

| Opción                   | Descripción                                                   |
|---------------------------|---------------------------------------------------------------|
| --incremental[=MODE]      | Modo "incremental" para fuerza bruta. Eespecificar el modo (por ejemplo, `--incremental=Digits` para dígitos). |
| --external=MODE           | Modo externo o filtro de palabras para fuerza bruta.          |
| --stdout[=LENGTH]         | Solo mostrar contraseñas candidatas [cortar en LENGTH].        |
| --save-memory=LEVEL       | Habilitar ahorro de memoria, niveles 1..3.                    |
| --node=MIN[-MAX]/TOTAL    | Rango del número de este nodo fuera del recuento TOTAL.        |
| --fork=N                  | Bifurcar N procesos para acelerar la fuerza bruta.            |
| --format=NAME             | Forzar tipo de hash NAME: descrypt/bsdicrypt/md5crypt/bcrypt/LM/AFS/tripcode/dummy/crypt. |

–incremental[=MODE]:

  • Esta opción activa el modo incremental. Se puede especificar un modo particular, como Digits, para probar solo combinaciones numéricas.
Ejemplo: `--incremental=Digits`

–external=MODE

  • Permite la integración de un filtro externo o un conjunto de palabras predefinido para la fuerza bruta.
Ejemplo: `--external=wordlist.txt`

–stdout[=LENGTH]

  • Esta opción muestra solo las contraseñas candidatas, y puede limitarse la longitud.
Ejemplo: `--stdout=8`

–save-memory=LEVEL

  • Habilita el ahorro de memoria en diferentes niveles (1 a 3), útil para sistemas con limitaciones de recursos.
Ejemplo: `--save-memory=2`

–node=MIN[-MAX]/TOTAL

  • Define el rango del número de este nodo fuera del recuento total, útil en entornos distribuidos.
Ejemplo: `--node=1-4/10`

–fork=N

  • Bifurca el proceso en N procesos independientes, acelerando la velocidad de la fuerza bruta.
Ejemplo: `--fork=4`

–format=NAME

  • Esta opción permite forzar un tipo de hash específico, como descrypt, md5crypt, o bcrypt.
Ejemplo: `--format=md5crypt`

Ejemplo:

En este ejemplo simple veremos como funciona la herramienta. He creado un archivo de texto con “user:AZl.zWwxIh15Q” que es “user:example” que vendria a ser un diccionario, que contiene la contraseña example, ya que es uno de los ejemplos mas famosos que he visto para una prueba. Al archivo generado lo he llamado password.txt.

Para poder crackear esa contraseña, he utilizado el modo fuerza bruta simple:

john password.txt
  • Sin ningún parámetro más, empieza la operación. Pasados unos minutos (ya que es un ejemplo muy básico, sino podría tardar horas o no conseguirlo también), ha conseguido crackear la contraseña.

Para ver en texto plano la contraseña se usa:

john --show password.txt
  • Como se ve en la imagen, aparece la contraseña example en texto claro ya descifrada.

img

Este es un ejemplo básico para comprobar el uso, más adelante en su correspondiente sección, crackearemos contraseñas de manera más real, con ejemplos más complejos, y con generación de diccionarios personalizados, incluido en máquinas Windows, entre otros.

Crackeo de cuentas de usuarios en GNU/Linux en local:

Para este escenario voy a descifrar las contraseñas de una máquina Debian, donde he creado unos usuarios:

  • debian: debian
  • root: debian
  • gabriel: suzuki
  • manuel: contraseña
  • raul: sfc

John The Ripper utiliza en este modo un parámetro llamado --format=crypt que es utilizado cuando se trabaja con archivos de contraseñas que contienen tanto la información de la contraseña en claro como el hash (como en los archivos “passwd” y “shadow”), este parámetro te permite indicar que el formato del hash es “crypt” (solo pass users con $y$).

El formato crypt se refiere a un método de cifrado de contraseñas utilizado en sistemas basados en UNIX. Este método toma la contraseña en claro y la hashea utilizando una función de resumen de contraseñas, generalmente basada en el algoritmo DES (Data Encryption Standard).

Para comenzar he utilizado el comando unshadow que es utilizado para combinar la información de un archivo passwd (que contiene detalles de usuarios, incluyendo nombres de usuario y contraseñas encriptadas) y un archivo shadow (que generalmente almacena contraseñas encriptadas y otras configuraciones de seguridad).

sudo unshadow /etc/passwd /etc/shadow > secreto

Ahora, con el archivo ya combinado resultante “secreto” ya esta listo para usar John mediante el siguiente comando:

sudo john secreto --format=crypt

Y como se ve en la imagen ha conseguido descifrar la contraseña de los 4 primeros usuarios antes mencionados. Pero el usuario raul no lo ha conseguido asi que más abajo lo hare con un diccionario.

Como el usuario raul aún sigue sin crackear, usaré un ataque con un diccionario simple creado por mi con palabras de ejemplo. Tan sencillo como hacer un nano diccionario.txt e ir escribiendo palabras. Con el diccionario creado para usarlo en este caso es:

john --format=crypt --wordlist=diccionario.txt secreto

img

Con esta forma, si se ha crackeado esa contraseña también a nivel de ejemplo, usando un pequeño diccionario. También aclaro que este ejemplo sirve porque he introducido la contraseña entre las palabras del diccionario para suponer el uso de uno grande como rockyou, pero sin tener que estar esperando tanto tiempo.

Otro ejemplo es teniendo al usuario aaron:123456789 con el modo crypt también funciona siendo sólo digitos sin especificar otros parámetros:

img

Para ver los root comprometidos:

sudo john -show -users:0 secreto

Para ver cuentas de grupo privilegiados:

sudo john -show -groups:0,1 secreto

Crackeo de una cuenta de usuario llamada Raul donde su contraseña tiene el formato: una mayúscula, un dígito, una minúscula y un dígito (ejercicio de examen):

El primer paso es generar un diccionario con crunch que se adapte a esta necesidad:

sudo crunch 4 4 -o dicc.txt -t ,%@%

img

El siguiente paso es obtener el archivo con las contraseñas y los hashs y utilizar john para descifrar la contraseña utilizando el diccionario recién generado:

sudo unshadow /etc/passwd /etc/shadow > secreto.txt

sudo john --format=crypt --wordlist=dicc.txt secreto.txt

img

El tiempo varia según la capacidad del procesador, como ya he explicado en su respectiva sección. Cuando termina muestra por pantalla la contraseña del usuario en texto plano, ya descifrada:

img

Y finalmente, con la contraseña obtenida, ya tenemos acceso al usuario para inciar sesión, etc. (el error de permiso denegado es porque se ha iniciado sesión desde el home del usuario andres, y obviamente el usuario raul, no tiene privilegios ni de lectura).

img

Crackeo de cuentas de usuario en Windows:

El NT Hash o NTLM (New Technology Lan Manager) que hace referencia a la versión anterior (“LM”) del formato que Windows utilizaba. A partir de sistemas Windows 2008/Vista se usa por defecto NTLM (aunque por compatibilidad se puede seguir haciendo uso de LM).

En sistemas Windows actuales, las contraseñas suelen almacenarse de forma segura en un archivo llamado SAM (Security Account Manager). Este archivo está ubicado en la ruta C:\Windows\System32\config\SAM. Sin embargo, este archivo está protegido y no puede ser copiado o accedido directamente mientras Windows está en ejecución.

Para obtener las contraseñas almacenadas en el archivo SAM, se utilizan herramientas externas como pwdump o fgdump. Estas herramientas aprovechan vulnerabilidades conocidas o debilidades en la seguridad del sistema para extraer la información de contraseñas.

  • pwdump:

Herramienta que se utiliza para extraer las contraseñas almacenadas en el archivo SAM. Hay que descargar pwdump y ejecutarlo desde la línea de comandos.

  • fgdump:

Herramienta similar a pwdump que también se utiliza para extraer contraseñas del archivo SAM.

Extrayendo manualmente del archivo SAM: Accede al archivo SAM:

El archivo SAM está en %SystemRoot%\system32\config\SAM, aunque lo ideal es copiarlo a otro lugar para trabajar con él.

Comprobar contraseñas:

Para comprobar el nivel de seguridad nuestras contraseñas, se puede ver en la siguiente web: https://passwordmeter.com/

Preparación del escenario:

Para este escenario he descargado la versión Jumbo de 32bits desde su web: https://www.openwall.com/john/

Por otro lado la herramienta pwdump desde su web: https://www.openwall.com/passwords/windows-pwdump

Para esta parte he elegido un Windows 7 pro. Por otro lado he creado los usuarios:

  • raul:password
  • gabriel:suzuki
  • maria:maria123
  • aaron:betis

Con el sistema preparado, hay que crear una carpeta en C:, en mi caso la he llamado john. En esta carpeta hay que descomprimir los archivos de John the Ripper Jumbo.

Ahora con la herramienta pwdump, hay que hacer un volcado de la siguiente manera:

pwdump8.exe > hashes.txt

Y ahora el archivo pass.txt lo he copiado a la carpeta john\run\.

Ahora con todo preparado es el momento de usar john de manera incremental y para ello:

john.exe --format=NT pass.txt
  • Nota: Para estas pruebas primero probe con un archivo llamado pass.txt y posteriormente añadiendo un par de usuarios mas hashes.txt por si el nombre del archivo no coincide en las imágenes.

Para ver las contraseñas en texto claro he usado el comando:

john --show --format=NT hashes.txt

Con diccionarios:

Para este escenario con diccionario, he usado el diccionario rockyou pero también es posible crearlo a mano de la misma forma que en el apartado de linux (creando un archivo de texto).

Con el diccionario creado, la forma de utilizarlo es:

john --wordlist=rockyou.txt --format=NT hashes.txt

Como se puede observar en las imágenes el uso de John The Ripper en Windows es similar al uso en linux, solo que cambia la ubicación del archivo de contraseñas y del tipo de hash utilizado.

Hydra:

img

Hydra es una herramienta de prueba de penetración diseñada para realizar ataques de fuerza bruta y diccionario en protocolos de autenticación . Es particularmente conocida por su capacidad para realizar ataques a servicios remotos como SSH, FTP, HTTP, entre otros.

Hydra es un cracker de inicio de sesión paralelizado que admite numerosos protocolos para atacar, además añadir nuevos módulos es muy sencillo. Esta herramienta hace posible que los investigadores y consultores de seguridad, mostrar lo fácil que sería obtener acceso no autorizado a un sistema remotamente.

Es compatible con: Cisco AAA, Cisco auth, Cisco enable, CVS, FTP, HTTP(S)-FORM-GET, HTTP(S)-FORM-POST, HTTP(S)-GET, HTTP(S)-HEAD, HTTP-Proxy, ICQ, IMAP, IRC, LDAP, MS-SQL, MySQL, NNTP, Oracle Listener, Oracle SID, PC-Anywhere, PC-NFS, POP3, PostgreSQL, RDP, Rexec, Rlogin, Rsh, SIP, SMB(NT), SMTP, Enumeración SMTP, SNMP v1+v2+v3, SOCKS5, SSH (v1 y v2), SSHKEY, Subversion, Teamspeak (TS2), Telnet, VMware-Auth, VNC y XMPP.

Para instalar hydra en Debian, que por defecto, no viene instalado, a diferencia de Kali Linux, es:

sudo apt install hydra

Y algunas de sus opciones son:

| Opción | Descripción |
|--------|-------------|
| -l LOGIN or -L FILE | Login con el nombre LOGIN, o cargar varios logins desde un archivo |
| -p PASS or -P FILE | Intentar contraseña PASS, o cargar varias contraseñas desde archivo |
| -C FILE | Formato "login:pass" separado por dos puntos, en lugar de -L/-P opciones |
| -M FILE | Lista de servidores a atacar, una entrada por línea, ':' para especificar el puerto |
| -t TASKS | Ejecutar TASKS número de conexiones en paralelo por objetivo (predeterminado: 16) |
| -U | Detalles de uso del módulo de servicio |
| -m OPT | Opciones específicas para un módulo, ver salida de -U para obtener información |
| -h | Más opciones de línea de comandos (AYUDA COMPLETA) |
| server | El objetivo: DNS, IP o 192.168.0.0/24 (esto O la opción -M) |
| service | El servicio a crackear (ver abajo para los protocolos soportados) |
| OPT | Algunos módulos de servicio admiten entrada adicional (-U para obtener ayuda del módulo) |

Pero con lo que hay que quedarse de todo más es con los parámetros de usuario (l de login) y contraseña (-p de password), si conozco el login o la contraseña de un usuario, entonces ese parámetro va con minúsculas , y si no lo conozco es con mayúsculas , es decir, si conozco el usuario pero no la contraseña, seria -l usuario -P método de ataque.

Crackeo de Contraseñas MySql en remoto:

Para este escenario he necesitado una máquina debian con mariadb y por otro lado, he utilizado la herramienta Hydra alojada en un Kali Linux.

En la máquina víctima Mariadb:

Instalar el servidor de forma habitual con:

sudo apt install mariadb-server mariadb-client

Iniciar el servicio de MariaDB:

sudo systemctl start mariadb

Habilitar que MariaDB se inicie automáticamente al arrancar:

sudo systemctl enable mariadb

Para esta demostración, no voy instalar mysql_secure_installation.

Con mariadb instalado, ahora es momento de crear algunos usuarios:

  • Raul:micontraseña
  • gabriel:contraseña
  • root:admin

img

Para que un usuario pueda conectarse debe ser creado con:

create user 'gabriel'@'%' identified by 'contraseña';
  • Muy importante que lleve el % para permitir conexiónes no solo locales.

Con los usuarios ya creados, ahora hay que modificar el archivo de configuración del servidor permitiendo mas intentos de conexión, parámetro que se suele modificar a menudo en distintos escenarios. Lo ideal es ajustarlo a un valor muy bajo para que el servidor banee al atacante y ya no pueda volver a intentar entrar. (A no ser que se haga un flush hosts)

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
max_connect_errors=1000000
max_connections=1000

img

Y modificar también la parte de bind-addres que viene por defecto con 127.0.0.1 por 0.0.0.0 para permitir las conexiones remotas.

img

Reinicio el servicio:

sudo systemctl restart mariadb

Y con esto el servidor mysql esta configurado ahora pasaré a la parte de Kali Linux.

En el Kali Linux Atacante:

Lo primero es tener en cuenta las ips, tanto la de la máquina servidor como la atacante. Dicho esto, lo primero que voy a hacer es escanear el puerto 3306 que es el utilizado por mysql, y con -vvvv para tener mas información, de la máquina servidor:

nmap -p 3306 10.0.2.15 -vvvv
  • Donde esa ip, es la de la máquina víctima que contiene mariadb.

img

Lo que me devuelve que el puerto 3306 esta abierto por lo que puedo proceder con el ataque.

Lo siguiente es preparar los diccionarios que voy a usar. He creado 2 diccionarios, uno con contraseñas y otro con usuarios, para probar 2 casos, uno en el que sé el usuario pero no la contraseña y viceversa.

Para empezar el ataque, le especifico a hydra con -l minúscula, que conozco el usuario y con -P mayúscula que no conozco la contraseña. Para ello utilizo mi diccionario de contraseñas probando diferentes usuarios, por ejemplo:

Para el usuario gabriel de la base de datos:

hydra -l gabriel -P /usr/share/wordlists/diccionario.txt mysql://10.0.2.15 -vvvv

img

Para el usuario root:

hydra -l root -P /usr/share/wordlists/diccionario.txt mysql://10.0.2.15 -vvvv

img

Para el usuario Raul:

hydra -l Raul -P /usr/share/wordlists/diccionario.txt mysql://10.0.2.15 -vvvv

img

Como se ve en las imágenes, se consigue la contraseña de esos usuarios, pero es debido a que tenia en mi diccionario muchas contraseñas, incluidas las de esos usuarios. Esto es para simplificar y ahorrar tiempo, ya que, con un diccionario como rockyou, la duración puede ser muy elevada.

Conociendo la contraseña pero no el usuario:

Es practicamente lo mismo, especificar que al no conocer el usuario tengo que darle el parámetro -L en mayúsculas , y la contraseña -p en minúsculas porque sí la conozco, y especificando el diccionario que he creado antes lleno de nombres de usuario. Probando con la contraseña contraseña quedaría así:

hydra -L /usr/share/wordlists/usuarios.txt -p contraseña mysql://10.0.2.15 -vvvv

img

De esta forma es posible obtener las contraseñas de usuarios de mysql, pero claro, todo esto bajo unas condiciones preparadas para este escenario. En el mundo real, sorprende muchísimo la cantidad de empresas o entidades, que en pleno 2024, siguen con una seguridad muy deficiente por pequeños errores básicos, y/o despistes.

Crackeo mysql en local:

Para poder crackear las contraseñas de los usuarios mysql pero en local en vez de en remoto como en el ejemplo anterior, hay que usar hydra ya que John no esta pensado para esto. El procedimiento es el mismo que en remoto con la diferencia de que a la hora de poner la ip de la máquina destino, se pone la ip del localhost 127.0.0.1.

Por ejemplo, en mi propio Kali, para crackear la contraseña del usuario gabriel que cree antes, es de la siguiente manera:

hydra -l gabriel -P /usr/share/wordlists/diccionario.txt mysql://127.0.0.1 -vvvv

img

De esta forma es posible también crackear los usuarios de forma local , ya que hydra es una herramienta muy poderosa y John no está diseñado específicamente para realizar ataques contra bases de datos MySQL, mas bien es conocido principalmente por ser una herramienta de prueba de contraseñas que se utiliza para realizar ataques de fuerza bruta o diccionario contra archivos de contraseñas, hashes de contraseñas u otros formatos de almacenamiento de contraseñas.

Por otra parte, hydra com mencioné al principio, es compatible con muchísimos otros protocos , como por ejemplo SSH , algo muy útil para poder intentar entrar en una máquina y obtener el control total sobre ella, aunque hay muchas formas de prevenir esto, como por ejemplo con un Sistema de detección de intrusos como Snort (que veremos más adelante), entre otros.

John The Ripper o Hydra. ¿Cual voy a necesitar?:

Hydra:

  • Tipo de Ataque: Hydra se especializa en ataques de fuerza bruta y diccionario. Puede realizar ataques contra servicios que utilizan diversos protocolos de autenticación, como SSH, FTP, HTTP, etc.

  • Objetivo: Su enfoque principal es encontrar combinaciones de nombres de usuario y contraseñas correctas mediante la prueba de múltiples combinaciones sobretodo en escenarios remotos.

John the Ripper:

  • Tipo de Ataque: John the Ripper se centra en ataques de fuerza bruta, diccionario y ataques basados en rainbow tables. Puede realizar ataques contra archivos de contraseñas cifradas localmente.

  • Objetivo: Se utiliza principalmente para romper contraseñas almacenadas localmente, como las que se encuentran en archivos de contraseñas cifradas.

Conclusión:

Hydra se centra en ataques a servicios remotos y mientras que John the Ripper se utiliza para romper contraseñas almacenadas localmente.