Pass the Hash (PtH)
Un ataque Pass the Hash (PtH) es una técnica en la que un atacante utiliza un hash de contraseña en lugar de la contraseña en texto plano para autenticarse. El atacante no necesita descifrar el hash para obtener la contraseña en texto claro. Los ataques PtH explotan el protocolo de autenticación, ya que el hash de la contraseña permanece estático en cada sesión hasta que la contraseña es cambiada.
Como se discutió en secciones anteriores, el atacante debe tener privilegios administrativos o permisos especiales en la máquina objetivo para obtener un hash de contraseña. Los hashes se pueden obtener de varias maneras, incluyendo:
Volcado de la base de datos SAM local desde un host comprometido.
Extracción de hashes de la base de datos NTDS (ntds.dit) en un Controlador de Dominio.
Extracción de hashes de la memoria (lsass.exe).
Supongamos que obtenemos el hash de contraseña (64F12CDDAA88057E06A81B54E73B949B) para la cuenta julio del dominio inlanefreight.htb. Veamos cómo podemos realizar ataques Pass the Hash desde máquinas Windows y Linux.
Nota: Las herramientas que utilizaremos están ubicadas en el directorio
C:\tools
en el host objetivo. Una vez que inicies la máquina y completes los ejercicios, podrás usar las herramientas en ese directorio. Este laboratorio contiene dos máquinas: tendrás acceso a una (MS01), y desde allí te conectarás a la segunda máquina (DC01).
Introducción a Windows NTLM
El New Technology LAN Manager (NTLM) de Microsoft es un conjunto de protocolos de seguridad que autentican la identidad de los usuarios y protegen la integridad y confidencialidad de sus datos. NTLM es una solución de inicio de sesión único (SSO) que utiliza un protocolo de desafío-respuesta para verificar la identidad del usuario sin que este proporcione su contraseña.
A pesar de sus fallos conocidos, NTLM sigue siendo comúnmente utilizado para garantizar la compatibilidad con clientes y servidores heredados, incluso en sistemas modernos. Aunque Microsoft sigue soportando NTLM, Kerberos ha tomado su lugar como el mecanismo de autenticación predeterminado en dominios de Active Directory (AD) desde Windows 2000.
Con NTLM, las contraseñas almacenadas en el servidor y en el controlador de dominio no están "saladas", lo que significa que un atacante con un hash de contraseña puede autenticar una sesión sin conocer la contraseña original. A esto lo llamamos un ataque Pass the Hash (PtH).
Pasar el Hash con Mimikatz (Windows)
La primera herramienta que utilizaremos para realizar un ataque PtH es Mimikatz. Mimikatz tiene un módulo llamado sekurlsa::pth
que permite realizar un ataque Pass the Hash iniciando un proceso utilizando el hash de la contraseña del usuario. Para usar este módulo, necesitaremos lo siguiente:
/user
- El nombre del usuario que queremos suplantar./rc4
o/NTLM
- El hash NTLM de la contraseña del usuario./domain
- El dominio al que pertenece el usuario a suplantar. En el caso de una cuenta de usuario local, podemos usar el nombre del equipo,localhost
, o un punto (.)./run
- El programa que queremos ejecutar con el contexto del usuario (si no se especifica, lanzarácmd.exe
).
Ejemplo de Pass the Hash desde Windows usando Mimikatz:
Ahora podemos usar cmd.exe
para ejecutar comandos en el contexto del usuario. En este ejemplo, julio puede conectarse a una carpeta compartida llamada julio en el DC.
Pasar el Hash con PowerShell Invoke-TheHash (Windows)
Otra herramienta que podemos usar para realizar ataques PtH en Windows es Invoke-TheHash. Esta herramienta es una colección de funciones de PowerShell para realizar ataques Pass the Hash con WMI y SMB. Las conexiones WMI y SMB se acceden a través del .NET TCPClient. La autenticación se realiza pasando un hash NTLM al protocolo de autenticación NTLMv2. No se requieren privilegios de administrador local en el lado del cliente, pero el usuario y el hash que usamos para autenticarnos necesitan tener derechos administrativos en la computadora objetivo.
En este ejemplo usaremos al usuario julio y el hash 64F12CDDAA88057E06A81B54E73B949B.
Al usar Invoke-TheHash, tenemos dos opciones: ejecución de comandos con SMB o WMI. Para usar esta herramienta, debemos especificar los siguientes parámetros para ejecutar comandos en la computadora objetivo:
Target - Nombre de host o dirección IP del objetivo.
Username - Nombre de usuario para la autenticación.
Domain - Dominio para la autenticación. Este parámetro no es necesario con cuentas locales o al usar
@dominio
después del nombre de usuario.Hash - Hash NTLM de la contraseña para autenticación. Este comando acepta el formato LMo NTLM.
Command - Comando a ejecutar en el objetivo. Si no se especifica un comando, la función verificará si el usuario y el hash tienen acceso a WMI en el objetivo.
El siguiente comando usará el método SMB para ejecutar un comando y crear un nuevo usuario llamado mark y agregarlo al grupo de Administradores.
Listener de Netcat y Reverse Shell
Podemos obtener una conexión de reverse shell en la máquina objetivo utilizando Netcat. Por ejemplo, si nuestra máquina Windows tiene la dirección IP 172.16.1.5, podemos iniciar un listener en el puerto 8001.
Para crear una simple reverse shell usando PowerShell, podemos visitar https://www.revshells.com, establecer nuestra IP 172.16.1.5 y puerto 8001, y seleccionar la opción PowerShell #3 (Base64).
Invoke-TheHash con WMI (Windows)
Invoke-TheHash
es un módulo de PowerShell que permite ejecutar comandos en sistemas remotos utilizando el hash de una contraseña. En este caso, se emplea el hash NTLM para ejecutar un comando PowerShell en el objetivo DC01
.
En este caso, el comando ejecutado con éxito en DC01
da como resultado una shell inversa desde el host DC01
.
Pass the Hash con Impacket PsExec (Linux)
Impacket es una colección de scripts en Python que permiten realizar diversas operaciones, como la ejecución de comandos y la autenticación en sistemas remotos. Con impacket-psexec
, se puede ejecutar comandos en un sistema remoto utilizando el hash NTLM de una cuenta.
Este comando crea una sesión remota en la máquina con dirección 10.129.201.126
usando el hash proporcionado.
Pass the Hash con CrackMapExec (Linux)
CrackMapExec
es una herramienta muy utilizada para evaluar redes de Active Directory. Con ella, puedes autenticarte en varios hosts de una red para identificar aquellos donde puedas ejecutar comandos.
Ejemplo de uso con Pass the Hash:
Este comando realiza un intento de autenticación en todos los hosts de la red 172.16.1.0/24
usando el hash del administrador. Si el intento es exitoso en alguno de los hosts, se muestra como "Pwn3d!" en la salida.
Pass the Hash con Evil-WinRM (Linux)
Evil-WinRM
es otra herramienta que permite la autenticación remota en sistemas Windows utilizando PowerShell Remoting. Puedes autenticarse usando un hash en lugar de la contraseña:
Esto abrirá una sesión de PowerShell en la máquina remota 10.129.201.126
con el usuario Administrator
usando el hash proporcionado.
Pass the Hash con RDP (Linux)
También se puede usar el protocolo RDP para realizar un ataque Pass the Hash y obtener acceso gráfico a una máquina remota. Esto se hace con xfreerdp
:
Esto intentará conectarse a la máquina con RDP usando el hash en lugar de la contraseña.
Consideraciones:
UAC (User Account Control) puede limitar el alcance de estos ataques en cuentas locales.
En algunos casos, es necesario habilitar Restricted Admin Mode en el host objetivo para que el ataque funcione correctamente.
Para ello, puedes agregar la siguiente clave al registro del sistema en la máquina objetivo:
Last updated