BYOL——一種新穎的紅隊技巧
一、簡介
頂級攻擊行動最近最重要的進展之一是攻擊者使用LotL(Living off the Land)技術。這些技術利用系統中已有的合法工具(例如PowerShell腳本語言)執行攻擊。作為一種攻擊性工具,PowerShell的普及最終導致了圍繞它開發整個紅隊框架,如Empire和PowerSploit。此外,PowerShell可以通過使用諸如Invoke-Obfuscation之類的工具來混淆。作為回應,防禦者已經開發出了惡意使用合法應用程序的檢測技術。這些檢測包括可疑的父/子進程關係,可疑的進程命令行參數,甚至通過使用腳本塊記錄來反混淆惡意PowerShell腳本。
在本文中,我將討論當前LotL技術的替代方案。在Cobalt Strike的最新版本(版本3.11)中,使用execute-assembly命令可以在內存中執行.NET程序。通過開發定製的C#程序,攻擊者不再需要依賴目標系統上的已有工具;他們可以改寫和提供自己的工具,這是一種我稱之為BYOL(Bring Your Own Land)的技術。我將通過使用重現PowerSploit項目的部分函數的自定義.NET程序演示此技術。我還將討論如何針對BYOL開發檢測技術。
二、背景
在去年的DerbyCon上,我很高興見到了Cobalt Strike RAT(遠程訪問工具)的開發者Raphael Mudge。在討論中,我提到將.NET程序載入到Cobalt Strike中是很有用的,類似於使用powershell-import命令導入PowerShell腳本的方式。在之前我參加的一次紅隊過程中,目標環境中主機上的終端檢測和響應(EDR)agent阻止了PowerShell的使用。這是一個嚴重的問題,因為當時我們紅隊的攻擊方法都是基於各種PowerShell腳本。例如,PowerView腳本的Get-NetUser cmdlet允許在Active Directory環境中枚舉域用戶。儘管沒有使用PowerShell,但我發現目標環境中的主機上並沒有應用程序的白名單。因此,我開始將PowerShell功能轉換為C#代碼,將程序本地編譯為可執行文件(PE)文件,然後將PE文件上傳到目標機器並執行它們。這種策略是成功的,我能夠使用這些自定義程序來提升許可權至目標環境中的域管理員。
Raphael同意Cobalt Strike信標內添加在內存中載入這些程序的功能會很有用,大約8個月後,此功能通過execute-assembly命令被整合到Cobalt Strike 3.11版本中。
三、execute-assembly示例
在本演示中,使用了一個名為「get-users」的自定義C#.NET程序。該組件重現了PowerView「Get-NetUser」cmdlet的一些功能;它查詢指定域的域控制器以獲取當前所有域帳戶的列表。獲得的信息包括每個帳戶的SAMAccountName,UserGivenName和UserSurname屬性。域名是通過傳遞其FQDN作為參數來指定的,然後將結果發送到stdout。在Cobalt Strike信標內程序執行結果如圖1所示。
圖1:在Cobalt Strike信標中使用「execute-assembly」命令
很簡單吧,現在我們來看看此技術的工作原理。
四、execute-assembly工作原理
為了更多地了解execute-assembly命令是如何工作的,在運行ProcMon的主機上重複執行圖1中的過程。ProcMon執行後的進程樹結果如圖2所示。
圖2:執行「execute-assembly」命令後ProcMon的進程樹
在圖2中,powershell.exe(2792)進程包含信標,而rundll32.exe(2708)進程用於載入和執行get-users程序。請注意,本例中powershell.exe顯示為rundll32.exe的父進程,因為Cobalt Strike信標是通過使用PowerShell單線程啟動的;然而,通過利用各種進程遷移技術,幾乎任何進程都可以用於託管信標。根據這些信息,我們可以確定execute-assembly命令與其他 Cobalt Strike post-exploitation jobs類似。在Cobalt Strike中,為了確保信標的穩定性,一些功能被載到新的進程中。rundll32.exe默認情況下使用,但可以更改此設置。為了將必要的代碼遷移到新進程中,使用了CreateRemoteThread 函數。可以通過在使用Sysmon監視主機的同時執行execute-assembly命令來確認是否可以使用此功能。使用CreateRemoteThread函數生成的事件如圖3所示。
圖3:執行「execute-assembly」命令後創建的CreateRemoteThread Sysmon事件
有關此事件的更多信息如圖4所示。
圖4:圖3所示的Sysmon CreateRemoteThread事件的詳細信息
為了執行提供的程序,必須將CLR(公共語言運行時庫)載入到新創建的進程中。從ProcMon日誌中,我們可以確定在此步驟中載入的確切DLL。部分DLL如圖5所示。
圖5:載入到rundll32中用於託管CLR的DLL示例
另外,載入到rundll32進程中的DLL包括get-users程序所需的那些DLL,例如用於LDAP通信和Kerberos身份驗證的DLL。部分DLL如圖6所示。
圖6:載入到rundll32以進行Kerberos身份驗證的DLL示例
ProcMon日誌確認所提供的程序永遠不會寫入磁碟,從而使execute-assembly命令成為純內存中的攻擊。
五、檢測和阻止execute-assembly
有幾種方法可以阻止execute-assembly命令。如前所述,由於該技術是基於Cobalt Strike框架的,因此它使用了EDR解決方案通常檢測到的CreateRemoteThread函數。但是,BYOL技術的其他實現可能不需要使用CreateRemoteThread函數。
execute-assembly技術利用本地LoadImage函數來載入提供的程序。CLRGuard掛鉤該函數,並阻止它的執行。CLRGuard阻止執行execute-assembly命令的示例如圖7所示。
圖7:CLRGuard阻止執行「execute-assembly」技術
由此產生的錯誤顯示在圖8中的Cobalt Strike teamserver上。
圖8:當CLRGuard阻止「execute-assembly」時Cobalt Strike顯示錯誤
雖然CLRGuard可有效阻止execute-assembly命令以及其他BYOL技術,但在系統上禁止使用LoadImage函數會對其他正常應用程序產生負面影響,因此不建議在實際環境中使用。
與幾乎所有的安全問題一樣,特徵和相關性是檢測這種技術的最有效手段。可關聯的可疑事件包括通常不使用它的進程使用LoadImage函數,並將異常的DLL載入到進程中。
六、BYOL的優點
由於先進的攻擊者普遍使用PowerShell腳本,惡意PowerShell活動的檢測已成為當前檢測方法的主要焦點。特別是,版本5的PowerShell允許使用腳本塊記錄,它能夠準確記錄系統執行的PowerShell腳本,而不管混淆技術如何。另外,可以使用CL(約束語言)模式來限制PowerShell功能。雖然繞過這些保護措施(如PowerShell降級攻擊),但攻擊者的每個繞過企圖都會觸發防禦者的另一事件。BYOL允許執行由PowerShell腳本執行的攻擊,同時完全避免所有可能的基於PowerShell的警報。
PowerShell不是唯一一個惡意使用被防禦方跟蹤的本地二進位文件。其他可以生成警報的常見二進位文件包括WMIC,schtasks / at和reg。由於C#代碼的靈活性,所有這些工具的功能都可以在自定義.NET程序中重現。在不使用這些工具的情況下執行相同的功能,基於惡意使用的警報將無效。
最後,由於使用了反射載入,BYOL技術可以完全在內存中執行,而無需寫入磁碟。
七、總結
BYOL提供了一種強大的新技術,可以讓紅隊在交戰中不被發現,並且可以輕鬆地與Cobalt Strike的execute-assembly命令一起使用。另外,使用C#程序可以為攻擊者提供比類似的PowerShell腳本更大的靈活性。基於CLR技術的檢測,例如掛鉤反射性載入程序的函數,應該納入防禦之中,因為這些攻擊可能隨著LotL技術的檢測成熟而變得更加普遍。
※通過公式注入從電子表格中提取數據(一)
※攻擊新套路:在MS Office文檔中嵌入Flash 0day漏洞
TAG:嘶吼RoarTalk |