Herramientas y automatización para WinRM
El workflow WinRM distingue WS-Management, autenticación y endpoint de PowerShell. Un 401 identifica una barrera HTTP. No confirma que una cuenta pueda crear una PSSession.
Selección
Sección titulada «Selección»| Pregunta | Herramienta | Diferencia |
|---|---|---|
| ¿responde WS-Man? | Test-WSMan |
cliente nativo y respuesta Identify |
| ¿abre PowerShell Remoting? | New-PSSession |
valida endpoint y autorización |
| ¿abre shell desde Linux? | Evil-WinRM | cliente práctico, no inventario |
| ¿funciona una credencial a escala? | NetExec | validación masiva que requiere control |
-ComputerName FQDN fija el host remoto. -UseSSL cambia el transporte a HTTPS y, con ello, el listener que debe existir y el certificado que debe validar el cliente:
Test-WSMan -ComputerName FQDNTest-WSMan -ComputerName FQDN -UseSSLPara una sesión persistente, New-PSSession recibe destino, credencial y, si procede, configuración. -Credential $credential utiliza el objeto creado por Get-Credential. Remove-PSSession cierra la sesión remota y libera sus recursos:
$credential = Get-Credential -Credential 'DOMAIN\USERNAME'$session = New-PSSession -ComputerName FQDN -Credential $credentialGet-PSSession -Id $session.IdRemove-PSSession $sessionNew-PSSessionOption permite separar el tiempo de apertura del tiempo de operación. -OpenTimeout y -OperationTimeout reciben milisegundos. El segundo controla las comprobaciones de una conexión WinRM viva, no la duración máxima del proceso remoto. -SessionOption $options aplica esos límites a New-PSSession. -ErrorAction Stop convierte un error no terminante en una excepción que un script puede registrar y tratar. La sesión se elimina en finally aunque falle la comprobación:
$credential = Get-Credential -Credential 'DOMAIN\USERNAME'$options = New-PSSessionOption -OpenTimeout 15000 -OperationTimeout 60000$session = $null
try { $session = New-PSSession -ComputerName FQDN -UseSSL ` -Credential $credential -SessionOption $options -ErrorAction Stop Get-PSSession -Id $session.Id}finally { if ($null -ne $session) { Remove-PSSession $session }}La ausencia de sesión tras quince segundos acota apertura, DNS, TCP, TLS o autenticación inicial. Una operación que supera sesenta segundos requiere revisar la respuesta WS-Man y las cuotas antes de ampliar el valor.
Evil-WinRM 3.9 usa -i para el destino y -u para el usuario. Omite -p para que solicite el secreto:
evil-winrm -i FQDN -u 'DOMAIN\USERNAME'-S selecciona HTTPS. -r fija el realm Kerberos y exige DNS, hora, SPN y ticket coherentes. -s registra un directorio local de scripts de PowerShell, -e hace lo mismo para ejecutables y -l guarda la sesión:
evil-winrm -i FQDN -u USERNAME -S -r DOMAIN.LOCAL \ -s ./scripts -e ./executables -lLos directorios deben contener solo recursos aprobados para esa operación. El registro confirma comandos y respuestas, pero puede conservar rutas, nombres de cuenta y output sensible. Revisa su ubicación al terminar y retíralo durante el cleanup definido para la evidencia.
NetExec puede comprobar múltiples hosts. Limita objetivos, hilos y cuentas. Conserva si el resultado indica autenticación, acceso administrativo o ejecución. Confirma una muestra con PowerShell o Evil-WinRM.
NSE y HTTP
Sección titulada «NSE y HTTP»No existe un único script NSE que modele WinRM completo. http-title, http-headers y http-auth-finder pueden describir la capa HTTP, pero una respuesta genérica no demuestra WS-Man. Valida /wsman con un cliente que envíe SOAP válido. En HTTPS, conserva certificado y hostname.
Diagnóstico
Sección titulada «Diagnóstico»Comprueba en orden: ruta TCP, TLS, respuesta HTTP, mecanismo, formato del usuario, SPN, autorización del endpoint y configuración JEA. TrustedHosts es una decisión del cliente y suele aparecer al usar IP o workgroup. No lo amplíes globalmente para ocultar un problema de identidad.