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