核心模式威脅的最新技術與防禦方式(第二部分)
傳送門
核心模式威脅的最新技術與防禦方式(第一部分)
ofollow,noindex" target="_blank">https://www.anquanke.com/post/id/160412概述
在上一篇文章中,我們對核心模式威脅的演變進行了詳細講解。對於一些大型攻擊團隊來說,這仍然是一種首選方案,因為這種攻擊難以被發現,並且能夠保證具有較好的永續性。
誠然,隨著時間的推移,各類安全機制和安全產品對計算機的保護也在逐漸加強,但與此同時,核心模式威脅也在不斷地發展,並且已經應用到許多大規模的攻擊之中,例如WannaCry和NotPetya。那麼,針對安全人員來說,我們可以採取哪些措施來防禦核心模式威脅呢?幸運的是,隨著防禦技術的不斷髮展,目前已經可以與這種攻擊方式相抗衡。
通過我們的研究,我們得出瞭如何改進核心模式威脅防禦方式的結論。在本文中,首先將會介紹研究過程,我們的這一研究從紅藍對抗中演變而來。隨後,針對目前最新的攻擊技術,將討論幾種核心模式威脅的防禦方法。
攻擊技術研究
為了測試和提升我們的防禦方式,我們必須要充分理解最新的攻擊技術。在內部開展的紅藍對抗期間,我們首先嚐試著利用核心模式惡意軟體來繞過終端安全產品和常見核心保護機制(例如:驅動程式簽名強制執行DSE)。
隨後,我們嘗試了用於繞過最新核心保護機制的方法(例如:基於虛擬化的安全性VBS和管理程式程式碼完整性HVCI)。
紅藍對抗的收穫
Endgame會定期組織紅藍對抗,以測試產品效能和團隊能力。紅隊的任務是模擬不同級別的攻擊者,其中包括非常複雜的商品化惡意軟體和中高階APT攻擊。通常情況下,我們紅隊成員都會使用最新的使用者模式記憶體技術保持隱蔽。然而,隨著藍隊水平的不斷提升,他們已經能夠有效防禦我們的使用者模式注入攻擊。因此,我們決定研究核心模式,從而提升攻擊的水平。
Turla Driver Loader(TDL, https://github.com/hfiref0x/TDL )是我們進行核心攻擊的關鍵所在。TDL是Turla/Uroburos驅動程式載入技術的開源實現。簡而言之,它將負責載入易受攻擊的VirtualBox驅動程式。在這裡,VirtualBox驅動程式被利用載入並執行任意核心Shellcode/">Shellcode。TDL藉助Shellcode構建,在使用者模式下利用“MemoryModule”等技術手動對映任意驅動程式,並呼叫其入口點。通過使用TDL,可以幫助紅隊實現兩個目標:繞過驅動程式簽名強制執行、不會將驅動程式寫入目標計算機的磁碟中。
除此之外,還有一些其他高階的植入物設計方案。首先,我們希望避免任何使用者模式元件。有一個典型的設計方案就是使用核心模式元件,並注入到使用者模式程序中,以執行主要“植入”功能。在這兩篇文章中引用到的核心模式惡意軟體,其中就包含一些使用者模式元件。
避免用到使用者模式需要耗費一定的時間,但我們認為是值得的。因為向用戶模式中注入任何內容,都有可能被藍隊發現。由此,就要求我們從核心模式進行網路命令和控制。我們選擇了Winsock Kernel(WSK)作為我們的網路選擇,因為該工具的官方文件詳盡,有較好的示例程式碼,提供了一個相對簡單的介面,可以從核心進行網路通訊。
為了進一步對抗藍隊,我們不希望有Beacon式的植入物。Beaconing是迄今為止最流行的惡意軟體技術,我們也深知藍方會努力找尋這樣的惡意軟體。但不幸的是,我們最初的埠開放很容易被他們發現。因此,我們通過重新使用DoublePulsar函式指標掛鉤,劫持一些現有的核心套接字,從而實現了一種更為隱蔽的攻擊方法。
但是,又因為它會被PatchGuard監控,我們不想使用相同的掛鉤點。在篩選了眾多的驅動程式之後,我們鎖定了開放445埠的srvnet驅動程式。於是,我們在該驅動程式中尋找問題,並使用自己的accept函式掛鉤srvnet的WskAccept函式。這樣一來,我們的植入物就可以選擇性地劫持445埠的流量。 使用TDL,就意味著我們的核心驅動程式永遠不會在磁碟留下痕跡,但是仍然存在載入器可能被捕獲的風險。因此,希望載入過程本身儘可能的無檔案化。這樣就要使用PowerShell或JavaScript鏈。我們之所以選擇JS,是因為它相對更不容易被防守方察覺。
具體而言,使用了squiblydoo( https://attack.mitre.org/wiki/Technique/T1117 )技術,從regsvr32程序執行一個scriptlet,而不是通常的啟動cscript/wscript自身。
在Black Hat會議上,我們做了實際的演示,過程中使用了SquiblyTwo( http://subt0x11.blogspot.com/2018/04/wmicexe-whitelisting-bypass-hacking.html )和winrm.vbs逃避技術( https://posts.specterops.io/application-whitelisting-bypass-and-arbitrary-unsigned-code-execution-technique-in-winrm-vbs-c8c24fb40404 )。

至此,我們已經確定,要使用DotNetToJS從JavaScript載入或執行任意.NET可執行檔案。現在可以從這個.NET可執行檔案中進行漏洞利用,並載入我們的驅動程式,執行此操作的程式碼可以使用C語言編寫。
還有一個更容易的選擇,就是使用MemoryModule樣式的.NET載入器,載入並執行本地可執行檔案。本地可執行檔案(TDL)會載入易受攻擊的VirtualBox驅動程式,並對其進行漏洞利用,將我們的植入物載入並對映到記憶體中。在這整個過程中,真正接觸到本機磁碟的唯一可執行檔案,就是合法的VirtualBox驅動程式。
無檔案核心模式威脅的演示視訊: https://youtu.be/7ACGx8CwctU
繞過VBS和HVCI
當我們決定參加Black Hat會議時,就打算要嘗試擴大攻擊的範圍。目前,Microsoft將基於虛擬化的安全性(VBS)與管理程式程式碼完整性(HVCI)這兩種機制相結合,能夠有效地組織任何未經過簽名的程式碼在核心中執行,這裡也包括DoublePulsar以及我們為紅藍對抗所編寫的植入物。
首先,我們發現了一個存在漏洞的驅動程式,因為在啟動HVCI時,TDL的VirtualBox驅動程式不會載入。由此,我們從Parvez Anwar的網站( https://twitter.com/ParvezGHH )上獲得了一個已知易受攻擊的樣本。接下來,就要選擇要利用的漏洞了。
考慮到其難度,最終選擇了易於利用的Write-*What-Where漏洞(在任何情況下攻擊者能夠將任意值寫入任意位置),而沒有選擇例如靜態單位元組寫入這樣難度較大的漏洞。後者通常會涉及到一些池損壞(Pool Corruption,例如Win32k GDI物件),以實現完整的讀寫原語。
由於易受攻擊的驅動程式在進行覆蓋時會解除對使用者提供的指標的引用,所以它還為我們提供了一個便捷的任意讀取原語。
HVCI機制會阻止未簽名的程式碼在核心中執行,但該機制無法保護核心模式資料的完整性。如果篡改關鍵的資料介面,可能會嚴重影響系統的完整性。
例如,攻擊子和可以通過修改IAT,來“NOP”掉某些函式呼叫。攻擊者可以禁用終端檢測響應(EDR)產品與使用者通訊的核心,也可以禁用安全相關核心的Etw提供程式(例如:Microsoft Windows Threat Intelligence)。
此外,攻擊者還可以利用資料損壞攻擊(Data Corruption Attacks),藉助修改Token或Handle來提升許可權。除此之外,還有一些技術可以被利用。
為了儘可能模擬現實中的攻擊,我們研究了sysmon驅動程式將事件從核心模式傳送到使用者模式(用於進行日誌記錄)的方法。最終發現,如果將匯入地址表(Import Address Table)中的xor rax,rax ret gadget,事件就不再被記錄。
現實中的攻擊者,可以像這樣阻止事件被記錄,從而避免引起懷疑。需要指出的是,這並不是sysmon的一個漏洞,每個安全產品都可能會受到這樣的資料損壞攻擊。但是,Microsoft可能會擴充套件“基於虛擬化的安全性(VBS)”,從而保護不應被修改的某些關鍵資料區域(例如本示例中的匯入地址表)。
儘管資料損壞攻擊會引起他們的警惕,但我們還是想要探索是否能夠實現任意程式碼執行。來自Microsoft BlueHat IL的Dave Weston發表過一篇演講( https://www.youtube.com/watch?v=8V0wcqS22vc&t=1s ),其中透露了“基於虛擬化的安全性”的重要設計細節。
然而,它也給我們留下了如何應對執行流保護(Control Flow Guard)的難題。從本質上來說,在Windows核心中,目前仍然適合使用返回導向程式設計技術(Return Oriented Programming,ROP)實現攻擊。
正如Peter Hlavaty在2015年的演講( https://recon.cx/2015/slides/recon2015-05-peter-hlavaty-jihui-lu-This-Time-Font-hunt-you-down-in-4-bytes.pdf )中提到的,可以濫用讀寫原語來執行棧掛鉤,從而通過ROP實現程式碼執行。我們覺得可以將這種技術用於對抗HVCI加固後的系統。
於是,首先建立一個代理執行緒作為掛鉤的目標。在那裡,我們的PoC將根據目標函式中的引數數量,動態構建ROP鏈。只需要10個Gadget,就能夠實現完整的N-argument函式呼叫原語。
接下來,利用已經過簽名並且存在漏洞的驅動程式,來破壞代理執行緒的核心堆疊,以便執行生成的ROP鏈。最終,PoC可以呼叫任意核心模式函式。在演示中,攻擊者可以利用它來注入受保護的使用者模式程序( http://www.alex-ionescu.com/?p=116 ),並且在較大程度上繞過了反病毒產品和終端檢測響應產品。下面的視訊演示瞭如何使用這種技術繞過HVCI機制: https://youtu.be/SCC_acwPQyo
NTSTATUS WPM(DWORD_PTR targetProcess, DWORD_PTR destAddress, void * pBuf, SIZE_T Size) { SIZE_T Result; DWORD_PTR srcProcess = CallFunction("PsGetCurrentProcess"); LONG ntStatus = CallFunction("MmCopyVirtualMemory", srcProcess, (DWORD_PTR)pBuf, targetProcess, destAddress, Size, KernelMode, (DWORD_PTR)&Result); return ntStatus; }
總結
在本文中,我們詳細介紹了紅藍對抗中作為紅方的攻擊過程,向大家揭示了攻擊者藉助核心模式威脅進行攻擊的一般思路與高階進階思路。
最後,通過紅藍對抗中的經驗,我們探尋了多種核心模式威脅的防禦方法。然而,這些防禦方法僅僅是原理層面的,針對一些運維人員或安全人員可能顯得並不友好。
為此,我們開發了兩款免費工具,幫助大家有效防禦威脅。在下篇文章中,我們將深入分析這兩個防護工具的開發歷程和工作原理,以幫助大家更好地防禦此種威脅。