Ir al contenido

Herramientas y automatización para WinRM

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

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.

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:

Comparar HTTP y HTTPS
Test-WSMan -ComputerName FQDN
Test-WSMan -ComputerName FQDN -UseSSL

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

Validar el endpoint de sesión
$credential = Get-Credential -Credential 'DOMAIN\USERNAME'
$session = New-PSSession -ComputerName FQDN -Credential $credential
Get-PSSession -Id $session.Id
Remove-PSSession $session

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

Controlar timeouts y garantizar el cierre
$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:

Abrir una sesión desde Linux
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:

Abrir HTTPS con Kerberos, recursos locales y registro
evil-winrm -i FQDN -u USERNAME -S -r DOMAIN.LOCAL \
-s ./scripts -e ./executables -l

Los 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.

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.

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.