WMI 的攻擊,防禦與取證分析技術之防禦篇

wyzsk發表於2020-08-19
作者: Her0in · 2015/11/09 10:34

近日,FireEye 安全公司的高階逆向工程團隊(FLARE)釋出了一份標題為《 WMI 攻擊,防禦與取證分析技術 》的 PDF 文件,該文件頁數多達 90 頁,文件內容主要從攻擊,防禦和取證分析這三個角度分篇對 WMI 技術做了詳細的描述。其中不乏有很多值得學習思考的地方。於是,我利用業餘時間翻譯整理了此文件,拿出來與大家共分享 :),如有紕漏,望各位不吝賜教。

為了對原文件內容進行全面的翻譯和解讀,我按照文章的分析角度對原文件進行了分段式的翻譯,本篇文章是分段式裡面的第二篇,其餘兩篇譯文的標題分別為:

0x00 WMI 防禦


對於每一種 WMI 的攻擊方式,都有相同數量的潛在防禦措施。

現有的檢測工具

下列工具可以用來檢測和刪除 WMI 的永續性惡意攻擊程式:

  • Sysinternals Autoruns
  • Kansa –– 一個用於事件響應的 PowerShell 模組

這些工具的缺點是隻能在一個特定時間的快照裡檢測 WMI 永續性程式碼。一旦攻擊者執行完他們的操作,他們就會清理掉相關的永續性程式碼。然而可以使用 WMI 永久訂閱實時的捕捉攻擊者的 WMI 永續性操作。

透過 EventConsumers 對 WMI 永續性的檢測是微不足道的。圖 11 中的 PowerShell 程式碼會查詢遠端系統上的所有 WMI 永續性專案。

圖 11:檢測遠端系統的 WMI 永續性的 PowerShell 程式碼

使用 WMI 檢測 WMI 攻擊

目前在 WMI 中有極其強大的事件處理子系統,因此, WMI 可以被認為是一個你從來不知道的並且已存在的微軟的免費主機 IDS 。考慮到幾乎所有的系統操作都可以觸發 WMI 事件,所以,WMI 可以實時的捕捉許多攻擊行為。請細想下面的攻擊活動以及在 WMI 中它們各自的影響:

1.攻擊者使用 WMI 作為永續性機制

  • 影響: __EventFilter__EventConsumer__FilterToConsumerBinding 的例項被建立。__InstanceCreationEvent 事件被觸發。

2.WMI Shell 工具集被用於 C2 的通道

  • 影響: __Namespace 物件的例項被建立和修改。因此,__NamespaceCreationEvent__NamespaceModificationEvent 事件被觸發了。

3.建立 WMI 類來儲存攻擊者的資料

  • 影響:__ClassCreationEvent 事件被觸發。

4.攻擊者安裝惡意的 WMI 提供程式

  • 影響:__Provider 類的例項被建立,__InstanceCreationEvent事件被觸發。

5.攻擊者透過 “開始選單” 和 “登錄檔” 進行持續攻擊

  • 影響:Win32_StartupCommand 類例項被建立,__InstanceCreationEvent事件被觸發。

6.攻擊者透過其他額外的登錄檔值進行持續攻擊

  • 影響:RegistryKeyChangeEventRegistryValueChangeEvent 事件被觸發。

7.攻擊者安裝服務

  • 影響:Win32_Service 類例項被建立,__InstanceCreationEvent 事件被觸發。

所有的攻擊和上述描述的影響都可以用 WMI 事件查詢來表示。在與事件消費者結合使用時,防禦者可以極具創造力的選擇如何檢測和響應攻擊者的操作。例如,防禦者可以選擇在建立 Win32_StartupCommand 的任意例項後接收一封電子郵件。

在建立了用於警報攻擊者行為的 WMI 事件時,必須認識到攻擊者也有可能很熟悉 WMI ,並且可以檢查和刪除現有的 WMI 防禦事件訂閱。因此,貓和老鼠的遊戲就接著開始了。作為最終所採取的防禦機制以防止攻擊者刪除你的防禦事件訂閱,你可以註冊一個事件訂閱來檢測 __InstanceDeletionEvent 事件的 __EventFilter__EventConsumer__FilterToConsumerBinding 物件。然後,如果攻擊者成功地刪除了 WMI 永久防禦事件訂閱,防禦者將會在刪除時有最後一次機會得到攻擊警報。

緩解措施

除了部署 WMI 永久防禦事件訂閱之外,還有幾種可能防止部分或所有正在發生的 WMI 攻擊的緩解措施。

  1. 系統管理員可以禁用 WMI 服務。這對一個組織要考慮它對 WMI 的需要是非常重要的。一定要考慮清楚停止 WMI 服務後所帶來的任何意外情況。因為,Windows 已經越來越依賴於 WMI 和 WinRM 的管理任務。
  2. 考慮阻止 WMI 的協議埠。如果沒有正當的理由需要遠端使用 WMI,可以考慮配置 DCOM 使用單一埠,然後阻止該埠。這是一個比較明智的緩解措施,因為它會阻止遠端 WMI ,但允許該服務在本地執行。
  3. WMI、 DCOM 和 WinRM 的事件會被記錄為下列事件日誌:
      a. Microsoft-WindowsWinRM/Operational
        i. 顯示含有來源 IP 地址的失敗的 WinRM 連線嘗試
      b.Microsoft-Windows-WMI-Activity/Operational
        i. 包含失敗的 WMI 查詢和可能包含攻擊者活動證據的方法呼叫
      c.Microsoft-WindowsDistributedCOM
        i. 顯示含有來源 IP 地址的失敗的 DCOM 連線嘗試

0x01 公共資訊模型 (CIM)


"公共資訊模型 (CIM) 是一個開放的標準,它定義瞭如何將託管的元素在 IT 環境中表示為一組公共的物件以及它們之間的關係。分散式管理任務組維護 CIM ,允許這些託管的元素獨立於其製造商或供應商的一致管理。WMI 使用 CIM 標準來表示其管理的物件。例如,系統管理員透過 WMI 查詢的系統必須透過標準化的 CIM 名稱空間來獲取一個處理物件例項。

WMI 在 CIM 儲存庫中維護了一個所有可管理物件的登記冊。CIM 儲存庫是一個永續性的資料庫,它儲存在執行 WMI 服務的本地計算機上。在使用 CIM 時,它維護了所有可管理物件的定義,包括它們之間的關係以及由誰來提供它們的例項。例如,當軟體開發者透過 WMI 公開自定義應用程式的效能統計時,他們必須先註冊效能指標的描述。這使得 WMI 能夠正確解釋查詢並用良好的格式化資料來作響應。

CIM 是物件導向的,支援的特性有 (單一) 繼承、抽象和靜態屬性、預設值並可以將任意鍵-值對附加到被稱作"限定符"的專案中。

相關的類被分組式的放在分層名稱空間之下。類宣告的屬性和方法透過可託管物件公開。屬性是一個包含在類例項中的特定型別資料的名稱欄位。類定義描述了有關屬性的後設資料,類的例項包含了具體的由 WMI 提供程式填充的值。方法是一個已命名的例程,它在一個類的例項中執行,並且是由 WMI 提供程式實現的。類定義描述了其原型 (返回值的型別、 名稱、 引數型別),但沒有實現過程。限定符是一個可以附加到名稱空間、類、屬性和方法的後設資料的鍵-值對。常見的限定符提供了一個字串型別的提示的值,以指示客戶端如何去解釋列舉項和語言內碼表。

例如,圖 12 列出了一些安裝在純淨版 Windows 10 上的名稱空間。請注意,它們可以很簡單的被表示為樹狀。當客戶端沒有宣告其本身的名稱空間時, WMI 會選擇 ROOT\CIMV2 名稱空間作為預設的名稱空間。

圖 12 名稱空間 示例

在此安裝的 Windows 中,ROOT\CIMV2 名稱空間包含 1,151 個類定義。圖 13 列出了一些在此名稱空間中發現的類。請注意每個類具有一個名稱和一個用於唯一標識類的路徑。按照約定,某些類擁有名為 Description 的限定符,它包含了一個用以描述應如何託管這個類的人類可讀字串。 WMI Explorer 這個工具提供了使用者友好的介面來獲取 Description 限定符並在網格檢視中顯示它的值。

圖 13 類 示例

圖 14 列出了一些 Win32_LogicalDisk 類例項中已公開的屬性。此類定義宣告瞭 40 個屬性, Win32_LogicalDisk 類例項包含了每個屬性具體的值。例如,DeviceID 屬性是字串型別,用於磁碟的唯一標識,所以一個 WMI 客戶端可以列舉類例項並期望得到像 A:、C:,D: 這樣的值。

圖 14 屬性 示例

圖 15 列出了 Win32_LogicalDisk 類例項中已公開的方法。此類定義宣告瞭五種方法並且相關聯的 WMI 提供程式允許客戶端能夠呼叫 Win32_LogicalDisk 例項的這些方法。皮膚底部的兩個視窗描述了呼叫方法必須提供的引數和返回的資料。在此示例中,Chkdsk 方法需要五個布林型引數並返回了一個描述操作狀態的 32 位整數。請注意, Description 限定符附加到這些方法後其引數將作為 WMI 客戶端開發者的 API 文件。

圖 15 方法 例項

在此安裝的 Windows 中,有三個 Win32_LogicalDisk 類的例項。圖 16 列出了使用它們唯一的例項路徑的類例項。此路徑是透過組合在類名稱中具有限定符的特殊屬性的名稱和值所構成的。在這裡,有一個屬性: DeviceID 。每個類例項都是用來自同一個邏輯專案的具體資料填充的。

圖 16 類例項 示例

圖 17 列出了 Win32_LogicalDisk 類例項中 C: 磁碟卷的具體的值。注意,並非 40 個屬性都列出在了這裡;在類定義中,沒有明確的值的屬性也是沒有預設值的。

圖 17 Win32_LogicalDisk 類例項中 C: 磁碟卷的屬性值

0x02 託管物件格式 (MOF)


WMI 使用託管物件格式(MOF)用於描述 CIM 類的語言。MOF 檔案是一個文字檔案,包含了指定的可被查詢的事物的語句如該事物的名稱,複雜類的欄位型別,物件組相關的許可權。語言的結構類似於 Java,相當於受限的 Java 介面宣告。系統管理員可以透過 WMI 使用 MOF 檔案擴充套件 CIM 支援並且 mofcomp.exe 工具可以在 CIM 資料庫中將被格式化的資料插入到 MOF 檔案中。WMI 提供程式通常是由提供的 MOF 檔案定義的,它定義了資料和事件類和提供資料的 COM DLL 檔案。

MOF 是一種物件導向的語言,它由以下部分組成:

  • 名稱空間
  • 屬性
  • 方法
  • 限定符
  • 例項
  • 引用
  • 註釋

所有在 "公共資訊模型 (CIM)" 章節中所闡述的實體都可以使用 MOF 語言進行描述。以下各章節將會說明如何使用 MOF 語言來描述 CIM 實體。

MOF 中的名稱空間

要在 MOF 中宣告一個 CIM 名稱空間,可以使用 #pragma namespace (\\computername\path) 指令。通常,這個語句被發現在檔案的最開始,並且會應用到同一檔案內剩餘部分的語句。

MOF 語言允許透過宣告父名稱空間並定義一個 __namespaceclass 的新例項來建立新的名稱空間。例如,我們可以使用在圖 18 中列出的 MOF 檔案建立 \\.\ROOT\default\NewNS 名稱空間。

圖 18 在 MOF 中建立名稱空間

MOF 中的類定義

要在 MOF 中宣告一個類,首先需要定義當前名稱空間,然後再使用 class 關鍵字。提供新的類名和所繼承的類。大多數類都有一個父類,新的 WMI 類的開發人員應該找到相應的要繼承的類。接下來,描述新的類所支援的屬性和方法。將限定符附加到類,屬性和方法時,會有額外的後設資料關聯到一個實體上,如使用目的或列舉的解釋。使用動態修飾符用於指示提供程式動態的建立類的例項。抽象類限定符用於指示該類沒有例項可以建立。讀取屬性限定符用於指示該值是隻讀的。

MOF 支援程式設計師使用的常見的資料型別,包括字串、數字型別 (uint8、sint8、uint16、sint16 等)、日期 (datetime) 和其他資料型別的陣列。

圖 19 列出了在 MOF 中定義類的語句的結構,而圖 20 列出了一個定義了兩個新類: ExistingClass 和 NewClass 的 MOF 示例檔案。在 \\.\ROOT\default 名稱空間中,可以找到這兩個類。ExistingClass 類有兩個屬性:Name 和 Description。Name 屬性的 Key 限定符指示了它被用於唯一標識此類的一個例項。NewClass 類有四個顯式屬性: Name, Buffer, Modified 和 NewRef。NewClass 也繼承了其基類 ExistingClass 的 Description 屬性。NewClass 被標記了動態限定符,這意味著相關聯的 WMI 提供程式將會按需要動態建立此類的例項。NewClass 有一個名為 FirstMethod 的方法,該方法接受一個 32 位無符號整數的引數,並返回一個 8 位無符號的整數值。

圖 19 MOF 類定義結構

圖 20 在 MOF 中建立類定義

MOF中的例項

在 MOF 中定義類的一個例項,需要在類名後使用 instance 關鍵字, 名稱-值的鍵值對列表用來填充具體的屬性值。圖 21 列出了一個建立 \\.\ROOT\default\ExistingClass 類的例項的 MOF 檔案,並分別給 Name 和 Description 屬性提供了具體的值 SomeName 和 SomeDescription 。其餘欄位將會預設填充為 nil 。

圖 21 在 MOF 中建立一個類例項

MOF 中的引用

CIM 類屬性可以透過例項物件路徑引用其他類的現有例項。這被稱為引用。在 MOF 中定義類例項的引用,需要使用 ref 關鍵字作為屬性的資料型別的一部分。例如,圖 22 列出的 MOF 語句用於宣告一個命名為 NewRef 的類引用,它指向了 ExistingClass 類的一個例項。

圖 22 在 MOF 中定義類的例項引用

若要設定引用屬性的值,請將屬性的值設定為例項物件路徑用於標識現有的類例項。例如,圖 23 列出的 MOF 語句可以將 NewRef 的屬性設定為帶有 Name 屬性的 ExistingClass 類的例項,這等同於直接使用 SomeName 對 ExistingClass 類例項的 Name 屬性進行賦值。

圖 23 在 MOF 中設定類例項的引用

MOF 中的註釋

MOF 格式支援單行和多行 C 語言風格的註釋。圖 24 列出了各種風格的 MOF 語句定義的註釋。

圖 24 MOF 中的註釋

 MOF 自動恢復 

WMI 的 CIM 儲存庫實現了 MOF 檔案的事務快取式的插入,以確保資料庫不會被破壞。如果在插入的時候系統發生崩潰或停止, MOF 檔案可以被註冊為後續自動恢復。若要啟用此功能,可以在 MOF 檔案頂部使用 #pragma autorecover 語句。這時,WMI 服務將會把 MOF 檔案的完整路徑新增到 MOF 檔案自動恢復列表中,此列表儲存在以下注冊表項中:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章