一、概述
反病毒方案通常用于檢測惡意軟件,并且通常要依靠靜態分析來區分文件的好壞。如果文件自身就包含惡意內容,那么這種方法會有效。但如果攻擊者使用輕量級的Stager來代替下載,并將代碼加載到內存中,那么會發生什么呢?事實證明,這是繞過反病毒軟件的一種好方法。
盡管這種方法并不新鮮,但繞過反病毒軟件對于大多數現代惡意軟件來說都很常見,我們希望提供一些有關如何構建此類Payload時應該采取步驟的思路,并說明防御者如何使用常見的EDR工具來大規模檢測此類活動。
在本文中,我們將使用VirusTotal作為檢測的標準,并使用Metasploit反向TCP ShellCode作為Payload。這提供了一種粗略的方法,可以衡量出Payload的有效性,但是需要注意的是,只有動態檢測或基于行為的檢測,才能捕獲到現實世界中的Payload。
二、攻擊方式
2.1 Msfvenom文件創建
我們從基礎知識開始,首先使用msfvenom創建一個反向Shell可執行Payload,其中包括以下命令:
將此文件上傳到VirusTotal,發現它被大量反病毒引擎標記,這是正常的,因為它是一個常見的Payload,許多安全廠商都會針對Metasploit進行檢測與查殺。
鑒于將該文件標記為惡意的引擎數量較多,所以大部分EDR都能夠有效檢測出來。此外,某些引擎命中的名稱也很好的說明了該文件的性質,例如:Trojan:win32/Meterpreter.O。
2.2 嵌入式Meterpreter ShellCode
鑒于大多數反病毒廠商都掌握了Metasploit可執行模板的簽名,因此我們決定創建自己的可執行文件,然后再執行Metasploit ShellCode。我們再次使用msfvenom,但在這次只生成ShellCode,而不是完整的可執行文件:
我們將ShellCode復制到一個單獨的C++源文件中,通過這個簡單的步驟,可以調用memcpy,以將指令加載到內存中。我們發現,VirusTotal的命中數量明顯減少,由45減少到了14。
命中數量的減少,說明了反病毒簽名與Metasploit可執行模板具有強相關性。但是,還有其他方法能夠減少文件被VirusTotal引擎命中的數量。
2.3 遠程托管ShellCode
我們測試的第三種技術,涉及到動態加載ShellCode。它不是使用已編寫到二進制文件中的ShellCode編譯可執行文件,而是在運行時檢索ShellCode,并將其加載到內存中。
我們創建了一個名為get_shellcode()的函數,用于從另一臺主機遠程檢索前面示例中使用的msfvenom ShellCode。該函數使用winhttp庫中的各種方法,通過HTTP的方式檢索ShellCode。此外,當從遠程位置以ASCII格式檢索ShellCode時,需要執行額外步驟,以將指令轉換為準備執行的原始二進制格式。
這導致VirusTotal命中率從14下降到5。這表明,一些引擎可能使用了基于Metasploit ShellCode模式的簽名。從二進制文件自身中刪除ShellCode之后,它現在就能夠繞過這些引擎。
2.4 元數據更改
一些反病毒引擎會查閱文件的元數據,從而判斷其來源和安全性。Visual Studio提供了一種更改元數據的簡單方法,允許我們修改二進制屬性,從而使其與信譽良好的軟件廠商匹配。我們唯一需要進行的步驟,就是向項目中添加“Version”資源,并從合法的可執行文件中復制條目。
在將cmd.exe中的元數據復制到可編輯的字段中后,我們將二進制文件重新提交到VirusTotal。這時,命中率減少到僅有3。這意味著,某些引擎會針對元數據來自信譽良好的廠商的文件增加傾向于合法的權重。
2.5 替代HTTP函數
盡管已經刪除了Metasploit模板和ShellCode,并添加了元數據,但仍然可以捕獲到Payload。為了獲得0命中率,我們要思考,在這一過程遺漏了什么?
我們需要重新思考,首先要確定代碼的哪個部分導致了告警。從直覺上,懷疑是函數VirtualAlloc(帶有READWRITE_EXECUTE參數)和memcpy導致3個反病毒引擎認為該文件是可疑的,因為這些函數通常用于內存注入。然而,事實證明這是不正確的。實際上,為HTTP請求調用的函數可以獲得遠程托管的ShellCode,從而導致可疑的結果。我們使用的函數是:
幸運的是,Windows中提供了許多不同的庫,可以用于下載數據,例如Winlnet、WinHTTP和Windows Sockets。通過切換到更加人工的基于套接字的實現,成功讓任何反病毒引擎都不會將下載的代碼標記為可疑。
然后,我們將其與先前演示的ShellCode加載進程相結合。
最終,Payload成功向偵聽的主機發送了反向Shell,更重要的是,VirusTotal上的檢出率為0。
本文所采取的步驟,展示了如何通過一些簡單的修改,來使Payload繞過安全控制。然而,我們還可以選擇許多其他選項,包括:
1. 在已知合法的二進制文件中插入Payload(https://github.com/secretsquirrel/the-backdoor-factory)。
2. 使用Veil(https://github.com/Veil-Framework/Veil)進行Payload的編碼和加密。
3. 使用其他語言,例如:PowerShell、Python、Ruby、C#、Java、Go等。
4. 對Payload進行代碼簽名。
顯然,作為攻擊者,應該避免將文件提交到VirusTotal。
三、檢測
在展示了如何創建二進制文件,從而動態加載代碼并繞過VirusTotal之后,我們現在將討論在我們的環境中發現此類可執行文件的一些不同的方式。
EDR終端通常會全面分析進程、網絡、文件、注冊表和模塊加載事件。這些數據集中,有多種方法可以用于檢測本文中展示的惡意二進制文件生成的活動。
3.1 進程/文件數據
當二進制文件執行EDR時,通常會追蹤進程的名稱、其父進程以及這些進程的元數據。通常,還集成了VirusTotal來幫助檢測以前看到的惡意二進制文件。但是,有一些不同的狩獵用例,可以用于發現VirusTotal可能遺漏的惡意二進制文件,包括:
1. 普遍性:如果在VirusTotal或者我們的環境中從未發現過這個二進制文件,那么它可能會被歸類為異常,并且可能具有惡意性質。
2. 元數據偽造:可以使用許多不同的搜索方式來檢測元數據欺騙,其中最明顯的一種,是掃描使用了Microsoft元數據,但不是Microsoft二進制文件的文件。
3.2 模塊加載
模塊加載信息可以幫助我們檢測具有潛在可疑導入的二進制文件,例如WinHTTP或導入的異常組合。在本文中構建的二進制文件,需要執行網絡通信和內存注入的功能。
例如,DLL和函數是:
搜索與這些DLL相關聯的模塊加載事件,或者任何其他DLL文件的缺失,可能會為我們提供一種搜索異常二進制文件的方式。請記住,盡管kernel32和winhttp被廣泛使用,但如果只是單獨搜索這些事件,將會產生大量的誤報。
3.3 網絡通信
建立進程網絡通信的基線,可能是發現網絡上異常二進制文件的一種強大技術。例如,我們可能需要考慮:
1. 文件名、路徑、遠程IP、遠程端口的聚合數據。
2. 過濾掉瀏覽器、更新程序和核心Windows進程等常用進程。
3. 基于IP信譽,不斷豐富已知合法、已知惡意和未分類的地址和域名。
這樣的過程,應該可以幫助我們找到創建異常連接的二進制文件,例如本文中惡意文件的網絡連接行為。
3.4 內存注入
本文中使用的Meterpreter Payload通過反射的方式將3個DLL加載到目標進程的內存之中,從而實現最終的惡意目的??梢允褂矛F代的EDR工具,來檢測注入代碼的進程,以及所產生的異常存儲區域。
例如,Countercept的EDR終端可以突出顯示具有讀取、寫入執行權限和包含DLL特定指標(例如:MZ和PE標頭)的異常區域。
截圖中展現了4個反射加載的區域(1對應于Stager,而3對應于反射加載的DLL)。為了確認是使用Meterpreter作為植入物,可以選擇幾種不同的機制。第一種(也是最原始的一種)是查看區域的模塊大小,這些大小與3個Meterpreter DLL的大小相近。另一種方法是手動或使用YARA分析區域中的內容。
四、YARA
有許多種不同的方法,可以大規模分析可執行文件。一種是使用YARA簽名,它可以幫助我們掃描磁盤上的文件內容,或作為正在運行的進程加載到內存中。
4.1 字符串
在進行任何類型的惡意軟件分析或逆向工程之前,采取的最簡單步驟就是查看二進制,或內存轉儲中存在的字符串。我們的惡意二進制文件的字符串輸出如下所示:轉到第二個二進制文件,即調用寫入源代碼ShellCode的Windows C++程序,我們可以使用類似的檢測方法。
沒有任何其他上下文,這些字符串已經很好地指示了二進制文件的行為。IP地址(172.16.28.46)和WinHTTP調用的存在,表明程序可能會連接到該地址。此外,程序可能會嘗試下載文件revshell.txt,似乎符合邏輯,但該文件實際上包含ShellCode的Payload。
4.2 ShellCode檢測
這篇文章的前兩個例子,是在二進制文件自身中包含ShellCode。而最終的示例會動態下載ShellCode,并將其存儲在內存中。針對這兩種情況,都可以檢測到ShellCode為默認msfvenom Payload(如windows/meterpreter/reverse_tcp)具有的常見十六進制指令,無論它們使用了什么IP或端口。
為了演示具體的檢測原理,我們將使用Radare打開二進制文件。搜索前幾個十六進制指令,我們就可以找到ShellCode。
在確認位置后,我們可以獲取341個字節(Payload的大?。┮垣@得完整的Payload。為了大規模執行此操作,我們可以將這個簡單的十六進制搜索轉換為Yara簽名。
五、總結
VirusTotal這些平臺的豐富來源,可以幫助安全團隊有效地發現已知的惡意文件。然而,正如這篇文章所展示的,僅依靠VirusTotal不足以捕獲所有可疑的文件,因為盡管已經是2019年,但編寫可以逃避大多數反病毒引擎檢測的可執行文件也是比較容易的。
責任編輯:韓希宇
免責聲明:
中國電子銀行網發布的專欄、投稿以及征文相關文章,其文字、圖片、視頻均來源于作者投稿或轉載自相關作品方;如涉及未經許可使用作品的問題,請您優先聯系我們(聯系郵箱:cebnet@cfca.com.cn,電話:400-880-9888),我們會第一時間核實,謝謝配合。