檢測父PID欺騙?
用來檢測異常活動的最有用的技術之一是對父子進程關系的分析,然而,技術更高明更強大的攻擊者可以使用父PID(PPID)欺騙來繞過此操作,從而允許從任意父進程執(zhí)行惡意進程。盡管這項技術本身并不新鮮,雖然Cobalt Strike和DidierStevens 對其進行了詳細介紹,但在檢測此類攻擊方面進行的專門研究卻很少。
在本文中,我們將探討該技術的工作原理以及防御者如何利用Windows事件跟蹤(ETW)來檢測該技術。我們還將發(fā)布概念驗證PowerShell腳本以執(zhí)行PPID欺騙和DLL注入,以及一個Python腳本,該腳本利用pywintrace庫來檢測此活動。
為什么首先要進行欺騙?
過去,攻擊者通常能在發(fā)動攻擊時不留下任何痕跡,但是隨著EDR的興起和威脅搜尋的興起,情況就開始發(fā)生變化了。特別是使用父子進程分析已經(jīng)成為一種有用的技術,用于檢測在網(wǎng)絡攻擊殺傷鏈的幾乎每個階段產(chǎn)生的異常活動。
我們在Countercept上使用的一些示例:
- 宏有效載荷傳遞: WinWord生成過程;
- JS / VBS C#有效載荷傳遞: cscript生成csc;
- 橫向移動:services/wmiprvse產(chǎn)生新流程;
這迫使攻擊者重新評估他們的方法,并著眼于像PPID欺騙這樣的技術,以繞過現(xiàn)代的防御策略。
通過CreateProcessA進行欺騙
有許多不同的方法可以欺騙父進程,在這篇文章中,我們將關注一個最簡單和最常用的技術,涉及到API調用CreateProcessA。
毫不奇怪,CreateProcessA允許用戶創(chuàng)建新流程,并且默認情況下,將使用繼承的父級創(chuàng)建流程。但是,此函數(shù)還支持一個名為“lpStartupInfo”的參數(shù),你可以在其中定義要使用的父進程。這個功能是在Windows Vista中加入UAC后首次引入的,目的是為了正確設置父級。

在更深層次的技術水平上,lpStartupInfo參數(shù)指向STARTUPINFOEX結構。此結構包含一個lpAttributeList,你可以使用UpdateProcThreadAttribute通過“PROC_THREAD_ATTRIBUTE_PARENT_PROCESS”屬性設置進程的父進程。

順便提一下,這種方法也可以用于特權升級。文檔中提到“從指定進程繼承的屬性包括句柄、設備映射、處理器關聯(lián)、優(yōu)先級、配額、進程令牌和作業(yè)對象”。“Adam Chester有一個博客,展示了如何濫用它來獲得Windows系統(tǒng)。
如何欺騙父進程?
在網(wǎng)絡上立足的最常見方法之一是使用惡意宏文檔,許多有效載荷通常會啟動新進程,例如cmd,PowerShell,regsvr32或certutil。圖3顯示了從winword生成rundll32的一個示例。但是,這種行為是相對異常的,并且大多數(shù)防御策略都很容易檢測到。

為了克服這個問題,攻擊者可以改用CreateProcessA技術的VBS宏實現(xiàn)從預期的父進程啟動有效載荷(例如Explorer啟動cmd)以與環(huán)境融合,下圖概述了如何實現(xiàn)的過程。

我們不會發(fā)布此VBS代碼,然而,更多信息可以在這里找到。
但是,我們可以采取進一步措施來完全避免使用常見的Windows實用程序嗎?一種選擇是使用某種形式的DLL或內存注入在已經(jīng)運行的進程中加載有效載荷。
為了說明這一點,我們基于Didier Stevens]的代碼創(chuàng)建了一個PowerShell腳本,該腳本可用于創(chuàng)建具有欺騙性父級的進程,然后在其中注入DLL。


