歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

如何規避Sysmon DNS監控

來源:本站整理 作者:佚名 時間:2019-06-18 TAG: 我要投稿

Sysmon在最近更新中添加了一個功能,可以記錄DNS事件。這一點對防御方非常有用(呼吁SysInternals團隊繼續免費添加并提供這類工具),但對攻擊方而言,這意味著如果我們的植入后門或者payload嘗試通過DNS進行通信,那么藍隊就有可能搜集到相關特征,用來檢測攻擊行為。
容易受該功能影響的一種場景就是基于DNS的C2通信,其中大量請求會被記錄下來,可能導致出師未捷身先死。在某次測試過程中,目標環境中部署了這種機制,因此我想花一點時間了解如何規避這種檢測機制。在本文中,我將與大家分享規避Sysmon 10.1的一種方法。
在規避Sysmon之前,我們首先需要搭建測試環境。這里我使用@SwiftOnSecurity的sysmon-config來安裝Sysmon,命令如下:
sysmon.exe -accepteula -i rules.xml
測試環境搭建完畢并正常運行后,我們可以看到有源源不斷的事件被記錄下來。過濾Event ID 22,我們可以重點關注“DNS query”(DNS請求)事件,如下所示:

一切準備就緒后,我們可以看下查詢請求被記錄的原理。
 
0x01 DNS日志審計原理
為了澄清在規避時可以使用哪些選項,我首先想了解一下底層工作原理。根據其他參考資料,我們知道Sysmon會大量依賴ETW來監控各種行為(比如網絡連接)。因此DNS監控很有可能也采用相同方式。如果我們使用如下命令,就能找到第一條線索,表明ETW的確是關鍵點:
logman -ets

安裝Sysmon后,我注意到上圖的“Data Collector Set”包含一個“My Event Trace Session”。如果我們進一步分析這個點,可以看到這個數據收集器很有可能負責將DNS數據提供給Sysmon。

繼續搜索后,我們可以在各種位置通過Microsoft-Windows-DNS-Client這個事件源來獲取關于DNS查詢的一些信息。但在使用這種方法之前,我通常喜歡通過對應服務來交叉驗證這一點,因此這里我們可以試一下Ghidra。在Ghidra中搜索“My Event Trace Session”后,我們找到了如下函數:

我們在SysMon64.exe中找到了這個函數,其中引用了這個特征(備注:這個函數以及名稱與微軟官方文檔中提供的示例代碼非常相似)。在上圖中,傳遞給EnableTraceEx2的第2個參數指向的是如下數據:

這顯然與logman輸出結果中Microsoft-Windows-DNS-Client的GUID相同({1C95126E-7EEa-49A9-A3FE-A378B03DDB4D})。因此現在我們可以肯定這正是該工具記錄DNS查詢的方法。接下來,我們需要澄清發起DNS請求時這些日志如何被觸發。
 
0x02 觸發相關日志
這里我們試一下常用的DNS API:DnsQuery_A,利用這個API來找到相關ETW數據可能出現的位置。我們顯然可以從dnsapi.dll中開始尋找,這也是托管該API的服務程序。將該DLL及對應的PDB載入Ghidra中,我們可以開始查找與ETW有關的一些功能。由于我們已經知道與DNS事件相關的一個GUID,因此可以使用這個特征來尋找出發點。令人驚訝的是,我們的確在DLL中找到了這個GUID,對應的是DNS_CLIENT符號:

如果我們繼續跟進,可知McGenEventRegister函數中引用到了DNS_CLIENT:

DllMain中會調用該函數,這意味著系統會創建一個句柄(DNS_CLIENT_Context),用來發送相關事件。
為了了解整個DLL中如何使用這個句柄,我們可以創建一個小程序,功能很簡單,就是發起DNS查詢:
#include
#include
int main()
{
    DnsQuery_A("blog.xpnsec.com", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, NULL, NULL);
}
如果編譯該程序并在WinDBG中分析,我們可以添加一個斷點,在內存讀取DNS_CLIENT_Context時觸發該斷點,命令如下:
ba r4 DNSAPI!DNS_CLIENT_Context
恢復應用執行后,斷點很快就被觸發,可以找到如下調用棧:

而我們對應的指令如下:

這些信息意味著DnsApi.dll內部會向Microsoft-Windows-DNS-Client發送事件,這個DLL會加載到攻擊者進程中,而該進程我們正好可以控制。
 
0x03 規避方法
現在我們知道這些事件會從DnsApi.dll內部發出,并且由于該DLL會在我們可控的進程內調用,因此我們可以影響這個過程。這也是我們可以考慮進行patch的一個點。
如何完成這個任務有各種方法,大家可以自己選擇。在PoC中,我們選擇在運行時patch DNSAPI!McTemplateU0zqxqz,使其不通過EtwEventWriteTransfer發送相關事件,直接返回。大家可以參考如下代碼:

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.pcpbjo.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        云南快乐十分前三电视