◆吳紅
(國網眉山供電公司四川 620010)
Windows事件跟蹤[1](Event Tracing for Windows)是Windows操作系統提供的內核級別跟蹤工具。在軟件開發領域,ETW提供了以非侵入式的方式來監控組件的能力,例如識別CPU高占用率、資源泄露、調用堆棧,并能輸出日志以便構建監控與警報系統。由于其強大的功能及廣泛的覆蓋面,在安全領域也常用作SIEM[2]等安全組件的事件收集器。
在APT攻擊中,APT組織幾乎都會在受害者主機上部署惡意軟件,這些軟件功能可能各有側重,但總需要一種方式將數據走私至外部網絡,因此NIDS等安全設施盡其所能地檢測網絡流量中的可疑行為,從而發現APT攻擊的痕跡。除此之外,HIDS或EDR等終端防護設施也需要監視系統環境,試圖攔截APT進程發起各類數據竊取、橫向移動、權限提升、后門部署行為,并配合NIDS關聯受害主機與惡意進程,而ETW正好提供了基礎。ETW能以多個角度對進程行為進行記錄,如進程調用的Win32 API、調用堆棧、加載的dll、網絡通信等,并且十分高效。因此,使用ETW作為數據源構建自動化APT威脅告警系統是一種可行的方案。本文將介紹ETW架構,并描述一種基于ETW的可疑APT進程檢測的解決方案。
ETW分為三個組件:
(1)控制器,用于啟動和停止事件跟蹤會話并啟用提供程序。
(2)提供者,提供事件。
(3)消費者,消費事件。
有四種提供者,MOF提供者、WPP提供者、基于清單的提供者與TraceLogging提供者。每一個基于清單的提供者都有下列信息:
(1)名稱;
(2)GUID;
(3)級別,系統使用6個級別,0為Log Always,1為Critical,2為Error, 3為Warning,4為Informational,5為Verbose,其中0是默認級別。還可以定義自定義日志記錄級別,但保留級別 6-15。可以通過 ORing各自的級別來捕獲一個以上的日志記錄級別;提供255 (0xFF)是捕獲所有支持的日志記錄級別的標準方法;
(4)關鍵字 All,關鍵字用于過濾特定類別的事件。日志級別用于按事件的真實性/重要性進行過濾,而關鍵字則允許按事件類別進行過濾。一個關鍵字對應于一個特定的位值。All表示對于KeywordsAny匹配的給定關鍵字,應根據 KeywordsAll中的特定位值進行進一步過濾。該字段通常被設置為零;
(5)關鍵字Any,允許根據指定的關鍵字的任意組合進行過濾。這可被視為“邏輯或”,其中 KeywordsAll是“邏輯與”的后續應用。低的 6個字節指的是特定于提供者的關鍵字,高的兩個字節是保留的。
(6)屬性;
(7)過濾器類型。

圖1 ETW架構圖
Logman是Windows內置的事件跟蹤會話創建與管理工具。下面介紹一些用法:
(1)查詢Providers: logman query providers;
(2)查詢系統正在運行的ETW會話:logman query -ets;
(3)創建事件跟蹤會話:logman create trace [Name]-ets。
ETWExplorer用于查看Provider的元信息,例如事件類型、模板、關鍵字等。如果想探索系統中一些未文檔化或用例較少的Provider,該工具是一個較好的選擇。
該工具是微軟官方提供的ETW分析工具,功能強大并具有友好的用戶界面,但它已停止開發與支持。
krabsetw是一個C++庫,它簡化了與ETW的交互。它允許啟用任何數量的跟蹤和提供者,并允許客戶端代碼從這些跟蹤中注冊事件通知。krabsetw還提供了代碼來簡化將通用事件數據解析為強類型數據的過程。
flatkrabsetw 是一個圍繞 krabsetw C++ 庫的 flat-C 封裝器。它的主要目的是為其他語言的FFI綁定提供接口。
本文的解決方案主要從三個方面記錄進程行為:
對于進程網絡行為,我們選擇Provider Microsoft-Windows-Kernel-Network。該Provider提供TCP/IP及UDP協議細粒度的事件模板,如發起連接、連接建立、發送數據、接收數據、斷開連接等。模板字段包含數據長度、源地址、目標地址、源端口、目標端口、開始時間、結束時間、以及最重要的進程ID等信息。
對于進程的操作行為,如鏡像加載、線程創建等,使用Microsoft-Windows-Kernel-Process Provider。該Provider提供的重要事件模板有進程創建、進程結束、線程創建、線程結束、鏡像加載、鏡像卸載。
APT攻擊行為中的數據竊取會留下對文件系統的訪問痕跡,而這些痕跡可通過ETW Provider Microsoft-Windows-Kernel-File記錄。該Provider記錄文件創建、寫入、讀取、移動、拷貝、重命名、設置安全描述符等。
下一步是選擇對ETW進行交互的工具。Logman等命令行工具雖然允許我們配置并啟動ETW會話,但它們通常不提供API或自定義配置以供其他客戶端實時分析并處理日志。雖然我們可以選擇先保存日志文件,再統一轉發至日志中心,但這樣做在實時性上稍差,對事件日志的預處理也需要在服務端統一完成,而一些輕量的預處理工作交由客戶端處理更加合適。因此,我們的方案是自行開發事件收集器,為了減輕開發人員的工作量,使用腳本語言FFI[3]庫與ETW進行交互。
Elasticsearch、Logstash 和 Kibana(ELK)I[4]在數據處理和分析領域有廣泛應用。使用ETW收集到的事件日志將流經日志管道并落入Elasticsearch中,可通過Elasticsearch API檢索并進一步分析。在部署ELK棧時,我們在靠近數據源側使用Filebeat TCP端口轉發日志到Redis數據庫中,Redis數據庫用于消息隊列。
當NIDS發出告警后,APT分析引擎將關聯連接時間到ETW事件中的一組網絡通信日志,并提取PID字段,在Elasticsearch中過濾出相應的進程并告警。接下來,引擎進一步分析可疑進程,這一步可通過下列幾個方面進行:
(1)調用反病毒軟件接口進行查殺。例如主機是Windows 10操作系統,則調用內置的反病毒軟件掃描接口[5](AMSI)的Scan方法掃描。
(2)提取進程鏈,這一過程需要部署在主機上的Agent配合收集信息。獲得進程鏈后,識別可疑模式,如利用 Office宏創建的子進程,或者Jscript或VBScript等腳本引擎解釋器創建的子進程,以及WMI宿主進程創建的子進程。
(3)標記“白加黑”模式運行的可疑軟件。白加黑指利用殺軟白名單進程加載惡意 dll的手法。如果 dll包含 APT所需的核心功能,則其在加載后可能直接搜集數據并發送至攻擊源,因此,分析引擎尋找最早的告警記錄時間并在其之前一段范圍里過濾進程鏡像加載事件,以此大致定位可疑的dll,當然這種方式誤報率較高。
(4)C2信道檢測。雖然有不少APT組織使用的遠控都能隨機化心跳包間隔,但檢測以固定間隔發起的C2連接請求仍然有必要。除此之外,使用DNS信道往往會產生大量DNS請求,因此過于頻繁的DNS流量也是檢測指標之一。
本文介紹了ETW在APT檢測中的應用。ETW作為Windows內置的高效工具,已經被大量運用于紅軍安全建設領域,越來越多的安全產品也使用它收集數據。但ETW不是萬靈藥,不能篤定ETW能無損地記錄所有數據。目前已有不少技術用于避開或破壞ETW架構,因此在未來圍繞ETW的對抗還將持續升溫。