WMI的攻擊、防御與取證分析技術之防御篇
近日,F(xiàn)ireEye 安全公司的高級逆向工程團隊(FLARE)發(fā)布了一份標題為《 WMI 攻擊,防御與取證分析技術 》的PDF文檔,該文檔頁數(shù)多達90頁,文檔內容主要從攻擊,防御和取證分析這三個角度分篇對WMI 技術做了詳細的描述。其中不乏有很多值得學習思考的地方。于是,我利用業(yè)余時間翻譯整理了此文檔,拿出來與大家共分享 :),如有紕漏,望各位不吝賜教。
為了對原文檔內容進行全面的翻譯和解讀,我按照文章的分析角度對原文檔進行了分段式的翻譯,本篇文章是分段式里面的第二篇,其余兩篇譯文的標題分別為:
《 WMI 的攻擊,防御與取證分析技術之攻擊篇 》
《 WMI 的攻擊,防御與取證分析技術之取證分析篇 》
0x00 WMI 防御
對于每一種WMI的攻擊方式,都有相同數(shù)量的潛在防御措施。
現(xiàn)有的檢測工具
下列工具可以用來檢測和刪除WMI的持久性惡意攻擊程序:
Sysinternals Autoruns
Kansa –– 一個用于事件響應的 PowerShell 模塊
這些工具的缺點是只能在一個特定時間的快照里檢測 WMI 持久性代碼。一旦攻擊者執(zhí)行完他們的操作,他們就會清理掉相關的持久性代碼。然而可以使用 WMI 永久訂閱實時的捕捉攻擊者的 WMI 持久性操作。
通過 EventConsumers 對WMI持久性的檢測是微不足道的。圖 11 中的 PowerShell 代碼會查詢遠程系統(tǒng)上的所有 WMI 持久性項目。

