0x00 背景
WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机,WMI 采用统一的、基于标准的、可扩展的面向对象接口,可以直接调用 WMI 接口来检索性能数据,管理事件日志、文件系统、打印机、进程、注册表设置、计划程序、安全性、服务、共享以及很多其他的操作系统组件和配置设置,使系统开发者可以与 Windows 管理信息进行交互,自从 WMI 被 Stuxnet 用于持久化控制后,越来越多的安全研究人员开始关注 WMI 技术。此后,攻击者同样开始关注 WMI 技术,他们使用这种技术来侦探系统环境、检测反病毒软件和虚拟机环境、执行代码、持久化控制、窃取数据等。
0x01 WMI 命名空间
WMI 引入了命名空间的概念。命名空间是为了把一些类和类的实例更好地管理而定义的把这些类和实体集合起来的一个团体。命名空间可以相互联系和组织成一个具有任意层次的由类和类的实例构成的网状结构。在同一个层次的情况下,命名空间必须具有互异的名称。
WMI 主要有以下几种命名空间:
WMI 包括两个组件:含有 WMI 核心的 WMI 服务和 WMI 存储库。WMI 存储库是由 WMI 命名空间组织的。在系统启动时,WMI 服务会创建如 root\default、root\cimv2 和 root\subscription 等 WMI 命名空间,同时会预安装一部分 WMI 类的定义信息到这些命名空间中,例如 Win32 类。
-
root\default:与 Windows 注册表操作有关的主机类,可以读取、写入、枚举、监视、创建、删除注册表项和值。
-
root\cimv32:包含从 CIM 存储库派生的类,提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM 用户及组等 Win32 信息资源。
-
root\Security:用于与 Windows 安全有关的类。
-
root\WMI:提供对 WDM 设备驱动程序中信息访问的类。
分类
|
WMI 接口
|
命名空间
|
类
|
属性/方法
|
制造商
|
Root/cimv2
|
Win32_Computer
System
|
属性:Manufacturer(制造商)、 Model(型号)
|
CPU
|
Root/cimv2
|
Win32_Processor
|
属性:Name(CPU 基本情况) Manufacturer(制造商)、 ExtClock(外部时钟频率)、 L2CacheSize(二级缓存大小)
|
内存
|
Root/cimv2
|
Win32_Computer
System
|
属性:TotalPhysicalMemory(内存大小)
|
硬盘
|
Root/cimv2
|
Win32_DiskDrive
|
属性:InterfaceType(类型)、 Size(容量)、Signature(序列号)
|
Win32_LogicalDisk
|
属性:DeviceID(驱动器名称)、Size(盘容量)、FileSystem(文件系统格式)
|
网卡
|
Root/cimv2
|
Win32_Network Adapter
|
属性:Name(型号)、Manufacturer(制造商)、NetConnectionID(网络连接名称)
|
打印机
|
Root/cimv2
|
Win32_Printer
|
属性:Name(名称)、Default(是否默认打印机)、PrintStatus(打印机状态)
|
主机名、域名、
工作组名
|
Root/cimv2
|
Win32_Computer
System
|
属性:Name(主机名)、Domain(域名)、Workgroup(工作组名)
|
应用软件
查询
|
Root/cimv2
|
StdRegProv
|
方法:
REG_SZ:GetString Value
REG_BINARY:GetBinary Value
REG_DOWRK:GetDWORD value
REG_MULTI_SZ:GetMultiString Value
|
杀毒软件
|
Root\SecurityCenter2
|
AntiVirusProduct
|
属性:DisplayName(名称) VersionNumber(版本)
|
防火墙
|
Root\SecurityCenter
|
FirewallProduct
|
属性:DisplayName(名称) VersionNumber(版本)
|
账户信息
|
Root/ cimv2
|
Win32_UserAccount
|
属性:Name(名称)、Disabled(是否停用)、Lockout(是否锁定)、PasswordExpires(密码是否永不过期)
|
信息查询
|
Root/ cimv2
|
Win32_Process
|
属性:Name(进程名称)、 ProcessID(PID)、ExecutablePath(执行文件路径)
|
0x02 WMI 查询
WMI 提供了一种查询语言 WQL,可以查询 WMI 任何托管资源。WQL 是 ANSI SQL 的一个子集,与 SQL 语言相似,但它只能用于数据提取,不能创建、修改和删除类或实例。
服务查询
SELECT * from Win32_Service
共享查询
SELECT * from Win32_Share
进程查询
SELECT * from Win32_Process
用户查询
0x03 WMI 常用命令
杀毒软件检测
Get-WmiObject -Namespace root\SecurityCenter2 -Class AntiVirusProduct
虚拟机检测
wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_ComputerSystem GET NumberOfLogicalProcessors,TotalPhysicalMemory /FORMAT:list
查询补丁信息
wmic qfe get Caption,Description,HotFixID,InstalledOn
0x04 持久化原理
WMI 包含一个事件机制,用来通知 WMI 数据和服务的变化。当特定的事件发生时,WMI 事件类就会提供通知。当有类的实例创建,删除或修改时,就会触发事件类,常见的事件类如下:
_InstanceModificationEvent
_ClassCreationEvent
_ClassDeletionEvent
_ClassModificationEvent
_NamespaceCreationEvent
_NamespaceDeletionEvent
_NamespaceModificationevent
_Instance Creation Event
_Instance Deletion Event
事件类的名字代表着它们发生变化的类型。WMI 可以直接检测到静态数据的变化,例如那些保存在 CIM 存储库中的类,实例或属性。如果是动态数据,WMI 则通过事件订阅的方式检测其变化。在这两种情况下,WMI 一旦检测到变化,将会查看该变化是否被用户订阅,若有则通知用户。
WMI 事件筛选器用于执行WQL事件查询。
SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'
CommandLineEventConsumer 类是 WMI 提供的标准事件使用者之一,在CommandLineEventConsumer 类中可以设置 ExecutablePath 等属性,执行所需的可执行文件,如下所示: