比特幣偷竊者Dyreza的核心代碼及技術分析
在本文中,我們將對兩個payload 進行分析研究,這兩個惡意程序之間是相互配合的,一個被稱為 Upatre(負責下載其他惡意程序),一個被稱為Dyreza(負責竊取用戶各類身份信息)。在過去一段時間里面,我們分析了Dyreza的核心代碼以及使用的技術,那接下來我們將逐步對其進行解析。
百科
Dyreza,其目的是竊取銀行賬號和比特幣。整個流程首先是通過Upatre進行Dyreza的下載,據(jù)研究,目前提供Dyreza下載的服務器均為路由器(大部分為AirOS和MicroTik)。而攻擊者利用入侵的路由器,存在多種加密的資源包,而受到感染的機器,會通過Upatre下載路由器中存放的加密惡意代碼程序,然后在用戶系統(tǒng)中進行解密后得到Dyreza木馬。
我們要對其進行分析的意義在于,惡意程序Dyreza家族目前存在有許多的變種,但是他們的主要行為軌跡還是存在共性的。我們通過分析其特性及共性,能更好地進行防御。
0×00 樣本分析
樣本:ff3d706015b7b142ee0a8f0ad7ea2911
Dyreza 的可執(zhí)行文件,一個僵尸網(wǎng)絡的客戶端,負責執(zhí)行主要的惡意操作。
樣本:
5a0e393031eb2accc914c1c832993d0b – Dyreza DLL (32bit)
91b62d1380b73baea53a50d02c88a5c6 – Dyreza DLL (64bit)
-----
0×01行為分析
當 Dyreza開始感染計算機的時候,它擁有較快的擴散感染速度。我們可以通過在進程管理中查看到它,同時最直觀的一點,可以發(fā)現(xiàn)許多新的進程被創(chuàng)建接著又結(jié)束,像explorer, svchost, taskeng等進程,而所進行的這一階段,就是為了混淆其執(zhí)行的流程,干擾安全人員的研究和分析。
接下來,它將兩個通過正則表達式 [a-zA-Z]{15}.exe , i.e vfHNLkMCYaxBGFy.exe以偽隨機碼命名的惡意程序復制文件放進C:\Windows以及%APPDATA%目錄下,然后通過在任務調(diào)度中添加一個新的任務,在每分鐘不斷地執(zhí)行惡意程序樣本,確保惡意程序持續(xù)執(zhí)行。
接著通過將惡意代碼注入到其他進程(如svchost, explorer),然后與外界的C&C服務器進行通訊。
從以上觀察到的結(jié)果,我們可以在 VirusTotal上查詢到,上述與svchost,和explorer進程進行通訊的服務地址,其實早已經(jīng)被進行標記為惡意地址了,主要的結(jié)果如下,
• 141.8.226.14 -> virustotal/141.8.226.14/information
• 83.241.176.230 -> virustotal/83.241.176.230/information
• 197.231.198.234 ->virustotal/197.231.198.234/information/
而當安裝任意web瀏覽器時,它也會直接將惡意代碼注入到瀏覽器的進程中去,然后進行非法外聯(lián)。這是該惡意程序與外部C&C服務器保持連接的方式,同時也執(zhí)行著監(jiān)控用戶活動以及竊取各類身份憑證信息的功能。
通過研究也可以發(fā)現(xiàn),Dyreza在將獲取到的信息發(fā)送給 C&C服務器之前,會將信息作為一個小型數(shù)據(jù)庫存放在名為 TEMP的文件夾中。#p#
0×02 代碼分析
環(huán)境檢測
1、執(zhí)行前的檢測-Dyreza如果檢測到機器上的 cpu數(shù)量少于2個,它將不會運行。該技術是為了進行自我保護,確保自身程序不是運行在虛擬機環(huán)境上。因為從目前的市場及設備配置的情況來看,除了虛擬機經(jīng)常使用單核cpu之外,一般物理機都是雙核以上的,而Dyreza也是基于這一點作為判斷依據(jù)的。Dyreza是通過檢測進程環(huán)境塊下的線程信息塊中的FS:[0x30]區(qū)域的信息來進行判斷。而只有確認cpu數(shù)量滿足大于2個(包括2個)之后,惡意程序才會繼續(xù)執(zhí)行。
2、在執(zhí)行開始的時候,惡意軟件加載額外的表單到一個新分配的內(nèi)存頁。在運行的過程中,模塊名和函數(shù)開始被解密。
3、執(zhí)行環(huán)境的檢測-通過LookupPrivilegeValue函數(shù)中的SeDebugPrivilege 參數(shù),來判斷是否在調(diào)試器下進行安裝,如果檢測到返回值為非零值,惡意程序的執(zhí)行將終止。
4、進行有效執(zhí)行通過如下幾個檢測方式。一開始,根據(jù)初始的環(huán)境,通過對路徑進行跟蹤檢測,如當程序運行時可執(zhí)行的路徑和參數(shù)。當它第一次安裝時,它將會對自身進行復制,并將復制的文件放至 C:\Windows以及%APPDATA% 目錄下,并將復制的程序作為一個新的進程執(zhí)行安裝。如果它被部署到有效路徑和初始參數(shù)并通過了驗證,則執(zhí)行下一步檢查-確認是否是第一次安裝。該步驟是通過創(chuàng)建一個特定的全局互斥量(名稱為計算機名和系統(tǒng)版本的哈希值,通過 GetComputerName, RtlGetVersion兩個函數(shù)獲取)來實現(xiàn)的。
5、如果這個條件滿足,而互斥量也已經(jīng)存在,那么它接下來將進行最重要的一步,執(zhí)行惡意代碼。一開始,會將加密的數(shù)據(jù)和密鑰從可執(zhí)行的資源包中加載。
如上圖,T1RY615NR-加密的32位代碼,YS45H26GT -加密的64位代碼,UZGN53WMY-密鑰
接下來是解包,將代碼取出:
解包的算法也很簡單,key_data中包含了數(shù)值和數(shù)據(jù)-在key_data中數(shù)值的索引列表。我們通過相應的索引列表來讀取相應的數(shù)值。相應的代碼如下,
def decode(data, key_data): decoded = bytearray() for i in range(0, len(data)): val_index = data[i] decoded.append(key_data[val_index]) return decoded
解密執(zhí)行部分代碼如下,
import argparse import hashlib from Crypto.Cipher import AES BS = 16 pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) unpad = lambda s : s[:-ord(s[len(s)-1:])] def aes_decrypt(enc, iv, key): cipher = AES.new(key, AES.MODE_CBC, iv ) return unpad(cipher.decrypt(enc))
詳細執(zhí)行代碼,可參考 dyrezadll_decoder.py
解密出來的文件包括了一個用于注入的shellcode和一個用于調(diào)用惡意程序函數(shù)的DLL(兼容32/64位)。
0×03 核心惡意 DLL
在這個階段,惡意軟件的功能變得非常清晰。dll文件不包含太多混淆信息–它具有明顯的字符串和一個典型的導入表。
我們可以看到被用于與 C&C服務器進行通訊的字符串。
32和64位的DLL都具有相似的功能。兩者之前只有架構(gòu)相關部分和字符串是不同的。而通過客戶端可以對系統(tǒng)進行識別,然后將信息發(fā)送到 C&C服務器上。
類似的程序在64位版本的DLL,只有在其硬編碼字符串上用“_64bit”代替了“_32bit”:
同時,對網(wǎng)絡設置進行檢查(確認并告知與C&C客戶端是否可以建立后連接–命令:autobackconn)
將惡意模塊注入到瀏覽器中執(zhí)行代碼:
接下來,嘗試發(fā)送竊取的賬戶信息。
此外除了監(jiān)測瀏覽器外,它也收集計算機上相應的基本信息(比如配置,存在用戶等)
該惡意軟件不僅竊取信息和嗅探用戶的瀏覽活動,并且還試圖對系統(tǒng)進行完全控制,目的是執(zhí)行各種shell命令,如進行系統(tǒng)關機等,部分例子如下:
嘗試創(chuàng)建具備管理員權限的新用戶:
可通過命令AUTOKILLOS來進行關機操作。
0×04 C&Cs
該僵尸網(wǎng)絡為了防止被檢測到,服務器與客戶端之間的通信是采用加密的方式,并采取了許多策略。
首先,C&C服務器的地址是隨機從硬編碼池里面挑選的。該地址池是存儲在Dyreza DLL(通過AES加密算法進行加密的)的資源包中。接下來,在執(zhí)行payload的時候,我們可以看到它是如何進行解密的。
以上,是本次的分析研究探討,具體的Dyreza代碼,可以在dyreza中獲取。