一款新的殼---Amber----外文翻譯
介紹一種新的“打包方法”(packer 這裡應該翻譯為”殼”:第一個“首款??”反射式PE 打包器”殼“—Amber
由於作業系統內部安全標準的提高以及惡意軟體檢測技術的突飛猛進,如今的惡意軟體作者開始利用記憶體內執行[由記憶體執行]程式碼的透明性。PE檔案由記憶體執行(或者稱為無PE 檔案執行)就是通過手動完成通常作業系統載入器在執行一個PE 檔案時所提供的功能來在記憶體中執行一個被編譯的PE 檔案(這裡我用的是長單句,貌似翻譯的時候最好使用分開的句子,PE 檔案由記憶體執行就是在記憶體中執行一個被編譯的PE檔案,即手動完成通常作業系統載入器在執行一個PE 檔案時所提供的功能
當前惡意軟體檢測的上升趨勢是通過使用機器學習來使惡意軟體的檢測自動化,這需要在系統中有大量的資料集,如所有的使用機器學習的應用程式一樣,隨著時間的推移,當我們輸入了越來越多的惡意樣本之後,這個機制會變得更加聰明,更加準確。這些機制可以為人類惡意軟體分析師無法測量的大量系統提供支援。BitDefender羅馬尼亞實驗室的Gavriluţ Dragoş的論文“Malware Detection Using Machine Learning【2】”比較全面的講述了機器學習應用在惡意軟體檢測時的內部工作。根據Konrad Rieck 的論文“Automatic Analysis of Malware Behavior using Machine Learning【3】”,有了足夠的資料和時間,假陽性結果的機率將趨於0%,對於新的異常的惡意軟體,惡意軟體的確定性檢測的有效性將顯著性提高。
因此,這個工作的目的是開發一種新的PE 檔案加殼方法,該技術將改變在一個系統上釋放惡意軟體的方式。通過無檔案程式碼注入將有效載荷釋放到系統上直接越過了大多數的安全機制,而不是嘗試尋找一種新的反檢測技術,新的反檢測技術最終只會成為機器學習資料集的一部分。有了這種新的加殼方法,就可以將編譯生成的PE檔案轉換為多階段感染有效載荷,這些有效載荷可以與常見的軟體漏洞(如緩衝區溢位)一起使用。
已知的方法
以下技術是我們新加殼方法的靈感。
反射DLL 注入【4】
這是Stephen Fewer 開發的一種比較好的庫注入技術,也是這個稱為“Amber”的新的殼的最主要的靈感。這個技術可以在記憶體中執行使用反射式程式設計方法特殊構建的DLL。由於採用了反射式程式設計,該技術支援多階段有效載荷部署。另外,除了這個技術的許多優點外,它有很少的限制。首先,這個技術限制惡意軟體必須是DLL或者被重新編譯為DLL檔案,不幸的是,大多數情況下,將一個已經編譯的EXE 檔案轉換為DLL 是不可實現的,或者將需要在二進位制層面上進行大量的工作。第二個限制是程式碼的實現需要重定位資料。反射DLL 注入技術需要重定位資料以調整DLL在記憶體中的基地址。另外,這個技術已經存在了很長時間,這意味著最新的安全產品可以輕易的檢測到反射DLL 注入的使用。我們的新的工具,”Amber”將為這些限制提供對應的解決方法。Process Hollowing【5】
這是另一個眾所周知的記憶體中執行惡意軟體方法,該方法使用windows 的公開API 函式建立一個新的程序並將PE 檔案對映進該程序。這種方法在加密器和殼中非常受歡迎,它們旨在降低惡意軟體的檢測率。但是這種方法也有一些缺點。由於最新的Windows 作業系統中的ASLR 安全措施,建立新程序時記憶體區的地址是隨機的,因此在最新的Windows 系統上,”Process Hollowing”也需要實現映象基址重定位。如前所述,基址重定位需要PE 檔案中的重定位資料。另一個缺點是,由於特定的檔案對映和程序建立API 函式以特定的序列被呼叫,這個方法很容易被安全產品識別。Hyperion【6】
這是由Christian Amman 在 2012 年開發併發布的一個PE 檔案加密器。它解釋了執行時加密的理論及其實現方式。其彙編格式的PE 解析方法和開發Hyperion 過程中使用的設計觀點對於構建我們自己的POC 殼很有幫助。
新的殼的技術細節:”Amber”
在作業系統記憶體中執行一個被編譯的二進位制檔案的基本原則就是模仿作業系統的PE 載入器的行為。在Windows 中,PE 載入器做了許多重要的工作,其中,對映一個檔案到記憶體中以及解析匯入表對於執行一個EXE 檔案來說是最重要的兩個階段。當前在記憶體中執行一個EXE 檔案的方法使用了特定的Windows API 來模仿Windows PE 載入器。一般的方法就是通過呼叫CreateProcess 來建立一個暫停的程序,之後通過NtMapViewOfSection,MapViewOfFile 以及CreateFileMapping 函式將整個EXE 映象對映到新建立的程序中。這些函式的使用表明了可疑的行為並增加了惡意軟體的檢測可能性。開發我們的殼的關鍵之一就是我們將盡量少使用API 函式。為了避免可疑的檔案對映檔案的使用,我們的殼使用預封裝 PE 映象,而且是在目標程序內部執行惡意軟體,而不使用CreateProcess 函式。惡意軟體將和其宿主程序擁有同樣的程序特權,因為共享的_TEB 塊中包含了一個程序的特權資訊和配置。Amber 有兩種存根,一個是為了那些支援ASLR的EXE設計的,另一個是為了那些被剝離,或不包含任何重定位資訊的EXE 檔案設計的。支援ASLR 的存根使用了總共4個Windows API,另一個使用了3個大部分正當應用程式都會使用到的API。
支援ASLR 的存根:
1. VirtualAlloc
2. CreateThread
3. LoadLibraryA
4. GetProcAddress
不支援ASLR 的存根:
1. VirtualProtect
2. LoadLibraryA
3. GetProcAddress
為了在執行時呼叫這些API,Amber使用了反射DLL 注入中所使用的公開的EAT 解析技術。此技術定位記憶體中的PEB 結構中的InMemoryOrderModuleList 結構,然後通過InMemoryOrderModuleList 指向的_LDR_DATA_TABLE_ENTRY 結構體可以獲得所有的已載入的DLL 的匯出表。獲得一個載入的DLL的匯出表後,它將先前計算的ROR(右轉)13雜湊值與每一個匯出函式名的ROR13雜湊值進行比較,直到發生匹配為止。
Amber 的加殼方法另外提供了可選的Windows API 使用方法,其中一個就是使用固定的API 地址,如果使用者熟悉將宿納Amber 有效載荷的遠端程序,這將是最好的選項。使用固定的API 函式地址將直接越過最新的作業系統級別的漏洞利用緩解措施(檢查匯出地址表呼叫),另外,除去API 地址查詢程式碼將使整個有效載荷更小。另一個可選的定位所需函式的地址的技術稱為“IAT 解析技術”,Josh Pitts 在他的文章“Teaching Old Shellcode New Tricks【7】”中描述了這一方法。當前版本的Amber 僅支援固定API 地址以及EAT 解析技術,IAT 解析技術將在後續的版本中新增。
生成有效載荷
為了生成實際的Amber有效載荷,加殼器首先建立了一個惡意軟體的記憶體對映映象,生成的記憶體對映檔案包含了所有部分,可選的PE頭和其它尚未使用的使用0填充的部分。
得到惡意軟體的對映之後,加殼器檢查所提供的EXE 檔案的ASLR 相容性,如果EXE 是ASLR 相容的,加殼器新增相關的Amber 存根,不相容則使用為固定基地址EXE 檔案準備的存根。這樣Amber 有效載荷就完成了。下面的圖片描述了Amber 有效載荷在目標程序中的結構。
ASLR 存根的執行
支援ASLR 的存根的執行包含5個步驟:
1.基址申請
2.解析API 函式
3.基址重定位
4.檔案對映的位置
5.執行
在基址申請階段,存根通過呼叫VirtualAlloc 函式申請一個與被對映的惡意軟體映象的大小相同的可讀可寫可執行特權的記憶體空間。
這個記憶體空間將是在重定位處理之後惡意軟體的一個新的基地址。第二階段,解析匯入函式的地址,並寫入到惡意軟體的被對映映象的匯入地址表中。
地址解析階段使用的方法和Windows PE 載入器十分相似,Amber 存根將解析被對映的惡意軟體映象的匯入表項並通過呼叫LoadLibraryA 函式來載入惡意軟體所用到的每個DLL,匯入表中的每一個_IMAGE_IMPORT_DESCRIPTOR 項都包含指向被對應的DLL 的名稱的指標,存根將利用這個已經存在的字串並將其傳遞給LoadLibraryA 函式。
載入了所需要的DLL 之後,Amber 存根儲存DLL 控制代碼並通過GetProcAddress 函式從被載入的DLL 尋找其匯入函式,_IMAGE_IMPORT_DESCRIPTOR 結構還包含了一個指標,指向一個稱為匯入名稱表的結構,這個結構包含了匯入函式的名稱,其順序和IAT 的順序相同。呼叫GetProcAddress 函式時,Amber 存根將儲存的之前載入的DLL 的控制代碼,匯入名稱表結構中指向的匯入函式的名稱傳遞進去。
第三階段,重定位處理,即根據VirtualAlloc 函式返回的地址調整一些地址,這個功能幾乎和windows 自己的PE 載入器一樣,存根首先計算VirtualAlloc 函式返回的地址與惡意軟體首選的基地址的差值,這個差值被加到重定位表中的每一項上。第四階段中,Amber 存根會把檔案對映放置到剛才申請的空間,通過一個簡單的彙編迴圈就可以單位元組移動它。
最後,Amber 存根將以惡意軟體的入口地址為引數呼叫CreateThread 建立一個新的執行緒。建立新執行緒是為惡意軟體建立一個新的可增長的堆疊,並且在新執行緒中執行惡意軟體將允許目標程序以以前的狀態繼續下去。建立惡意執行緒後,存根將恢復執行,返回到第一個呼叫者,或者進入一個無限迴圈中,無限迴圈將阻塞當前執行緒,同時惡意執行緒成功執行。
非ASLR 存根執行
非ASLR 支援的存根的執行包含四階段:
1.基址申請
2.解析API 函式
3.檔案對映的位置
4.執行
如果惡意軟體被修剪,或者其內部沒有重定位資料,只能將其放置到其首選的地址。此時,存根嘗試呼叫VirtualProtect函式來修改目標程序的記憶體訪問許可權,從惡意軟體首選的起始地址開始,大小為惡意軟體大小。如果這種情況發生,首選基地址和目標程序已有記憶體區可能重疊,目標程序在Amber 有效載荷執行後將無法繼續下去。
固定的Amber存根可能無法修改特定的記憶體區域的訪問許可權,這有多方面的原因,比如,特定的記憶體區域沒有在當前程序的頁面邊界內(通常是因為ASLR)或特定的地址和棧守護區域重疊。這是Amber 有效載荷的主要的限制,若所提供的惡意軟體沒有ASLR 支援(內部沒有重定位資料)且存根不能修改目標程序的記憶體訪問許可權,有效載荷的執行將不可行。某些情況下,存根成功修改了記憶體區域的訪問許可權,但是程序立即崩潰,這可能是因為多個執行緒在該覆蓋的區域內執行。如果目標程序擁有多個執行緒,當固定的存根執行的時候,程序可能由於記憶體的特權被修改或者覆蓋了正在執行的區域而崩潰。但是,如果固定的存根不使用多階段感染有效載荷,這些限制無關緊要,當前的POC加殼器可以相應地調整生成的EXE檔案的映像基址以及Amber有效載荷的位置。如果分配嘗試成功結束,第一階段完成。第二階段與支援ASLR的存根使用的方法相同。在完成API地址的解析之後,使用同樣的彙編迴圈來將完整的檔案對映放置到之前修改的記憶體區域。
最後一個階段,存根跳轉到惡意軟體的入口點,並開始執行,而不新生成一個執行緒來執行。不幸的是,非ASLR 支援的Amber存根所在的宿主程序無法以之前的狀態繼續執行。
多階段應用程式
不久的將來,作業系統將採用的安全措施會減少惡意軟體的攻擊面。Microsoft 在2017.05.02釋出了一個新的Windows 10 S【8】,這個作業系統基本就是一個特殊配置的Windows 10,其配置了更高的安全性。這個新的作業系統所採用的其中一個主要的預防措施是:不允許從Windows 應用商店以外安裝應用程式。作業系統所採用的這種白名單機制將影響那些通過可執行檔案感染系統的惡意軟體。在這種情境下,多階段記憶體執行負載將成為最有效的攻擊載體之一。Amber 存根是位置無關的,因此它允許多階段攻擊模型,當前的POC 加殼器能夠從一個複雜的編譯生成的PE 檔案生成一個有效載荷,該有效載荷能夠像通常的shellcode 注入攻擊一樣被載入到記憶體中並執行。在這種過於嚴格的系統中,Amber的多階段相容性允許利用基於記憶體的軟體漏洞,如棧和堆為基礎的緩衝區溢位。
儘管如此,由於固定Amber 存根的限制,當執行多階段感染攻擊的時候,最好使用支援ASLR 的EXE 檔案。POC 加殼器生成的有效載荷和Metasploit Framework 生成的小的載入器shellocode 與 有效載荷是相容的,這意味著Amber 有效載荷可以與Metasploit Framework【9】 中使用多階段命令shellcode 的漏洞利用一起使用。
下面是Amber 的原始碼:
https://github.com/EgeBalci/Amber
Demo1-通過metasploit stagers 部署EXE 檔案
本視訊演示如何使用metasploit中經常使用的有效載荷將常規的EXE檔案部署到系統中。從Metasploit生成的exe檔案獲取Amber的階段負載並在記憶體中執行。
https://youtu.be/3en0ftnjEpE
Demo2-使用Amber 配置無檔案的勒索軟體(3個不同AV)
這個視訊是一個很好的例子,展示了一種可能的勒索軟體攻擊載體。通過使用Amber,一個勒索軟體EXE 檔案被打包並以無檔案指令碼負載的方式部署在一個遠端系統上。這種攻擊也可以被替換為使用任何型別的緩衝區溢位漏洞。
https://youtu.be/JVv_spX6D4U
被檢測率
當前(2017.10.19)POC 加殼器的檢測率是非常理想的,但由於這個方法即將公開,因此其被檢測率肯定會上升。
當沒有傳遞其它的引數時(僅僅傳遞檔名),加殼器生成一個多階段載荷,然後使用隨機的多位元組金鑰進行基本的XOR加密,將加密後的資料組合成EXE 檔案,這將增加其反檢測功能。生成的EXE 檔案在解密載荷之後並進行相應的環境檢查之後,像常規的shellcode 一樣執行載荷。這個例子是12 位元組 XOR 金鑰(./amber mimikatz.exe -ks 12)打包的mimikatz.exe(sha256- 9369b34df04a2795de083401dda4201a2da2784d1384a6ada2d773b3a81f8dad)檔案。在VirusTotal 上,加殼前的mimikatz.exe 檔案的檢測率為51/66。在這個特殊的示例中,加殼器使用預設方式來查詢windows API 地址,預設方法將使用hash API,避免使用hash API 會降低檢測率。目前加殼器支援IAT 偏移的固定地址的使用,下一個版本將包括IAT 解析器shellcode 以提供更多可選的API 地址查詢方法。
Virus Total 檢測
VirusCheckmate Result
http://viruscheckmate.com/id/1ikb99sNVrOM
NoDistribute
https://nodistribute.com/result/image/7uMa96SNOY13rtmTpW5ckBqzAv.png
將來需要做的
這個工作介紹了一種新的給PE 檔案生成惡意軟體殼的方法,但是這個方法當前並不支援.NET 可執行檔案,將來我們可能增加對於64-bit PE 檔案和.NET 可執行檔案的支援。另外,就隱蔽性來說,這個方法還有很多可以提升的地方。比如說為整個被對映映象申請RWE 許可權,在我們將被對映的映象放置好之後,根據被對映映象的記憶體區來修改記憶體區域的訪問許可權可以降低檢測率。另外,在地址解析階段完成後清除PE 頭可以使記憶體掃描器的檢測更加困難。Amber POC 打包器的開發人員將繼續以開源形式維護該專案。
參考連結
1 Ramilli, Marco, and Matt Bishop. “Multi-stage delivery of malware.” Malicious and Unwanted Software (MALWARE), 2010 5th International Conference on. IEEE, 2010.
2 Gavriluţ, Dragoş, et al. “Malware detection using machine learning.” Computer Science and Information Technology, 2009. IMCSIT’09. International Multiconference on. IEEE, 2009.
3 Rieck, Konrad, et al. “Automatic analysis of malware behavior using machine learning.” Journal of Computer Security 19.4 (2011): 639-668.
4 Fewer, Stephen. “Reflective DLL injection.” Harmony Security, Version 1 (2008).
5 Leitch, John. “Process hollowing.” (2013).
6 Ammann, Christian. “Hyperion: Implementation of a PE-Crypter.” (2012).
7 Pitts, Josh. “Teaching Old Shellcode New Tricks” https://recon.cx/2017/brussels/resources/slides/RECON-BRX-2017 Teaching_Old_Shellcode_New_Tricks.pdf (2017)
8 https://news.microsoft.com/europe/2017/05/02/microsoft-empowers-students-and-teachers-with-windows-10-s-affordable-pcs-new-surface-laptop-and-more/
9 Rapid7 Inc, Metasploit Framework https://www.metasploit.com
10 Desimone, Joe. “Hunting In Memory” https://www.endgame.com/blog/technical-blog/hunting-memory (2017)
11 Lyda, Robert, and James Hamrock. “Using entropy analysis to find encrypted and packed malware.” IEEE Security & Privacy 5.2 (2007).
12 Nasi, Emeric. “PE Injection Explained Advanced memory code injection technique” Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License (2014)
[13] Pietrek, Matt. “Peering Inside the PE: A Tour of the Win32 Portable Executable File Format” https://msdn.microsoft.com/en-us/library/ms809762.aspx (1994)
原文連結https://pentest.blog/introducing-new-packing-method-first-reflective-pe-packer/