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 pruebas:1234:505: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 [1]+ 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 [OPTIONS] [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.