Bienvenidos a un nuevo post en Bytemind. En el caso de hoy les vamos a enseñar una herramienta muy potente llamada John the Ripper.
¿Qué es John the Ripper?
John the Ripper es una herramienta utilizada para desencriptar contraseñas por fuerza bruta. Por defecto se basa en un diccionario de contraseñas propio aunque podemos descargar o crear uno propio y lanzarlo con el mismo.
Para encontrar una contraseña, lógicamente, es necesario que esta se encuentre en el diccionario, los cuales suelen basarse en las más usadas por los usuarios, aunque, podemos crear el nuestro personalizado como ya vimos en un post anterior con crunch.
La fuerza bruta consiste en probar con diferentes claves de forma reiterada hasta dar con la correcta.
En este caso, vamos a realizar un ejemplo sobre un usuario creado en nuestra propia máquina, ya que atacar a una máquina que no sea de nuestra propiedad es ilegal.
Instalación de John the Ripper
Por defecto, si utilizais Kali Linux, como es nuestro caso ya viene instalada por defecto. Si no es el caso podéis instalarla según vuestra distribución de la siguiente forma.
En el caso de distribuciones basadas en debian, como lo es ubuntu, tan sólo es necesario lanzar el siguiente comando:
1 |
sudo apt-get install john |
En caso de utilizar distribuciones basadas en Red Hat, se deberá realizar la instalación del mismo mediante snap, a través de los siguientes comandos:
Instalamos epel si no lo tenemos:
1 |
sudo yum install epel-release |
Instalamos snap:
1 |
sudo yum install snapd |
Habilitamos el socket de snap:
1 |
sudo systemctl enable --now snapd.socket |
Creamos un enlace simbólico a snap en la raíz:
1 |
sudo ln -s /var/lib/snapd/snap /snap |
Y finalmente instalamos john:
1 |
sudo snap install john-the-ripper |
Antes de empezar
Antes de continuar utilizando la herramienta, lo primero que deberemos de hacer es comprobar que funciona correctamente en nuestro sistema, para ello lanzaremos el siguiente comando:
1 |
john --test |
Tardará un rato en completarse, y una vez realizado veremos una salida similar a la siguiente:
Completado el test podemos comenzar a realizar las pruebas que teníamos previstas, pero vamos a ver la ayuda del comando y algunas opciones antes de continuar.
La ayuda del mismo podemos verla mediante el siguiente comando:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# john --help John the Ripper 1.9.0-jumbo-1 OMP [linux-gnu 64-bit x86_64 AVX2 AC] Copyright (c) 1996-2019 by Solar Designer and others Homepage: http://www.openwall.com/john/ Usage: john [OPTIONS] [PASSWORD-FILES] --single[=SECTION[,..]] "single crack" mode, using default or named rules --single=:rule[,..] same, using "immediate" rule(s) --wordlist[=FILE] --stdin wordlist mode, read words from FILE or stdin --pipe like --stdin, but bulk reads, and allows rules --loopback[=FILE] like --wordlist, but extract words from a .pot file --dupe-suppression suppress all dupes in wordlist (and force preload) --prince[=FILE] PRINCE mode, read words from FILE --encoding=NAME input encoding (eg. UTF-8, ISO-8859-1). See also doc/ENCODINGS and --list=hidden-options. --rules[=SECTION[,..]] enable word mangling rules (for wordlist or PRINCE modes), using default or named rules --rules=:rule[;..]] same, using "immediate" rule(s) --rules-stack=SECTION[,..] stacked rules, applied after regular rules or to modes that otherwise don't support rules --rules-stack=:rule[;..] same, using "immediate" rule(s) --incremental[=MODE] "incremental" mode [using section MODE] --mask[=MASK] mask mode using MASK (or default from john.conf) --markov[=OPTIONS] "Markov" mode (see doc/MARKOV) --external=MODE external mode or word filter --subsets[=CHARSET] "subsets" mode (see doc/SUBSETS) --stdout[=LENGTH] just output candidate passwords [cut at LENGTH] --restore[=NAME] restore an interrupted session [called NAME] --session=NAME give a new session the NAME --status[=NAME] print status of a session [called NAME] --make-charset=FILE make a charset file. It will be overwritten --show[=left] show cracked passwords [if =left, then uncracked] --test[=TIME] run tests and benchmarks for TIME seconds each --users=[-]LOGIN|UID[,..] [do not] load this (these) user(s) only --groups=[-]GID[,..] load users [not] of this (these) group(s) only --shells=[-]SHELL[,..] load users with[out] this (these) shell(s) only --salts=[-]COUNT[:MAX] load salts with[out] COUNT [to MAX] hashes --costs=[-]C[:M][,...] load salts with[out] cost value Cn [to Mn]. For tunable cost parameters, see doc/OPTIONS --save-memory=LEVEL enable memory saving, at LEVEL 1..3 --node=MIN[-MAX]/TOTAL this node's number range out of TOTAL count --fork=N fork N processes --pot=NAME pot file to use --list=WHAT list capabilities, see --list=help or doc/OPTIONS --format=NAME force hash of type NAME. The supported formats can be seen with --list=formats and --list=subformats |
Prueba 1: Crackeo de contraseña de usuario en linux por fuerza bruta
Una vez instalada y testeada la herramienta podemos empezar por un caso real, por ejemplo, cargar directamente el archivo “/etc/shadow” y probar a descifrar contraseñas. Pero, para este caso de ejemplo, vamos a crear un fichero con la clave de un usuario muy simple para hacer de forma rápida esta prueba.
Para realizar la prueba vamos a crear un fichero de texto en el directorio que deseemos e incluiremos en el mismo el siguiente contenido:
1 |
user:AZl.zWwxIh15Q |
Ahora ejecutaremos john sobre el fichero que acabamos de crear:
1 |
# john password.txt |
El comando tardará un rato dependiendo de la complejidad de la contraseña y veremos al final un resultado similar al siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# john password.txt Using default input encoding: UTF-8 Loaded 1 password hash (descrypt, traditional crypt(3) [DES 256/256 AVX2]) Will run 2 OpenMP threads Proceeding with single, rules:Single Press 'q' or Ctrl-C to abort, almost any other key for status Almost done: Processing the remaining buffered candidate passwords, if any. Warning: Only 273 candidates buffered for the current salt, minimum 512 needed for performance. Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist Warning: Only 1 candidate left, minimum 512 needed for performance. Proceeding with incremental:ASCII Warning: MaxLen = 13 is too large for the current hash type, reduced to 8 example (user) 1g 0:00:03:17 DONE 3/3 (2020-01-04 19:25) 0.005071g/s 8828Kp/s 8828Kc/s 8828KC/s exi59a3..exam0b' Use the "--show" option to display all of the cracked passwords reliably Session completed |
Obtenida la contraseña podemos verla utilizando el siguiente comando:
1 2 3 4 |
# john --show password.txt user:example 1 password hash cracked, 0 left |
Como podemos apreciar, hemos descifrado la contraseña “example” del usuario indicado en el fichero de contraseñas.
Prueba 2: Crackeo de contraseña de usuario en linux por ataque de diccionario
Crearemos entonces un diccionario para realizar el ataque, en nuestro caso hemos hecho un diccionario muy simple que incluye el siguiente contenido:
1 2 3 4 5 6 7 8 9 10 11 12 |
# cat diccionario.lst prueba prueba1 prueba2 1234 123456 12345678 ejemplo example eXample EXAMPLE example1 |
Ahora ejecutaremos john de nuevo con la opción –wordlist para indicarle que utilice el diccionario que acabamos de crear, quedando el comando de la siguiente forma:
1 |
# john --wordlist=diccionario.lst password.txt |
Y al igual que en el anterior caso, pasado un tiempo nos encontrará la contraseña del fichero que podremos ver con el comando:
1 2 3 4 |
# john --show password.txt user:example 1 password hash cracked, 0 left |
Y esto ha sido todo por el momento, como hemos visto John es una herramienta muy potente y que puede resultar muy útil en según que casos. Pero como siempre menciono, esto sólo se indica con fines educativos, no nos hacemos responsables de cualquier acto ilegal cometido con la ayuda de las entradas realizadas en este blog.
Si tienen dudas o desean exponer sus propias opiniones al respecto tienen a su disposición la sección de comentarios.
Hola, me gustaría saber los pasos a seguir para sacar la contraseña de un archivo wallet.dat
Hola Antonio,
En ese caso puedes utilizar el script de bitcoin2john.py incluido en el mismo repositorio de github para extraer el hash, te lo pongo como ejemplo
./bitcoin2john.py wallet.dat > hash.txt
Y posteriormente utilizar john junto con tu diccionario para intentar obtener la clave.
Saludos
Hola,
estoy intentando sacar la contrasena de una maquina virtual encriptada de VMware, utilice el vmx2john.py para generar el hash pero luego al intentar correr john hash.txt me arroja:
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)
Con otros hashes de archivos rar o zip si me detecta y hace el proceso normal.
Agradecere alguna ayuda, Saludos!!
Hola Jesús,
En este caso te recomendaría revisar el formato de hash que te ha devuelvo vmx2john
Para ello puedes utilizar la opción –list=format-all-details para ver un ejemplo del formato que debería tener el hash, te dejo un ejemplo a continuación
$ john --list=format-all-details|grep vmx
Format label vmx
Example ciphertext $vmx$1$0$0$10000$514fb565d74db333352661023874f07d$81dc8986e299d55dee724198a572619b87de0b96501dd2285fbe928c831446fb92c056e02e6ca0119213e9cf094222c0e4d0df6f014615c915412cb0c892d4528070ead0d2443d0c457a7db445fd17b060899033a5c69d43315abd3d262ad3570379c12c97fc2490d7a42b04f99a24386f27aa56
Otra opción es que utilices hashcat para ello, el cual tiene un modo para vmware
$ hashcat --help|grep -i vm
27400 | VMware VMX (PBKDF2-HMAC-SHA1 + AES-256-CBC) | Full-Disk Encryption (FDE)
Con hashcat un ejemplo de como debería ser el comando sería este:
$ hashcat -m 27400 hash.txt DICTIONARY
Espero haber sido de ayuda y si sigue dando problemas no dudes en preguntar de nuevo.
Saludos
Hola de nuevo. Primero muchas gracias por tu respuesta!!
No me es muy familiar trabajar con linux por lo que estoy desde windows, pero obtengo el mismo problema al intentar desde una maquina virtual con Kali-linux.
El resultado de vmx2john es yo diria correcto ya que se parece al ejemplo que pone john.
————————-
este.vmx-Windows XP Professional:$vmx$1$0$0$1000$b’54f78d090dc99cfc5e5a384afa977ad5’$b’3974d5f028dacae4f1b295646a4c4353e4656faab3be229743632b9c2146825a7df2e43a5d525cdb21e391e5767827a57dbf36cebff0bb40c41bfb7ffec5dd97b6c162a9dac729aba78960ce2564f28ec071e38fd79f09e5cff7fe820309bbe139238e9a40b6eb8fb91985e6850748ff0d75db41′
————————-
La VM es mia asi que no hay problema con postear el hash, olvide la contrasena jaja pero se que debe tener entre 6 y 8 caracteres
Si john lograra leer el hash ya solo trataria con prefijos y/o bruteforce.
Vi por ahi que podia ser la version de jonh pero tengo la ultima tanto en win como en linux, la john-1.9.0-jumbo-1
El hash lo copie tal cual me lo genero vmx2john.py por lo que si lo copias a un archivo deberia de funcionarte supongo a ver que te marca
Hashcat no entiendo bien como funciona por lo que de momento lo dejo como ultima opcion.
Gracias!
Hola Jesús,
El problema viene por el formato que tiene el hash, es decir, el mismo ha incluido, para definir cada parte, el valor entre b” para indicar que son bytes.
Acabo de revisar y probar el mismo, y aunque no tengo el diccionario adecuado eliminando esos caracteres permite tanto a john como a hashcat poder leer correctamente el hash y tratar de crackearlo.
De todas formas te dejo aquí el hash sin los caracteres que indico
vmx-Windows XP Professional:$vmx$1$0$0$1000$54f78d090dc99cfc5e5a384afa977ad5$3974d5f028dacae4f1b295646a4c4353e4656faab3be229743632b9c2146825a7df2e43a5d525cdb21e391e5767827a57dbf36cebff0bb40c41bfb7ffec5dd97b6c162a9dac729aba78960ce2564f28ec071e38fd79f09e5cff7fe820309bbe139238e9a40b6eb8fb91985e6850748ff0d75db41
Prueba con el mismo y cualquier cosa estamos aqui para ayudarte en lo posible.
Saludos
Nuevamente Muchas gracias por tu respuesta
Se logró!!! por lo menos una de las 2 maquinas que olvide jajaja pero es la mas importante.
efectivamente al retirar esas “B” y los apostrofes ya me la reconoció el john.
termine utilizando una sintaxis tipo:
john -1=’werlkj123′ –mask=?1?1?1?1?1?1?1 hash.txt donde (werlkj123) son los caracteres que mas probablemente habría utilizado, para limitar el tiempo de la búsqueda.
Solo por hacer una prueba también probé con otra maquina virtual de vmware encriptada de la cual si recuerdo la contraseña y de igual forma funcionó remover las “B”.
Gracias y por cierto me voy a ocupar en tomar tu curso de python.
saludos!!!
Hola Jesús,
Perfecto, buen trabajo, me alegro de que al final consiguieras obtener las credenciales.
Gracias a ti por leernos y cualquier duda que tengas no dudes en preguntarnos.
Saludos
Buenas tardes.
Estoy haciendo un laboratorio para cifrar las contraseñas con los pasos indicados anteriormente, cuando ejecuto el jhon me sale el siguiente mensaje.
# john –wordlist=passwd.lst passwd.txt
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)
ya revise la versiòn del s.o y se encuentra en 1.9.0
Muchas gracias
Hola Javier,
Cual es el contenido del fichero passwd.txt, tal vez el hash existente en el fichero esté mal formado y sea la razón por la que no está detectando el mismo.
Saludos
Hola buenas noches, me podria indicar los pasos para descifrar un wallet.dat por favor? estoy trabajando desde windows 64 bits
Hola Saul,
En ese caso puedes utilizar el script de bitcoin2john.py incluido en el mismo repositorio de github para extraer el hash, te lo pongo como ejemplo
./bitcoin2john.py wallet.dat > hash.txt
Y posteriormente utilizar john junto con tu diccionario para intentar obtener la clave.
Saludos
Estoy utilizando una VM de cisco@labvm: estoy tratando de ingresar el comando cd ~/Downloads/john-1.8.0/run y no lo reconoce. Es para un ejercicio de Cisco, soy nuevo en este tema, pero deseo aprender.
Hola Ricardo,
Podrías indicar más información al respecto, qué error te devuelve el comando.
Saludos
Buenas amigo, yo estoy desde parrot y me tira el siguiente error :
No password hashe loaded (see FAQ)
tengo la version 1.9.0-jumbo
utilizo el siguiente comando:
>john –wordlist=rockyou.txt hash
Hola Davi,
Revisa el fichero de hash, parece que no está leyendolo correctamente o que esté mal formado.
Saludos