為了演示如何使用該腳本隱藏活動,我們查看了Windows 10上常用的進程。我們看到的一種非常常見的合法關系是“ svchost.exe”啟動“ RuntimeBroker.exe”。

使用PowerShell腳本,我們能夠模擬這個活動,并通過“ svchost.exe”強制生成合法的“ RuntimeBroker.exe”,然后注入并執(zhí)行DLL有效載荷。

此向量顯示了此類技術如何潛在地繞過專注于父子關系的檢測規(guī)則。
如何查找到攻擊者?
如上所述,我們介紹了CreateProcessA技術如如何欺騙父級ID的,并且從安全團隊的角度來看,如果你使用任務管理器或進程資源管理器查詢正在運行的進程,則會看到欺騙性的ID。但是,有什么方法可以找出真實的ID?
Windows中最好的取證數(shù)據(jù)源之一是Windows事件跟蹤(ETW),ETW提供有關系統(tǒng)上發(fā)生的事件的實時數(shù)據(jù)流,這是我們在Countercept的端點代理中使用的東西。
特別是Microsoft-Windows-Kernel-Process提供程序可以為流程創(chuàng)建提供一些有用的見解,并可以幫助我們檢測流程ID欺騙。在下面的示例中,你將看到如何從“winword.exe”(PID 9224)生成“rundll32.exe”(PID 5180)(圖9)。

查看收集到的ETW數(shù)據(jù)(圖10),你將看到多個ProcessId字段,包括EventHeader ProcessId以及實際事件ProcessID和ParentProcessID。盡管這有些令人困惑,但通讀MSDN文檔,我們發(fā)現(xiàn)EventHeader ProcessId實際上標識了生成事件的進程,即父進程。

在這個合法的示例中,你會注意到EventHeader ProcessId和ParentProcessId正確匹配。
在第二個示例中,我們執(zhí)行了惡意的PowerShell腳本,并通過“svchost.exe”(PID 4652)生成了“RuntimeBroker.exe”(PID 4976)。

和以前一樣,我們可以看到ETW生成了一個流程事件(圖12);但是,這次的EventHeader ProcessId和ParentProcessID是不同的。實際上,EventHeader ProcessId顯示了真正的父級關系,即“ winword.exe”(PID 9224),因為我們剛剛發(fā)現(xiàn)有人在執(zhí)行ParentPID欺騙!

但是,就像在威脅檢測中一樣,事情并非如此簡單,如果你嘗試大規(guī)模進行此操作,你將發(fā)現(xiàn)合法欺騙會帶來誤報。一個常見的示例是用戶帳戶控制(UAC),用于提升進程特權。在Windows 10中,當UAC執(zhí)行時,應用程序信息服務(通過svchost)用于啟動提升的進程,但隨后將欺騙父級以顯示原始調用方。下面的示例顯示了提升后的cmd.exe如何將explorer.exe作為父級顯示,而實際上它是svchost.exe。

我們看到的另一個誤報與WerFault的崩潰處理有關,在下面的示例中,當MicrosoftEdge崩潰時,使用svchost啟動WerFault.exe,并且將父級欺騙為MicrosoftEdge.exe。

出于測試的目的,我們創(chuàng)建了一個簡單的概念驗證Python腳本,該腳本使用pywintrace記錄來自ETW的事件,比較PID,然后過濾結果以消除誤報(圖15)。

可以在我們的Github 上找到PowerShell欺騙腳本的代碼以及檢測腳本。
總結
在這篇文章中,我們展示了攻擊者如何利用合法的Windows功能來欺騙防御者,并可能繞過基于父子關系的檢測技術。
但是,從防御的角度來看,我們已經(jīng)展示了對ETW進程事件的分析如何輕松地突出顯示異常的父級欺騙并幫助發(fā)現(xiàn)進程的真正來源。
本文翻譯自:https://blog.f-secure.com/detecting-parent-pid-spoofing/