惡意軟件的作者通常會使用各種技術來規避防護機制,隱藏有害活動。其中有一種技術就是在可信進程中隱藏惡意代碼。通常來說,使用隱藏技術的惡意軟件會將其代碼注入到系統進程中(如explorer.exe),但是有一些樣本采用了其他有趣的方法,所以我們在本文中會分析這種惡意軟件。
我們將目光鎖定在各種.NET樣本上,這些樣本使用了來自Microsoft .NET Framework的可信程序InstallUtil.exe即安裝程序工具。
微軟的介紹:安裝程序工具使您得以通過在執行指定程序集中的安裝程序組件來安裝和卸載服務器資源。此工具與 System.Configuration.Install 命名空間中的類一起工作。
這種技術由信息安全研究員Casey Smith做了簡單的介紹(點此查看PoC)。簡而言之,控制臺程序InstallUtil.exe運行一個惡意的.NET程序集,然后繞過程序集的入口點,如此一來所有惡意活動都可以隱藏在可信程序中了。
惡意軟件樣本的傳播遵循一種標準模式:基本上是通過帶密碼保護的文件來傳播給用戶,并且大部分情況下可執行文件的圖標是結果專門選擇的,這樣會使受害者將惡意文件視為普通的文檔或照片。我們還遇到了偽裝成軟件密鑰生成器的惡意程序。生成器的惡意內容會進入到%TEMP%文件夾中,并以稍后所描述的方式運行。
分析
我們遇到的所有惡意文件都被嚴重混淆了,所以手動分析變得更加復雜。通過使用樣本263dc85de7ec717e8940b1ccdd6ee119并加以處理以得到它的符串,類,方法和字段。以下是處理之后的樣子:
InstallUtil.exe允許文件不從.NET程序集入口點開始執行,也就是從繼承自System.Configuration.Install.Installer的類開始執行。為了便于手動分析,這個類在被分析的樣本中被重命名為InstallUtilEntryClass。眾所周知,靜態類構造函數中的代碼在程序集加載到內存中時首先執行,該惡意軟件作者正是利用了這一個特性。
現在我們按照方法執行的順序來檢查惡意文件的行為。首先是FirstMainClass,因為它的構造函數被標記為關鍵字“static”,程序集的執行開始于它:
構造函數執行以下操作:
CheckSandboxieEnvironment()通過嘗試加載SbieDll.dll庫來確定文件是否在Sandboxie中運行。 如果可以加載庫,則惡意進程終止;
CheckVirtualBoxEnvironment()搜索屬于VitrualBox的vboxmrxnp.dll庫。 如果可以找到這個庫,這個惡意進程也會終止;
AddResourceResolver()添加一個處理資源加載事件的方法。 此方法將通過Deflate算法打包的程序集從特定資源中解包,并將程序集加載到內存中;
AssemblyResourceLoader類的UnpackAllAssemblies()方法遍歷所有程序集資源,如果資源名稱包含字符串“+||”,則從這些資源中解包程序集。 由這個方法解包的程序集是惡意文件運行所必需的,并且是合法的庫:Interop.MSScript.Control,Interop.TaskScheduler,SevenZipSharp;
如果該文件是從網上下載的,RemoveZoneIdentifier()就會通過命令行刪除NTFS備用流Zone.Identifier,以防止啟動時出現警告。 作者在命令行(“cmd.exe / c(echo。> file path:Zone.Identifier)2> Null”)中在字符2和>之間留出一個空格而犯了一個小錯誤。
ElevatePrivilegesProxy()方法是ElevatePrivileges()方法的封裝,使用了已知的UAC繞過技術。
我們看到一個WMI對象在30秒的暫停后被檢索到。 還有就是ScriptControlClassInstance對象是自定義的,其語言(Visual Basic腳本)和腳本的主體被轉移到:
AddCode()方法添加并執行一個使用InstallUtil.exe運行當前程序集的VB腳本。之后通過調用Environment.Exit(0)關閉當前進程。
在下一階段,惡意對象使用InstallUtil工具運行,并再次執行上面的FirstMainClass類的靜態構造函數;
這個類的功能包括:
將惡意文件復制到%APPDATA%\program\msexcel.EXE,為“program”文件夾設置Hidden + System屬性,運行msexcel.EXE,并終止當前進程;
將復制的文件添加到自動運行(HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run或HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run);
創建一個名為“filesqmaepq0d.tnk”的任務,每分鐘運行msexcel.EXE,以確保在受害者的計算機上存留;
檢查惡意進程是否已經在運行。 創建名稱為“78759961M”的事件,如果系統中已經存在這樣的事件,則新進程終止;
創建Form5類并調用其析構函數。
讓我們總結一下中期的結果:上述所有的操作(在系統中的鞏固,提權,可信應用程序的啟動)實質上是奠定了其主要任務的基礎。我們繼續分析下一階段,這更接近惡意活動的核心。
惡意程序集包含五個從System.Windows.Forms.Form繼承的類。從Form類的繼承并非偶然:在繼承層次中,它實現了幾個接口,其中之一是IDisposable,它允許為了其他目的重寫Dispose()方法。垃圾回收調用Dispose()方法,以便在關閉或卸載程序集時釋放類使用的非托管資源,F在讓我們看一下Form5類的Dispose()方法的源代碼:
如上所示,在循環的每個迭代中執行各種方法,然后結果被保存,F在來檢查詳細細節:
在第一次迭代中,檢索.NET Framework的RegAsm.exe程序的完整路徑;
調用嵌套方法鏈的目的是解碼存儲在另一個類中的Base64的字符串,并使用SevenZipExtractor庫解析結果數組。 因此,我們得到一個遠程管理工具NanoCore Client的數組;
先前從資源中導入到內存的程序集加載了PERun.dll庫;
在這個庫中尋找一個名為“RunPE”的類和這個類的Run方法;
在最后的迭代中,傳輸參數并調用Run方法。
在Run()方法內部,由CREATE_SUSPENDED狀態下創建一個合法的進程(第六個參數是4u):
最后,RegAsm.exe進程被加載到地址空間并開始執行payload,只有可信進程保留在正在運行的進程列表中,即使是有經驗的用戶也可能無法意識到系統已經被攻破:
RegAsm.exe被選為“載體”,因為:
1)它是來自Microsoft的合法程序
2)它位于與InstallUtil.exe相同的目錄中
3)來自.NET Framework的程序調用另一個程序時,調用notepad.exe這樣的程序會更可疑。事實上,使不使用RegAsm.exe并不重要:“載體”可以是任何不引起安全軟件和用戶懷疑的程序。 涉及惡意模塊的所有操作都在內存中執行也很重要,因為這可以允許其繞過文件掃描。
正如我們所提到的,這個示例包含NanoCore客戶端,可以用來控制受害者的計算機,截圖,記錄按鍵,下載文件等等, 需要注意的是,這里的有效載荷可以是任何東西:比如時髦的加密軟件,挖礦工具或者高級木馬。
總結
惡意軟件編寫者使用各種技巧來隱藏惡意行為,上述允許在兩個合法程序中執行惡意代碼的技術就是一個明顯的例子。而檢測這種隱藏方法需要對程序進行行為分析。 卡巴斯基實驗室的安全解決方案將這種行為檢測為PDM:Trojan.Win32.Generic和PDM:Exploit.Win32.Generic。
IOC(MD5)
263DC85DE7EC717E8940B1CCDD6EE119 payload:EF8AF3D457DBE875FF4E3982B34F1DE9
3E4825AA1C09E27C2E6A1309BE8D6382 payload:82709B139634D74DED404A516B7952F0
7E3863F827C1696835A49B8FD7C02D96 payload:D1A9879FFCB14DF70A430E59BFF5EF0B
8CB8F81ECF1D4CE46E5E96C866939197 payload:D8652841C19D619D2E3B5D7F78827B6E
FDF4086A806826503D5D332077D47187 payload:BF4A3F4B31E68B3DE4FB1F046253F2D0