Was ist eine WMI Event Subscription?
WMI (Windows Management Instrumentation) kann eine Aktion ausführen, wenn etwas geschieht. Eine permanente Event Subscription besteht aus drei Teilen: einem __EventFilter (eine WQL-Abfrage, die das Ereignis beschreibt), einem Event Consumer (was zu tun ist: eine Befehlszeile oder ein VBScript/JScript ausführen, eine Protokollzeile, einen Ereignisprotokolleintrag oder eine E-Mail schreiben) und einem __FilterToConsumerBinding, das beide verknüpft.
Subscriptions werden im WMI-(CIM-)Repository gespeichert und überstehen Neustarts. Ihre Aktionen laufen als SYSTEM — eine Befehlszeile, gestartet vom WMI-Provider-Host (WmiPrvSE.exe), oder ein Skript, ausgeführt von scrcons.exe — ohne Eintrag in einem Run-Schlüssel oder einer geplanten Aufgabe. Deshalb nutzen Angreifer sie für Persistenz (MITRE ATT&CK T1546.003), und deshalb werden sie leicht übersehen.
Wo sie gespeichert ist
- C:\Windows\System32\wbem\Repository\OBJECTS.DATA — jede Klassendefinition und Instanz, in Seiten zu 8 KiB. Freigegebene Seiten behalten ihren alten Inhalt, bis sie wiederverwendet werden.
- INDEX.BTR — ein B-Baum aus Schlüsseln wie NS_<hash>\CI_<hash>\IL_<hash>.<page>.<record>.<length>, wobei jeder Hash der SHA-256 (MD5 unter XP) eines in Großbuchstaben umgewandelten Namens ist.
- MAPPING1.MAP, MAPPING2.MAP, MAPPING3.MAP — Zuordnungen logischer zu physischen Seiten für OBJECTS.DATA und INDEX.BTR; Windows hält drei Generationen vor und verwendet die neueste.
- Subscriptions liegen normalerweise im Namespace root\subscription, aber jeder Namespace funktioniert.
Was dieses Tool zeigt
- Jedes Binding zusammen mit seinem Filter (der auslösenden Abfrage) und seinem Consumer (Befehlszeile, Skript, Protokolldatei oder Ziel-Ereignisprotokoll).
- Zwei Wege, jedes Objekt zu finden, immer gekennzeichnet: strukturiert (über INDEX.BTR und die aktuelle MAPPING-Datei, wie python-cim) und Carving (ein Scan von ganz OBJECTS.DATA nach Datensatz-Headern und Binding-Text, wie PyWMIPersistenceFinder).
- Gelöschte und ältere Versionen von Objekten, wiederhergestellt aus freigegebenen Seiten und Page Slack und von aktiven Objekten unterschieden, sofern die MAPPING-Dateien vorliegen.
- Begründete Befunde: kodiertes PowerShell, benutzerbeschreibbare Pfade, Skript-Consumer, Persistenz-Auslöser (Laufzeit, Anmeldung, Timer), Bindings außerhalb von root\subscription, ungebundene oder defekte Teile sowie die Windows-eigenen Standards (SCM Event Log und BVT), anhand von Name und Inhalt erkannt.
- Auf Rechnern mit dem Configuration-Manager-Client: CCM_RecentlyUsedApps als Ausführungsnachweis — Pfad, Benutzer, LastUsedTime, Startanzahl und Versionsinformationen, einschließlich älterer Kopien aus freiem Speicher, mit Zeitraum und Befunden.
Einschränkungen
- WMI-Subscription-Objekte tragen keine dokumentierten Zeitstempel. Jeder Instanz-Header enthält zwei undokumentierte FILETIMEs, die als Hinweise angezeigt werden; die Subscription-Ansichten haben keinen Zeitfilter (die SCCM-Ansicht schon: LastUsedTime ist eine echte Zeit).
- Gecarvte Datensätze haben keinen Namespace, und ein über nicht benachbarte freigegebene Seiten verteilter Datensatz ist eventuell nur teilweise lesbar.
- Ohne INDEX.BTR und eine MAPPING-Datei stammen die Klassenlayouts aus einer integrierten Kopie der Windows-Standardklassen (an jedem Datensatz validiert), und aktive und gelöschte Datensätze lassen sich nicht unterscheiden.
- MOF-Dateien, die AutoRecover-Liste und andere Persistenzorte sind nicht abgedeckt; das Layout von Windows XP wird unterstützt, ist aber weniger getestet.
So erhalten Sie die Dateien
- Sichern Sie den gesamten Repository-Ordner mit KAPE (Target WBEM), Velociraptor (Windows.Triage.Targets, WBEM) oder aus einem Datenträger-Image.
- Lesen Sie die Dateien auf einem laufenden System aus einer Volumeschattenkopie, damit alle vom selben Zeitpunkt stammen. Beenden Sie niemals den WMI-Dienst, um sie zu kopieren.
- Bewahren Sie auch ältere Kopien auf (Schattenkopien, Windows.old): Eine gelöschte Subscription kann dort noch vorhanden sein.
Danksagungen und Methode
- flare-wmi / python-cim — Willi Ballenthin, FireEye (now Mandiant). Die Repository-Strukturen — MAPPING-Dateien, INDEX.BTR-Seiten, Inhaltsverzeichnis von OBJECTS.DATA, Header von Klassendefinitionen und Instanzen — sind aus python-cim portiert, und der strukturierte Modus folgt dessen Objektauflösung. Apache-2.0.
- PyWMIPersistenceFinder — David Pany, Mandiant. Der String-Carving-Durchlauf folgt dessen Idee: __FilterToConsumerBinding-Text und seine Referenzen EventConsumer.Name / __EventFilter.Name irgendwo in OBJECTS.DATA finden und die Bindings BVT und SCM Event Log als übliche Standards behandeln. MIT.
- WMI Attacks, Defense and Forensics (DEF CON 23) — William Ballenthin, Matt Graeber, Claudiu Teodorescu (FireEye, 2015). Der Vortrag (und das begleitende White Paper), der das Repository-Format und WMI-Persistenz dokumentiert hat; Folien und Demos liegen im Repository flare-wmi.
- [MS-WMIO]: WMI Encoding Version 1.0 Protocol — Microsoft. Die öffentliche Spezifikation der Objektkodierung in jedem Datensatz: Klassenteile, NdTable, Wertetabelle, Heap und kodierte Strings.
FAQ
Wird mein Repository irgendwohin hochgeladen?
Nein. Der Parser ist in Rust geschrieben, nach WebAssembly kompiliert und läuft in einem Web Worker in Ihrem Browser. Es gibt keinen Upload-Endpunkt.
Reicht OBJECTS.DATA aus?
Ja, um Subscriptions zu finden: Der Carving-Modus durchsucht jedes Byte nach Datensätzen von Filtern, Consumern und Bindings, auch gelöschten. Mit INDEX.BTR und den MAPPING-Dateien erhalten Sie zusätzlich die Namespaces und eine verlässliche Einstufung als aktiv oder gelöscht.
Was bedeuten „Index“, „Gecarvter Datensatz“ und „String-Treffer“?
Sie geben an, wie ein Objekt gefunden wurde. Index: über INDEX.BTR und die aktuelle MAPPING-Datei, das Objekt ist also aktiv. Gecarvter Datensatz: Sein Datensatz-Header wurde beim Scan von OBJECTS.DATA gefunden; ist er nicht zusätzlich indiziert, liegt er in freigegebenem Speicher. String-Treffer: Nur der Text des Bindings ist erhalten, so wie PyWMIPersistenceFinder Bindings findet.
Sind SCM Event Log Consumer und BVTConsumer bösartig?
Nein, wenn sie der Windows-Installation entsprechen: Das Binding SCM Event Log ist ab Windows Vista enthalten, und das Binding BVT (cscript KernCap.vbs) ist ein harmloses Überbleibsel auf Images der Windows-7-Ära. Das Tool prüft auch den Inhalt und markiert einen Standardnamen mit abweichendem Inhalt.
Lässt sich feststellen, wann eine Subscription erstellt wurde?
Nicht zuverlässig. Das Repository speichert keinen dokumentierten Zeitstempel pro Objekt. Jeder Instanz-Header hat zwei FILETIMEs, die oft dem Schreibzeitpunkt der Instanz folgen; sie werden als Hinweise angezeigt. Korrelieren Sie mit Ereignis-ID 5861 in Microsoft-Windows-WMI-Activity/Operational, das neue permanente Consumer protokolliert.
Was ist die Ansicht Ausführungsnachweise (SCCM)?
Auf Rechnern mit dem Configuration-Manager-Client (SCCM / ConfigMgr) enthält das Repository auch CCM_RecentlyUsedApps in root\ccm\SoftwareMeteringAgent: einen Datensatz pro ausführbarer Datei und Benutzer mit LastUsedTime (letzter Start durch diesen Benutzer, ein CIM DATETIME mit eigenem UTC-Versatz), einer Startanzahl und den Versionsinformationen der Datei. Das Tool liest ihn aus derselben OBJECTS.DATA, carvt ältere Kopien aus freiem Speicher und bietet einen Zeitraum. Ohne ConfigMgr-Client gibt es diese Daten nicht.