圖 11:檢測遠程系統(tǒng)的 WMI 持久性的 PowerShell 代碼
使用WMI檢測WMI攻擊
目前在WMI 中有極其強大的事件處理子系統(tǒng),因此,WMI 可以被認為是一個你從來不知道的并且已存在的微軟的免費主機 IDS ??紤]到幾乎所有的系統(tǒng)操作都可以觸發(fā) WMI 事件,所以,WMI 可以實時的捕捉許多攻擊行為。請細想下面的攻擊活動以及在 WMI 中它們各自的影響:
1.攻擊者使用 WMI 作為持久性機制
影響: __EventFilter 、__EventConsumer 和 __FilterToConsumerBinding 的實例被創(chuàng)建。__InstanceCreationEvent 事件被觸發(fā)。
2.WMI Shell 工具集被用于 C2 的通道
影響: __Namespace 對象的實例被創(chuàng)建和修改。因此,__NamespaceCreationEvent 和__NamespaceModificationEvent 事件被觸發(fā)了。
3.創(chuàng)建 WMI 類來存儲攻擊者的數(shù)據(jù)
影響:__ClassCreationEvent 事件被觸發(fā)。
4.攻擊者安裝惡意的 WMI 提供程序
影響:__Provider 類的實例被創(chuàng)建,__InstanceCreationEvent事件被觸發(fā)。
5.攻擊者通過 “開始菜單” 和 “注冊表” 進行持續(xù)攻擊
影響:Win32_StartupCommand 類實例被創(chuàng)建,__InstanceCreationEvent事件被觸發(fā)。
6.攻擊者通過其他額外的注冊表值進行持續(xù)攻擊
影響:RegistryKeyChangeEvent 和 RegistryValueChangeEvent 事件被觸發(fā)。
7.攻擊者安裝服務
影響:Win32_Service 類實例被創(chuàng)建,__InstanceCreationEvent 事件被觸發(fā)。
所有的攻擊和上述描述的影響都可以用 WMI 事件查詢來表示。在與事件消費者結合使用時,防御者可以極具創(chuàng)造力的選擇如何檢測和響應攻擊者的操作。例如,防御者可以選擇在創(chuàng)建 Win32_StartupCommand 的任意實例后接收一封電子郵件。
在創(chuàng)建了用于警報攻擊者行為的 WMI 事件時,必須認識到攻擊者也有可能很熟悉 WMI ,并且可以檢查和刪除現(xiàn)有的 WMI 防御事件訂閱。因此,貓和老鼠的游戲就接著開始了。作為最終所采取的防御機制以防止攻擊者刪除你的防御事件訂閱,你可以注冊一個事件訂閱來檢測__InstanceDeletionEvent 事件的 __EventFilter,__EventConsumer 和__FilterToConsumerBinding 對象。然后,如果攻擊者成功地刪除了 WMI 永久防御事件訂閱,防御者將會在刪除時有最后一次機會得到攻擊警報。
緩解措施
除了部署 WMI 永久防御事件訂閱之外,還有幾種可能防止部分或所有正在發(fā)生的 WMI 攻擊的緩解措施。
系統(tǒng)管理員可以禁用 WMI 服務。這對一個組織要考慮它對 WMI 的需要是非常重要的。一定要考慮清楚停止 WMI 服務后所帶來的任何意外情況。因為,Windows 已經越來越依賴于 WMI 和 WinRM 的管理任務。
考慮阻止 WMI 的協(xié)議端口。如果沒有正當?shù)睦碛尚枰h程使用 WMI,可以考慮配置 DCOM 使用單一端口,然后阻止該端口。這是一個比較明智的緩解措施,因為它會阻止遠程 WMI ,但允許該服務在本地運行。
WMI、 DCOM 和 WinRM 的事件會被記錄為下列事件日志:
a. Microsoft-WindowsWinRM/Operational
i. 顯示含有來源 IP 地址的失敗的 WinRM 連接嘗試
b.Microsoft-Windows-WMI-Activity/Operational
i. 包含失敗的 WMI 查詢和可能包含攻擊者活動證據(jù)的方法調用
c.Microsoft-WindowsDistributedCOM
i. 顯示含有來源 IP 地址的失敗的 DCOM 連接嘗試
0x01 公共信息模型 (CIM)
"公共信息模型 (CIM) 是一個開放的標準,它定義了如何將托管的元素在 IT 環(huán)境中表示為一組公共的對象以及它們之間的關系。分布式管理任務組維護 CIM ,允許這些托管的元素獨立于其制造商或供應商的一致管理。WMI 使用 CIM 標準來表示其管理的對象。例如,系統(tǒng)管理員通過 WMI 查詢的系統(tǒng)必須通過標準化的 CIM 命名空間來獲取一個處理對象實例。
WMI 在 CIM 儲存庫中維護了一個所有可管理對象的登記冊。CIM 儲存庫是一個持久性的數(shù)據(jù)庫,它存儲在運行 WMI 服務的本地計算機上。在使用 CIM 時,它維護了所有可管理對象的定義,包括它們之間的關系以及由誰來提供它們的實例。例如,當軟件開發(fā)者通過 WMI 公開自定義應用程序的性能統(tǒng)計時,他們必須先注冊性能指標的描述。這使得 WMI 能夠正確解釋查詢并用良好的格式化數(shù)據(jù)來作響應。
CIM 是面向對象的,支持的特性有 (單一) 繼承、抽象和靜態(tài)屬性、默認值并可以將任意鍵-值對附加到被稱作"限定符"的項目中。
相關的類被分組式的放在分層命名空間之下。類聲明的屬性和方法通過可托管對象公開。屬性是一個包含在類實例中的特定類型數(shù)據(jù)的名稱字段。類定義描述了有關屬性的元數(shù)據(jù),類的實例包含了具體的由 WMI 提供程序填充的值。方法是一個已命名的例程,它在一個類的實例中執(zhí)行,并且是由 WMI 提供程序實現(xiàn)的。類定義描述了其原型 (返回值的類型、 名稱、 參數(shù)類型),但沒有實現(xiàn)過程。限定符是一個可以附加到命名空間、類、屬性和方法的元數(shù)據(jù)的鍵-值對。常見的限定符提供了一個字符串類型的提示的值,以指示客戶端如何去解釋枚舉項和語言代碼頁。
例如,圖 12 列出了一些安裝在純凈版 Windows 10 上的命名空間。請注意,它們可以很簡單的被表示為樹狀。當客戶端沒有聲明其本身的命名空間時, WMI 會選擇 ROOT\CIMV2 命名空間作為默認的命名空間。

