La mítica herramienta John the Ripper es conocida por la gran mayoría de administradores de sistemas, responsables de seguridad, hackers y crackers. Aunque a primera vista sea un programa que será utilizado con fines maliciosos o como herramienta de cracking, su uso puede ser muy útil en el ámbito de la administración de sistemas y seguridad para asegurarnos de que las contraseñas utilizadas en los sistemas cumplen con los requisitos establecidos. Para esto como bien sabréis, hay otros medios proactivos en lugar de reactivos, como por ejemplo establecer políticas de seguridad para las contraseñas con el módulo PAM (Linux Pluggable Authentication Modules) del cual prepararé un artículo en los próximos días.tope

John the Ripper: password cracking en Linux


John the Ripper en su faceta mas básica es una herramienta criptográfica que a través de la fuerza bruta y ataques de diccionario intenta descifrar contraseñas, entre sus cualidades destaca la capacidad de romper algoritmos de cifrado y hash como el DES, SHA-1, MD5, Blowfish… También permite trabajar con add-ons o módulos externos como MD4, LDAP o MySQL entre otros.

Instalación de John the Ripper
La instalación es tan sencilla como instalar la herramienta a través de los repositorios:

Debian y Ubuntu

# apt-get install john

CentOS, RHEL, Fedora, Scientific Linux

John The Ripper no está disponible en los repositorios oficiales así que tendremos que hacer uso de un repositorio de terceros o bajar directamente el RPM de uno de estos repos. En este caso instalamos el repositorio RepoForge

# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
# yum install rpmforge-release-0.5.3-1.el6.rf.i686.rpm
# yum install john


Instalación manual compilando las fuentes

# wget http://www.openwall.com/john/j/john-1.8.0.tar.gz
# tar -xzvf john-1.8.0.tar.gz
# cd src
# make
# make clean SYSTEM
# make clean generic
# cd ../run
# ./john --test


Cómo utilizar John The Ripper

El uso más básico de John The Ripper es el siguiente; se ejecuta el comando “john” especificando un fichero passwd sobre el cual comenzar el ataque de diccionario y fuerza bruta. Podemos hacer una copia del fichero “/etc/passwd” del sistema y trabajar sobre esa copia:

Nota: Los usuario de CentOS y derivados pueden recibir el siguiente error al ejecutar el comando:

# john /var/tmp/passwd
Created directory: /root/.john
fopen: $JOHN/dynamic.conf: No such file or directory


La solución es comentar la siguiente línea del fichero de configuración de John The Ripper:

# vi /etc/john.conf

# Dynamic ($dynamic_n$) scripting code, in an external file
# also shows/tests that .include works the same as .include "$JOHN/file"
#.include


Esta sería entonces la ejecución básica:

# john /var/tmp/passwd
No password hashes loaded (see FAQ)

¿Por qué aparece el mensaje “No password hashes loaded“? Aparece debido a que las contraseñas hasheadas, por seguridad, no se almacenan en el archivo /etc/passwd ya que tiene lectura para todo el mundo:

# ls -l /etc/passwd
-rw-r--r-- 1 root root 1453 Sep 14 15:03 /etc/passwd


Se almacenan en el archivo /etc/shadow, el cual está protegido para que sólo root pueda leerlo:

# ls -l /etc/shadow
---------- 1 root root 889 Sep 14 15:03 /etc/shadow


Así pues debemos copiar también el archivo /etc/shadow a la ruta temporal para procesarlo junto al passwd:

# cp -p /etc/shadow /var/tmp

Ahora ejecutamos el comando “unshadow” que combinará ambos archivos en uno, que será el que procesemos con john:

# unshadow /var/tmp/passwd /var/tmp/shadow > /var/tmp/mypasswd

Así que al fin y al cabo podríamos habernos ahorrado los pasos anteriores y ejecutar directamente (quería que vierais lo que pasaba de todos modos):

# unshadow /etc/passwd /etc/shadow > /var/tmp/mypasswd

Ahora sí que sí, ejecutamos john. Al ser un ataque de diccionario y fuerza bruta es completamente normal que la CPU se ponga prácticamente al 100%:

Tasks: 106 total, 2 running, 104 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.3%us, 5.9%sy, 2.6%ni, 87.7%id, 0.8%wa, 0.1%hi, 0.6%si, 0.0%st
Mem: 768756k total, 219004k used, 549752k free, 10364k buffers
Swap: 204792k total, 0k used, 204792k free, 146688k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1552 root 39 19 9116 3172 1684 R 93.4 0.4 0:47.80 john


Mientras se estará ejecutando john en primer plano:

# john /var/tmp/mypasswd
Loaded 1 password hash (generic crypt(3) [?/32])


El resultado irá apareciendo por pantalla y también quedará almacenado en nuestra home de usuario, concretamente en el archivo $JOHN/john.pot. Ojo, este archivo no es legible, hay que usar un comando para procesarlo:

# ls -l ~/.john/john.pot
-rw------- 1 root root 0 Oct 4 17:24 /root/.john/john.pot


En esa misma ruta está el log con todas las operaciones que la herramienta va realizando:

