信息來源:FreeBuf
雖然Windows系統(tǒng)的安全機(jī)制是不允許任何微軟簽名的代碼注入到進(jìn)程之中的,但是網(wǎng)絡(luò)犯罪分子仍然會(huì)有很多方法來繞過這種安全機(jī)制,比如說通過執(zhí)行用戶態(tài)鉤子向正在運(yùn)行的進(jìn)程注入DLL等等。而本文所介紹的技術(shù)也許對(duì)于某些反病毒產(chǎn)品、EDR和安全防御人員來說,也許會(huì)提供一些有價(jià)值的思路。
UpdateProcThreadAttribute
第一種防止惡意第三方DLL注入到進(jìn)程的方法就是使用UpdateProcThreadAttribute。
這個(gè)屬性是PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY中一個(gè)我們可以自行設(shè)置的屬性。
下面的代碼段顯示了如何使用MITIGATION策略來創(chuàng)建一個(gè)新的記事本進(jìn)程,而這個(gè)進(jìn)程將阻止任意非微軟簽名的代碼注入其中。編譯并執(zhí)行下列代碼后,將以進(jìn)程緩解策略執(zhí)行notepad.exe程序,并防止任意非微軟簽名的代碼注入其中。我們可以使用Process Hacker來進(jìn)行檢查:
在下面這張GIF中,MITIGATION策略已經(jīng)生效,任何非微軟簽名的代碼都將被屏蔽,但是其中有一段微軟代碼通過并成功執(zhí)行了:
值得一提的是,這種特性實(shí)際上是Cobalt Strike的blockdlls在“作怪”。
SetProcessMitigationPolicy
在研究第一種方法的過程中,我偶然發(fā)現(xiàn)了一個(gè)名叫SetProcessMitigationPolicy的API,這個(gè)API將允許我們針對(duì)調(diào)用進(jìn)程本身設(shè)置緩解策略,而不是像第一種方法那樣去為子進(jìn)程設(shè)置緩解策略。mitigationpolicy.cpp的相關(guān)代碼如下:
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY sp = {};
sp.MicrosoftSignedOnly =1;
SetProcessMitigationPolicy(ProcessSignaturePolicy, &sp,sizeof(sp));
在我的測(cè)試過程中,使用SetProcessMitigationPolicy并不能防止已知的EDR解決方案將其DLL注入到我們的進(jìn)程中。通過調(diào)試會(huì)話的分析,我們確認(rèn)了原因,即在注入DLL之后,緩解策略將會(huì)立刻被應(yīng)用。當(dāng)一個(gè)進(jìn)程被初始化并且運(yùn)行之后,任何非微軟簽名的代碼都將無法注入到進(jìn)程之中。
檢測(cè)
這里我有一個(gè)更好的辦法,就是使用PowerShell的一個(gè)“Get-ProcessMitigation”cmdlet命令來枚舉出使用了MicrosoftSignedOnly緩解策略的進(jìn)程,然后對(duì)其進(jìn)行分析調(diào)查,并設(shè)置基準(zhǔn)線:
get-process |select-expprocessname -Unique | % { Get-ProcessMitigation -ErrorAction SilentlyContinue -RunningProcesses $_ |selectprocessname, Id, @{l="Block non-MS Binaries"; e={$_.BinarySignature|select-expMicrosoftSignedOnly} } }
下圖顯示的是notepad.exe,它將允許微軟簽名的代碼注入到其進(jìn)程中: