一步一步分析勒索軟件Darkside(上)
摘要
勒索軟件Darkside是在Colonial Pipeline攻擊活動中使用的一個惡意軟件家族,于2021年5月7日被曝光,詳情可參考https://www.zdnet.com/article/darkside-the-ransomware-group-responsible-for-colonial-pipeline-cyberattack-explained/。該二進制文件包含一個經過加密的配置,它需要使用自定義算法進行解密;另外,該配置含有一個22字節的緩沖區,用于描述該惡意軟件執行的不同操作。這些操作包括:檢查系統語言并避免加密俄語機器,刪除卷影副本,清空回收站,忽略特定文件、目錄和文件擴展名,殺死特定進程,刪除特定服務等。該勒索軟件可以使用CMSTPLUA COM接口進行權限升級,并通過將自己安裝為服務來實現持久性。另外,被挾持的文件是使用自定義的Salsa20算法實現進行加密的,其中Salsa20矩陣則是由硬編碼在二進制代碼中的RSA公鑰進行加密的。Darkside使用帶有I/O完成端口的多線程技術,在主線程和負責文件加密的工作線程之間進行通信。值得一提的是,該進程使用RDRAND和RDSEED指令生成隨機的Salsa20矩陣,而早期版本則使用RtlRandomEx函數完成該任務。
技術分析
SHA256: 0A0C225F0E5EE941A79F2B7701F1285E4975A2859EB4D025D96D9E366E81ABB9
該惡意軟件帶有一個加密的配置,并且它必須通過自定義算法進行解密。

其中,自定義解密算法由4次減去0x10101010的減法運算和一些加法運算組成,具體如下圖所示:

對于要加載的每個DLL,都用一個哈希函數計算DLL名稱的哈希值,并將長度為4字節的計算結果與硬編碼的值進行比較:

例如,下列值對應于kernel32.dll:

預計將加載以下DLL:ntdll、kernel32、Advapi32、user32、gdi32、ole32、oleaut32、shell32、shlwapi、WinInet、netapi32、wtsapi32、activeds、userenv、mpr、rstrtmgr。該進程根據使用相同算法計算得到的相近哈希值檢索多個導出函數的地址。

解密后的配置如下圖所示,它由RSA-1024指數(0x010001=65537)、0x80字節的RSA-1024模數、受害者UID、22個配置字節(將進一步詳述)和aPLib壓縮配置組成:

該二進制文件使用aPLib-解壓算法來解密不同的字符串。下圖展示的是在加密過程中要避免加密的目錄:

以下文件將被勒索軟件忽略:

如果文件的擴展名屬于以下列表,那么就不對該文件進行加密:

該二進制文件將會刪除名稱中包含“backup”一詞的文件夾:

利用該惡意軟件未使用的一個特性,能夠將以下字符串解壓為其他字符串(我們的猜測是,攻擊者試圖殺死與SQL相關的進程,以加密數據庫)。

以下進程將不會被該軟件終止:

如果一個進程名稱包含以下字符串,它將被殺死:

此外,還有一個要中止和刪除的服務列表,具體如下圖所示:

C2服務器的列表也是用同樣的算法得到的:

該進程將顯示一條消息,該消息將用于設置自定義壁紙,該壁紙包含針對受害者的重要指示:

贖金通知的內容也被寫入進程內存中,如圖所示:

下表描述了惡意軟件根據上面解密的配置所要采取的操作:

該惡意軟件使用NtQueryInstallUILanguage和NtQueryDefaultUILanguage API來確定系統的語言,并將結果與0x419(俄語標識符)進行比較。如果這兩個值匹配,則惡意軟件退出:

該惡意軟件還會調用RegCreateKeyExW函數,該函數用于創建(如果已經存在,則打開)“Software\Microsoft\Cryptography”注冊表項,如下所示:

之后,惡意軟件從上述注冊表項中提取“MachineGuid”值,如下圖所示:


該進程實現了一個自定義的哈希算法,生成8個小寫的十六進制字符,(“MachineGuid”值是輸入,該算法會應用8次):


上面計算出的值(我們稱它為RansomPseudoValue)將被用于以下結構:
?服務名稱:< RansomPseudoValue >
?服務顯示名稱:< RansomPseudoValue >
?贖金說明:README< RansomPseudoValue >.TXT
?壁紙:%PROGRAMDATA%\< RansomPseudoValue >.bmp
?每個加密文件將具有以下名稱:< Original filename >< RansomPseudoValue >
?圖標文件:%PROGRAMDATA%\< RansomPseudoValue >.ico
?已創建注冊表項:HKCR\< RansomPseudoValue >\DefaultIcon=%PROGRAMDATA%\< RansomPseudoValue >.ico
該二進制程序使用SHTestTokenMembership API來驗證用戶是否屬于Administrators組(0x220=544)。

我們將根據用戶的權限把分析過程分成3個不同的部分:低級權限、管理權限和SYSTEM權限。
低級權限
該惡意軟件試圖使用CMSTPLUA COM接口繞過UAC,詳見如https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512。實際上,它是利用ZwOpenProcessToken來打開與進程相關的訪問令牌的:

NtQueryInformationToken函數被用來獲取與令牌相關的組賬戶(0x2 = TokenGroups),它檢查在TOKEN_GROUPS結構體中是否能找到管理員組:

為了在當前線程上初始化COM庫,需要調用CoInitialize例程,如圖所示:

到目前為止,這個二進制文件使用了很多低級別的API(來自ntdll)。比如,它使用ZwAllocateVirtualMemory API(0x3000 = MEM_COMMIT | MEM_RESERVE,0x4 = PAGE_READWRITE)分配了一個新的內存區域:

同時,我們還發現它調用了一個未公開的API函數,即LdrEnumerateLoadedModules:

同時,它還通過名為Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}的對象運行了CoGetObject,具體如下所示:

總的來說,它將以系統權限重新啟動惡意軟件:


管理權限
與第一種情況一樣,該二進制代碼使用ZwOpenProcessToken來打開與進程相關的訪問令牌:

然后,利用NtQueryInformationToken API來檢索該令牌的用戶賬戶(0x1 = TokenUser):

然后,該惡意程序使用LookupAccountSidW來獲取與作為輸入的SID相關的賬戶名稱,如圖所示:

之后,進行3個不同的比較操作:將域名(在我們的例子中是計算機的名稱)分別與“NT AUTHORITY”、“AUTORITE NT”和“NT-AUTORITAT”進行比較(簡單來說,它試圖確定用戶賬戶是否為SYSTEM):

OpenSCManagerW例程用于建立與服務控制管理器的連接:

該進程嘗試打開一個名為< RansomPseudoValue >的服務(此時還不存在):

由于該服務不存在,惡意軟件會出于持久化目的而創建它,如下圖所示:


啟動新創建的服務,并且該二進制程序將自身作為服務啟動:

小結
在本文中,我們從技術角度為讀者深入分析了勒索軟件Darkside,由于篇幅過長,我們分為三篇文章進行發表,更多精彩內容,敬請期待!
參考及來源:https://cybergeeks.tech/a-step-by-step-analysis-of-a-new-version-of-darkside-ransomware/