三件套的结构
WMI 事件订阅由三部分组成:__EventFilter 定义触发条件(WQL 查询),__EventConsumer 定义要执行的动作,__FilterToConsumerBinding 把两者绑定起来。攻击者配一个开机后按间隔轮询的过滤器加命令行消费者,就得到无文件、无计划任务痕迹的持久化。
排查与误删风险
入口是 root\subscription 命名空间,直接枚举三个类的实例即可。要注意管理软件(SCCM、监控代理)也会留下合法订阅,清除前必须逐个核对名称与命令行指向,避免把监控组件删掉。
基本信息
| 命名空间 | root\subscription |
|---|---|
| 三要素 | __EventFilter、__EventConsumer、__FilterToConsumerBinding |
| 常见触发 | 开机后按 TIMER_INTERVAL 周期执行 |
| 常见消费类 | CommandLineEventConsumer、ActiveScriptEventConsumer |
| 查询方式 | Get-WmiObject 或 Get-CimInstance 指定命名空间 |
| 权限要求 | 查询需管理员,删除需最高权限 |
典型使用场景
- 排查无计划任务、无 Run 键却有周期执行的场景
- 确认是否存在无文件持久化后门
- 核对管理软件订阅是否被冒名替换
- 清除后验证三件套是否彻底移除
- 与其他自启项一起集中清点
枚举订阅三件套
枚举订阅三件套
Get-WmiObject -Namespace root\subscription -Class __EventFilter | Select-Object Name, Query
Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer | Select-Object Name, CommandLineTemplate
Get-WmiObject -Namespace root\subscription -Class ActiveScriptEventConsumer | Select-Object Name, ScriptText
Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding | Select-Object Filter, Consumer
Get-CimInstance -Namespace root\subscription -ClassName __EventFilter | Format-List *输出逐列读法
| 字段 | 含义 | 正常/异常 |
|---|---|---|
| Query | WQL 触发条件 | 出现周期轮询或实例变更触发需重点看 |
| CommandLineTemplate | 实际执行的命令行 | 指向临时目录、脚本宿主或编码命令即高可疑 |
| Filter 与 Consumer | 绑定关系两端 | 只删一侧会留下孤立对象并持续报错 |
| 名称 | 订阅对象名 | 与已知管理软件命名风格不符需逐个解释 |
SCCM、监控代理等管理软件会留下合法订阅:先对照名称与命令行指向,确认用途后再删除,避免告警与补丁分发失效。
清理顺序是 Binding → Consumer → Filter:只删消费者不删绑定会留下悬空引用,WMI 反复报错且持久化并不彻底。
留档后按顺序清理
留档后按顺序清理
Get-WmiObject -Namespace root\subscription -Class __EventFilter | Select-Object * | Format-List > C:\evidence\wmi_filter.txt
Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer | Select-Object Name, CommandLineTemplate
$b = Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding | Where-Object { $_.Consumer -match 'Evil' }
$b | Remove-WmiObject # 先删绑定
Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer | Where-Object { $_.Name -match 'Evil' } | Remove-WmiObject
Get-WmiObject -Namespace root\subscription -Class __EventFilter | Where-Object { $_.Name -match 'Evil' } | Remove-WmiObject清除后要复验的内容
- 重新枚举三个类,确认无残留对象
- 检查 System 与 WMI-Activity 日志中的订阅创建时间
- 确认启动后不再出现异常命令行进程
- 把订阅的完整属性导出留档并可追溯