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

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

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

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

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


為了演示如何使用該腳本隱藏活動(dòng),我們查看了Windows 10上常用的進(jìn)程。我們看到的一種非常常見(jiàn)的合法關(guān)系是“ svchost.exe”啟動(dòng)“ RuntimeBroker.exe”。

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

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

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

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

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

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

我們看到的另一個(gè)誤報(bào)與WerFault的崩潰處理有關(guān),在下面的示例中,當(dāng)MicrosoftEdge崩潰時(shí),使用svchost啟動(dòng)WerFault.exe,并且將父級(jí)欺騙為MicrosoftEdge.exe。

出于測(cè)試的目的,我們創(chuàng)建了一個(gè)簡(jiǎn)單的概念驗(yàn)證Python腳本,該腳本使用pywintrace記錄來(lái)自ETW的事件,比較PID,然后過(guò)濾結(jié)果以消除誤報(bào)(圖15)。

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