EventFilter(事件过滤器)存储在一个ROOT\subscription:__EventFilter对象的实例里,其主要作用是使用WMI的查询语言来过滤审核特定的事件,一个事件过滤器接受一个WMI事件查询参数,同时EventFilter事件过滤器可以对Intrinsic Events (内部事件)和Extrinsic Events (外部事件)进行事件查询。
我们在创建、删除、修改WMI类或类实例以及命名空间时所产生的事件,都可以称之为是内部事件,每个内部事件类都代表了一种特定类型的更改,内部事件作为系统类存在于每个命名空间中,一般情况下,WMI为存储在WMI存储库中的对象创建内部事件,提供程序为动态类生成内部事件,如果没有可用的提供程序,WMI将会为动态类创建一个实例,以下为WMI用于报告内部事件的系统类。
__ClassCreationEvent \\创建类时通知消费者
__ClassDeletionEvent \\当类被删除时通知消费者
__ClassModificationEvent \\当类被修改时通知消费者
__InstanceCreationEvent \\创建类实例时通知消费者
__InstanceOperationEvent \\当任何实例事件发生时通知消费者
__InstanceDeletionEvent \\当实例被删除时通知消费者
__InstanceModificationEvent \\当实例被修改时通知消费者
__NamespaceCreationEvent \\创建命名空间时通知使用者
__NamespaceDeletionEvent \\当命名空间被删除时通知消费者
__NamespaceModificationEvent \\当命名空间被修改时通知消费者
__ConsumerFailureEvent \\当某个其他事件由于事件消费者的失败而被丢弃时通知消费者。
__EventDroppedEvent \\当一些其他事件被丢弃而不是传递给请求事件的消费者时通知消费者。
__EventQueueOverflowEvent \\当由于传递队列溢出而丢弃事件时通知使用者。
__MethodInvocationEvent \\当方法调用事件发生时通知消费者。
外部事件是非系统类预定义事件,WMI使外部事件提供程序直接定义描述事件的事件类(例如:当计算机切换到待机模式的事件为外部事件时),与内部事件相比较而言,外部事件能够及时响应触发,解决了内部事件时间间隔的问题,虽说外部的事件通常不会包含太多的信息,但其事件功能还是及其强大的,以下为常见的外部事件类:
ROOT\CIMV2:Win32_ComputerShutdownEvent ROOT\CIMV2:Win32_IP4RouteTableEvent ROOT\CIMV2:Win32_ProcessStartTrace ROOT\CIMV2:Win32_ModuleLoadTrace ROOT\CIMV2:Win32_ThreadStartTrace ROOT\CIMV2:Win32_VolumeChangeEvent ROOT\CIMV2:Msft_WmiProvider* ROOT\DEFAULT:RegistryKeyChangeEvent ROOT\DEFAULT:RegistryValueChangeEvent
EventConsumer指的是当事件传递给此类时执行的命令动作,也可以理解为我们希望在事件触发时发生的特定操作,例如:当事件传递给EventConsumer类时,直接执行commandLineEventConsumer 执行一条命令"函数。事件的消费者大体可分为“临时事件消费者”和“永久事件消费者”两类
只在运行期间关心处理特定的事件(本地事件生命周期即为宿主进程的运行时间)临时事件使用者必须手动启动,并且不能在 WMI 重新启动或操作系统重新启动后持续存在。临时事件使用者只能在其运行时处理事件。
类实例注册在WMI命名空间中,一直有效直至注销(永久性的WMI事件是持久性驻留的,并且以SYSTEM权限运行,重启后仍然还在),永久事件使用者一直运行到其注册被显式取消,然后在 WMI 或系统重新启动时启动。永久事件消费者是系统上WMI类、过滤器和COM对象的组合。
在Event Consumers中,系统提供了如下WMI预安装的永久使用者的类,它们都属于Root\CTMV2以及ROOT\DEFAULT这两个命名空间中,我们可以创建这些类的实例以提供永久消费者类,以提供在过滤器中指定的事件触发时响应的逻辑消费者,例如使用ActiveScriptEventConsumer类执行VBScript/JScript脚本代码程序。
LogFileEventConsumer \\将事件数据写入到指定的日志文件
ActiveScriptEventConsumer \\允许执行任意脚本(VBScript/JScript)
NTEventLogEventConsumer \\创建一个包含事件数据的日志入口点
SMTPEventConsumer \\将事件数据用邮件发送
CommandLineEventConsumer \\执行一个命令
从红队的角度来看,我们比较关注两个类为可以执行VBScript/JScript脚本代码程序的ActiveScriptEventConsumer类,以及可以运行任意命令的CommandLineEventConsumer类,这两个类为我们提供了很大的灵活性,供我们执行任何的Payload,完美实现无文件写入。
FilterToConsunmerBinding是将过滤审核特定的事件和当事件传递给此类时执行命令动作绑定在一起,以此来明确什么事件由什么消费者处理负责, 如下代码是通过创建FilterToConsumerBinding类的实例来将EventFilter和EventConsumer这两个实例连接绑定一起。
instance of __FilterToConsumerBinding
{
Filter = $EventFilter;
Consumer = $Consumer;
};
永久事件订阅是存储在CIM存储库中的一组静态WMI类,我们可以通过MOF的方式分四个步骤来创建永久事件订阅,如下是具体的步骤,以及创建永久事件订阅模版的MOF示例。
1.将上下文更改为Root\Subscription,命名空间所有标准使用者类都在那里注册
#pragma namespace("\\\\.\\root\\subscription")
2.创建_EventFilter类的实例并使用其查询属性来存储您的WQL事件查询。
instance of __EventFilter as $EventFilter
{
Name = "Event Filter Instance Name";
EventNamespace = "Root\\Cimv2";
Query = "WQL Event query text";
QueryLanguage = "WQL";
};
3.创建_EventConsumer派生类的实例。(ActiveScriptEventConsumer SMTPEventConsumer等)
instance of __EventConsumer derived class as $Consumer
{
Name = "Event Consumer Instance";
// Specify any other relevant properties.
};
4.通过创建__FilterToConsumerBinding类的实例。
instance of __FilterToConsumerBinding
{
Filter = $EventFilter;
Consumer = $Consumer;
};
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。