# head -10 ~/.john/john.log
0:00:00:00 Starting a new session
0:00:00:00 Loaded a total of 1 password hash
0:00:00:00 - Hash type: generic crypt(3) (lengths up to 72)
0:00:00:00 - Algorithm: ?/32
0:00:00:00 - Candidate passwords will be buffered and tried in chunks of 96
0:00:00:00 - Configured to use otherwise idle processor cycles only
0:00:00:00 Proceeding with "single crack" mode
0:00:00:00 - 1081 preprocessed word mangling rules
0:00:00:00 - Allocated 1 buffer of 96 candidate passwords
0:00:00:00 - Rule #1: ':' accepted as ''


En mi ejecución he puesto varias contraseñas extremadamente obvias y se puede ver como las va sacando. Contraseña “1234” para el usuario “pruebas” y “test” para el usuario “test”:

# john /var/tmp/mypasswd
Loaded 3 password hashes with 3 different salts (generic crypt(3) [?/32])
test (test)
1234 (pruebas)


Para visualizar las contraseñas que ha ido sacando para mi archivo mypasswd usamos el parámetro “–show” que parsea el contenido del archivo john.pot que he comentado antes:

# john --show /var/tmp/mypasswd
test:test:504:505::/home/test:/bin/bash
pruebas505:506::/home/pruebas:/bin/bash

2 password hash cracked, 1 left


Quizás nos interese ver los usuarios root (con UID 0) y que pertenezcan a grupos de super-usuario de los cuales se ha averiguado la clave:

# john --show --users=0 /var/tmp/mypasswd
# john --show --groups=0,1 /var/tmp/mypasswd


También podemos utilizar listas de palabras para los ataques de diccionario externas cargandolas con el parámetro “–wordlist”:

# john --wordlist=diccionario.lst --rules /var/tmp/mypasswd

Por supuesto el proceso puede ser ejecutado en segundo plano:

# john /var/tmp/mypasswd &
# jobs
+ Running john /var/tmp/mypasswd &


Para ver el estado del proceso, ejecutamos john con el parámetro “–status”, que muestra el número de contraseñas conseguidas, el tiempo de ejecución y porcentaje completado:

# john --status
guesses: 2 time: 0:00:03:40 4.3% (2) c/s: 20.60


Finalmente, si tenemos tiempo y CPU para ejecutar el password cracking, podemos hacer uso del parámetro “–incremental”. Es el modo más potente que tiene John The Ripper para sacar las contraseñas, eso sí, ya podéis ir a dar un paseo porque es el más costoso ya que efectua todas las comprobaciones posibles para sacar las contraseñas:

# john --incremental /var/tmp/mypasswd


Hay muchas más opciones y parámetros de utilización, podéis ejecutar el comando “john” sin parámetros para verlos y probar vosotros mismos diferentes combinaciones:

# john
John the Ripper password cracker, ver: 1.7.9-jumbo-5 [linux-x86-sse2]
Copyright (c) 1996-2011 by Solar Designer and others
Homepage: http://www.openwall.com/john/

Usage: john [PASSWORD-FILES]
--config=FILE use FILE instead of john.conf or john.ini
--single[=SECTION] "single crack" mode
--wordlist=FILE --stdin wordlist mode, read words from FILE or stdin
--pipe like --stdin, but bulk reads, and allows rules
--encoding=NAME the input data is in a 'non-standard' character.
encoding. NAME = utf-8, koi8-r, and others. For a
full list, use --encoding=LIST
--rules[=SECTION] enable word mangling rules for wordlist mode
--incremental[=MODE] "incremental" mode [using section MODE]
--markov[=LEVEL[:opts]] "Markov" mode (see documentation)
--external=MODE external mode or word filter
--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
--pot=NAME pot file to use
--format=NAME force hash type NAME: des/bsdi/md5/bf/afs/lm/
dynamic_n/bfegg/dmd5/dominosec/epi/hdaa/ipb2/krb4/
krb5/mschapv2/mysql-fast/mysql/netlm/netlmv2/netntlm/
netntlmv2/nethalflm/md5ns/nt/phps/po/xsha/crc32/
hmac-md5/lotus5/md4-gen/mediawiki/mscash/mscash2/
mskrb5/mssql/mssql05/mysql-sha1/nsldap/nt2/oracle11/
oracle/phpass-md5/pix-md5/pkzip/raw-md4/raw-md5thick/
raw-md5/raw-sha1/raw-sha/raw-md5u/salted-sha1/sapb/
sapg/sha1-gen/raw-sha224/raw-sha256/raw-sha384/
raw-sha512/xsha512/hmailserver/sybasease/crypt/trip/
ssh/pdf/rar/zip/dummy
--subformat=LIST get a listing of all 'dynamic_n' formats
--save-memory=LEVEL enable memory saving, at LEVEL 1..3
--mem-file-size=SIZE size threshold for wordlist preload (default 5 MB)
--field-separator-char=C use 'C' instead of the ':' in input and pot files
--fix-state-delay=N performance tweak, see documentation
--nolog disables creation and writing to john.log file
--crack-status emit a status line whenever a password is cracked
--plugin=NAME[,..] load this (these) dynamic plugin(s)


También se pueden establecer configuraciones personalizadas en el archivo de configuración /etc/john.conf, en todo caso serían configuraciones avanzadas pues para un uso básico de la herramienta con lo que hemos visto en esta entrada es más que suficiente.