- OBJECTS.DATA
- INDEX.BTR
- MAPPING<1-3>.MAP
Overview
Windows Management Instrumentation (WMI) allows, through
Event Subscription, to maintain persistence on a Windows system. Permanent
WMI event subscriptions can be configured to persist across system reboots.
Permanent event subscriptions are composed of:
-
An
event filter(__EventFilter), which is the event of interest that will trigger the consumer. Such event can be, for example, a logon success or system startup. -
An
event consumer, which is the action to perform upon trigger of the event filter.Five Consumer classes are available:
-
The
ActiveScriptEventConsumerclass that run arbitraryVBScriptorJScriptcode. -
The
CommandLineEventConsumerclass that run an arbitrary system command. -
The
LogFileEventConsumerclass that write an arbitrary string to a text-based log file. -
The
NtEventLogEventConsumerclass that write an arbitrary WindowsETWevent. -
The
SMTPEventConsumerclass that send an email.
-
-
A
filter to consumer binding(FilterToConsumerBinding) which is the registration mechanism binding an event filter to an event consumer.
WMI Event Subscription can be of two types:
-
Temporary: only active as long as the process that created the subscription is active and run under the privilege of the creating process. -
Permanent: stored in theCIMdatabase on disk and run underNT AUTHORITY\SYSTEMprivileges.
WMI repository files
The persistent WMI Event Subscription are written to disk in the
(undocumented) WMI repository files under
%SystemRoot%\System32\wbem\Repository\ or
%SystemRoot%\System32\wbem\Repository\FS\:
-
OBJECTS.DATA: contains theCIM objectswith, among other things, the event subscriptions data (event consumer, filter, and filter to consumer binding). -
INDEX.BTR: paged file in B-tree structure, “used to efficiently lookup CIM entities in the objects.data file”. -
MAPPING<1-3>.MAP: correlate/map pages fromOBJECTS.DATAandINDEX.BTR.
All three files are required to properly conduct forensics analysis on WMI persistence.
Tool(s)
Live forensics
The SysInternals Autoruns
(GUI) and AutorunsC (CLI) utilities can be used to detect (and delete)
WMI-related persistence.
The WMI event subscriptions can also be enumerated with the PowerShell cmdlet
Get-WMIObject:
ForEach ($NameSpace in "root\subscription","root\default") { Get-WMIObject -Namespace $Namespace -Query "SELECT * FROM __EventFilter" }
ForEach ($NameSpace in "root\subscription","root\default") { Get-WMIObject -Namespace $Namespace -Query "SELECT * FROM __EventConsumer" }
ForEach ($NameSpace in "root\subscription","root\default") { Get-WMIObject -Namespace $Namespace -Query "SELECT * FROM __FilterToConsumerBinding" }
WMI repository files parsing
WMI Event Subscription data can be extracted from OBJECTS.DATA files using
the PyWMIPersistenceFinder
Python script (that rely on regexes to extract the data):
PyWMIPersistenceFinder.py "<OBJECTS.DATA_FILE>"
If a deeper analysis is required, for example if a consumer reference other
WMI objects, python-cim can be
leveraged to extract data from the WMI repository:
python3 samples/dump_class_layout.py win7 "<WMI_REPOSITORY_FOLDER>" "<ROOT\cimv2 | WMI_NAMESPACE>" "<WMI_CLASS_NAME>"
References
View on GitHub