圖 12 命名空間 示例
在此安裝的 Windows 中,ROOT\CIMV2 命名空間包含 1,151 個類定義。圖 13 列出了一些在此命名空間中發(fā)現(xiàn)的類。請注意每個類具有一個名稱和一個用于唯一標識類的路徑。按照約定,某些類擁有名為 Description 的限定符,它包含了一個用以描述應如何托管這個類的人類可讀字符串。 WMI Explorer 這個工具提供了用戶友好的界面來獲取 Description 限定符并在網格視圖中顯示它的值。

圖 13 類 示例
圖 14 列出了一些 Win32_LogicalDisk 類實例中已公開的屬性。此類定義聲明了 40 個屬性, Win32_LogicalDisk 類實例包含了每個屬性具體的值。例如,DeviceID 屬性是字符串類型,用于磁盤的唯一標識,所以一個 WMI 客戶端可以枚舉類實例并期望得到像 A:、C:,D: 這樣的值。

圖 14 屬性 示例
圖 15 列出了 Win32_LogicalDisk 類實例中已公開的方法。此類定義聲明了五種方法并且相關聯(lián)的 WMI 提供程序允許客戶端能夠調用 Win32_LogicalDisk 實例的這些方法。面板底部的兩個窗口描述了調用方法必須提供的參數(shù)和返回的數(shù)據(jù)。在此示例中,Chkdsk 方法需要五個布爾型參數(shù)并返回了一個描述操作狀態(tài)的 32 位整數(shù)。請注意, Description 限定符附加到這些方法后其參數(shù)將作為 WMI 客戶端開發(fā)者的 API 文檔。

圖 15 方法 實例
在此安裝的 Windows 中,有三個 Win32_LogicalDisk 類的實例。圖 16 列出了使用它們唯一的實例路徑的類實例。此路徑是通過組合在類名稱中具有限定符的特殊屬性的名稱和值所構成的。在這里,有一個屬性: DeviceID 。每個類實例都是用來自同一個邏輯項目的具體數(shù)據(jù)填充的。

圖 16 類實例 示例
圖 17 列出了 Win32_LogicalDisk 類實例中 C: 磁盤卷的具體的值。注意,并非 40 個屬性都列出在了這里;在類定義中,沒有明確的值的屬性也是沒有默認值的。

圖 17 Win32_LogicalDisk 類實例中 C: 磁盤卷的屬性值
0x02 托管對象格式 (MOF)
WMI 使用托管對象格式(MOF)用于描述 CIM 類的語言。MOF 文件是一個文本文件,包含了指定的可被查詢的事物的語句如該事物的名稱,復雜類的字段類型,對象組相關的權限。語言的結構類似于 Java,相當于受限的 Java 接口聲明。系統(tǒng)管理員可以通過 WMI 使用 MOF 文件擴展 CIM 支持并且 mofcomp.exe 工具可以在 CIM 資料庫中將被格式化的數(shù)據(jù)插入到 MOF 文件中。WMI 提供程序通常是由提供的 MOF 文件定義的,它定義了數(shù)據(jù)和事件類和提供數(shù)據(jù)的 COM DLL 文件。
MOF 是一種面向對象的語言,它由以下部分組成:
命名空間
類
屬性
方法
限定符
實例
引用
注釋
所有在 "公共信息模型 (CIM)" 章節(jié)中所闡述的實體都可以使用 MOF 語言進行描述。以下各章節(jié)將會說明如何使用 MOF 語言來描述 CIM 實體。
MOF 中的命名空間
要在 MOF 中聲明一個 CIM 命名空間,可以使用 #pragma namespace (\\computername\path) 指令。通常,這個語句被發(fā)現(xiàn)在文件的最開始,并且會應用到同一文件內剩余部分的語句。
MOF 語言允許通過聲明父命名空間并定義一個 __namespaceclass 的新實例來創(chuàng)建新的命名空間。例如,我們可以使用在圖 18 中列出的 MOF 文件創(chuàng)建 \\.\ROOT\default\NewNS 命名空間。

