2022年6月,卡巴斯基實驗室的研究人員在一個系統進程的內存中發現了一個可疑的shellcode。
為此,他們深入分析了shellcode是如何放置到進程中的,以及受感染系統上的威脅隱藏在何處?
感染鏈
雖然研究人員無法復制整個感染進程,但他們能夠從PowerShell執行的位置重建它,如下圖所示。
攻擊流程
簡而言之,感染鏈如下:
·PowerShell腳本通過任務計劃程序運行,並從遠程服務器下載lgntoerr.gif文件;
·該腳本解密lgntoerr.gif,生成一個.NET DLL,然後加載該DLL;
·.NET DLL從其資源中提取並解密三個文件:兩個DLL和一個加密的有效負載。
提取的文件被放置在ProgramData目錄中。
·.NET DLL創建一個任務,在系統啟動時通過任務調度程序自動運行合法的ilasm.exe組件;
·任務調度程序從ProgramData目錄啟動ilasm.exe;
·ilasm.exe從同一目錄啟動fusion.dll,這是一個惡意的DLL劫持程序;
·fusion.dll加載第二個解密的DLL;
·該DLL創建一個掛起的dllhost.exe進程;
·然後,它對加密的二進制文件中的有效負載進行解密;
·解密後的有效負載作為DLL加載到dllhost.exe進程中;
·dllhost.exe進程的PID保存在ProgramData目錄中的一個文件中;
·dllhost.exe進程將控制權傳遞給解密的有效負載;
·有效負載DLL提取並在內存中啟動挖礦DLL;
他們把這個惡意軟件命名為Minas。
根據研究人員對感染鏈的重建,他們確定它是通過將編碼的PowerShell腳本作為任務運行而產生的,他們不太確信該腳本是通過GPO創建的:
編碼的PowerShell命令
技術細節
PowerShell腳本的核心功能是啟動惡意軟件安裝進程。
為此,PowerShell腳本從遠程服務器下載加密有效負載,使用自定義異或加密算法(密鑰為『fuckkasd9akey』)對其解密,並將負載加載到內存中:
已解碼的PowerShell命令
負載是由PowerShell進程啟動的.NET二進制文件《DLL》,它傳遞三個參數:
$a.GetType(『I.C』).GetMethod(『I』).Invoke($null,([Byte[]]($d),』A5D9FD13″,0));
1.$d: .NET DLL作為字節數組;
2.A5D9FD13: 《用於對.NET DLL中的資源進行解密的密鑰》;
3.0:《用於阻止創建多個主有效負載進程的參數》;
此.NET二進制文件《他們將其稱為『安裝程序』》負責.NET DLL資源中包含的惡意軟件組件的後續安裝。
使用哈希函數(Ap,SDBM,RS),安裝程序創建一個目錄結構:
示例文件和目錄
接下來,它檢查系統上是否存在合法的ilasm.exe文件(版本4.0.30319位於%windir%\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe或版本2.0.50727位於%windir%\Microsoft.NET\Framework64\v2.0.50727\ilasm.exe)。
注意,如果系統上存在ilasm.exe,它應該在這些目錄之一中)。
如果沒有找到該文件,安裝進程將被終止。
只要找到ilasm.exe,就會創建一個計劃任務作為持久機制:
在此之後,文件被復制到前面提到的創建的目錄中
然後,惡意軟件繼續將安裝程序的前100個字節附加到從『_64_bin』. net DLL資源中提取的文件{RSHash(MachineName)}中,並且生成的文件被加密(密鑰是小寫的計算機名稱)。
另外,在『fusion.dll』和『{SDBMHash(MachineName)}.dll』文件中添加了多達10240個隨機字節,導致反惡意軟件產品的哈希檢測無效。
之後,安裝程序為運行的ilasm.exe啟動先前創建的任務,該任務反過來加載位於同一目錄下的惡意fusion.dll庫,假設它正在使用合法的fusion.dll (DLL劫持技術)。
惡意軟件的執行進程包括兩個加載程序:DLL劫持程序fusion.dll和下一階段的加載程序{SDBMHash(MachineName)}. DLL。
DLL劫持程序做三件事:
1.隱藏ilasm.exe進程的控制臺。
2.確定進程名是否為ilasm.exe。
如果不是,則終止進程。
3.基於SDBM哈希函數,它構建路徑C:\ProgramData\{SDBMHash(MachineName)}\{SDBMHash(MachineName)}. DLL並嘗試通過LoadLibraryA API函數將該DLL加載到內存中。
加載的 {SDBMHash(MachineName)}.dll DLL再次檢查進程名是否為ilasm.exe。
然後生成文件路徑C:\ProgramData\{SDBMHash({SDBMHash(MachineName)})}並檢查它是否存在。
如果文件存在,則從中讀取值(十進制數)。
這個十進制數字是dllhost.exe進程的PID乘以先前運行Minas時創建的0x144。
加載程序然後嘗試用該PID終止進程。
然後,它讀取並解密(記住,密鑰是小寫的計算機名稱)位於C:\ProgramData\{ApHash(MachineName)}\{RSHash(MachineName)}\{RSHash(MachineName)}的主有效負載(挖礦)。
此外,加載器創建一個進程環境變量(SetEnvironmentVariable)配置,其值為 {『addr』:』185.243.112.239:443″,』p』:』143e256609bcb0be5b9f9c8f79bdf8c9″} 。
通過進程傳遞參數
之後,{SDBMHash(MachineName)}.dll創建一個掛起的dllhost.exe進程,創建一個節,將其映射到dllhost.exe進程並寫入先前讀取和解密的文件(帶有挖礦組件的原始加載器)。
然後它讀取dllhost.exe進程的內存,確定主線程的入口點並將其重寫為:
然後將創建的dllhost.exe進程的PID乘以0x14f寫入C:\ProgramData\{SDBMHash({SDBMHash(MachineName)})},之後dllhost.exe進程繼續運行。
然後終止ilasm.exe進程。
最後,DLL .exe將控制流傳遞給解密的原始加載器,該加載器在進程內存中映射XMRig挖礦程序(XMRig挖礦程序的DLL文件形式的匯編),然後使用反射加載啟動它。
挖礦程序使用(GetEnvironmentVariable)獲取進程環境變量配置的值。
這些值用於通過以下配置挖掘加密貨幣:
總結
Minas是一個使用標準實現並旨在隱藏其存在的挖礦程序。
由於加密、隨機生成名稱以及使用劫持和註入技術,檢測難度得以實現。
它還能夠使用持久性技術駐留在受感染的系統上。
雖然研究人員目前還無法完全確定初始PowerShell命令是如何執行的,但很可能是通過GPO執行。
參考及來源:https://securelist.com/minas-miner-on-the-way-to-complexity/109692/