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