圖 18 在 MOF 中創(chuàng)建命名空間
MOF 中的類定義
要在 MOF 中聲明一個類,首先需要定義當前命名空間,然后再使用 class 關鍵字。提供新的類名和所繼承的類。大多數(shù)類都有一個父類,新的 WMI 類的開發(fā)人員應該找到相應的要繼承的類。接下來,描述新的類所支持的屬性和方法。將限定符附加到類,屬性和方法時,會有額外的元數(shù)據(jù)關聯(lián)到一個實體上,如使用目的或枚舉的解釋。使用動態(tài)修飾符用于指示提供程序動態(tài)的創(chuàng)建類的實例。抽象類限定符用于指示該類沒有實例可以創(chuàng)建。讀取屬性限定符用于指示該值是只讀的。
MOF 支持程序員使用的常見的數(shù)據(jù)類型,包括字符串、數(shù)字類型 (uint8、sint8、uint16、sint16 等)、日期 (datetime) 和其他數(shù)據(jù)類型的數(shù)組。
圖 19 列出了在 MOF 中定義類的語句的結構,而圖 20 列出了一個定義了兩個新類: ExistingClass 和 NewClass 的 MOF 示例文件。在 \\.\ROOT\default 命名空間中,可以找到這兩個類。ExistingClass 類有兩個屬性:Name 和 Description。Name 屬性的 Key 限定符指示了它被用于唯一標識此類的一個實例。NewClass 類有四個顯式屬性: Name, Buffer, Modified 和 NewRef。NewClass 也繼承了其基類 ExistingClass 的 Description 屬性。NewClass 被標記了動態(tài)限定符,這意味著相關聯(lián)的 WMI 提供程序將會按需要動態(tài)創(chuàng)建此類的實例。NewClass 有一個名為 FirstMethod 的方法,該方法接受一個 32 位無符號整數(shù)的參數(shù),并返回一個 8 位無符號的整數(shù)值。

圖 19 MOF 類定義結構

圖 20 在 MOF 中創(chuàng)建類定義
MOF中的實例
在 MOF 中定義類的一個實例,需要在類名后使用 instance 關鍵字, 名稱-值的鍵值對列表用來填充具體的屬性值。圖 21 列出了一個創(chuàng)建 \\.\ROOT\default\ExistingClass 類的實例的 MOF 文件,并分別給 Name 和 Description 屬性提供了具體的值 SomeName 和 SomeDescription 。其余字段將會默認填充為 nil 。

圖 21 在 MOF 中創(chuàng)建一個類實例
MOF 中的引用
CIM 類屬性可以通過實例對象路徑引用其他類的現(xiàn)有實例。這被稱為引用。在 MOF 中定義類實例的引用,需要使用 ref 關鍵字作為屬性的數(shù)據(jù)類型的一部分。例如,圖 22 列出的 MOF 語句用于聲明一個命名為 NewRef 的類引用,它指向了 ExistingClass 類的一個實例。

圖 22 在 MOF 中定義類的實例引用
若要設置引用屬性的值,請將屬性的值設置為實例對象路徑用于標識現(xiàn)有的類實例。例如,圖 23 列出的 MOF 語句可以將 NewRef 的屬性設置為帶有 Name 屬性的 ExistingClass 類的實例,這等同于直接使用 SomeName 對 ExistingClass 類實例的 Name 屬性進行賦值。

圖 23 在 MOF 中設置類實例的引用
MOF 中的注釋
MOF 格式支持單行和多行 C 語言風格的注釋。圖 24 列出了各種風格的 MOF 語句定義的注釋。

圖 24 MOF 中的注釋
MOF 自動恢復
WMI 的 CIM 儲存庫實現(xiàn)了 MOF 文件的事務緩存式的插入,以確保數(shù)據(jù)庫不會被破壞。如果在插入的時候系統(tǒng)發(fā)生崩潰或停止, MOF 文件可以被注冊為后續(xù)自動恢復。若要啟用此功能,可以在 MOF 文件頂部使用 #pragma autorecover 語句。這時,WMI 服務將會把 MOF 文件的完整路徑添加到 MOF 文件自動恢復列表中,此列表存儲在以下注冊表項中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs