以Predator為例,全面揭祕資訊竊取軟體的技術細節
一、概述
我們主要針對一個竊取使用者資訊的惡意軟體Predator the thief進行深入分析,該軟體使用C/C++語言編寫。與當今主流的惡意軟體一樣,該惡意軟體可以作為構建器(Builder),也可以通過C&C渠道下載額外的惡意軟體。
我們對這一惡意軟體進行了詳細分析,並對其中的一些重點功能模組進行了詳細拆解和分析。本文適合初級逆向工程師或惡意軟體分析人員閱讀,希望通過我們的分析,能讓大家輕鬆瞭解惡意軟體所使用的某些技術或技巧,並掌握應對方法。
二、資訊竊取軟體的典型生命週期
對於如今的大多數資訊竊取軟體來說,其執行順序幾乎相同,但逃避檢測技術則根據所使用的C&C通訊方式而有所不同。舉例來說,在Predator中,設定過程非常簡單,但如果攻擊者在其C&C上部署了載入程式(Loader),就會有所不同了。
Predator the thief的生命週期:
三、準備階段
在竊取敏感資料之前,Predator首先需要進行一些基本的設定才能正常工作。所有的配置,都是逐步載入到記憶體之中的。
我們將斷點設定在0x00472866的位置,並檢查程式碼:
1、EBX設定為迴圈的長度(在我們所分析的樣本中,長度為0x0F);
2、ESI儲存所有函式地址;
3、EAX將從ESI獲取一個地址,並將其移動到EBP-8;
4、呼叫EBP(在這時,配置函式將解壓縮一些資料,並將其儲存到棧中);
5、ESI的位置現在提前4位;
6、EDI遞增,直至該值與EBX值相等;
7、當EDI == EBX時,也就表示所有必須的配置值都已經儲存到棧中。此時,惡意軟體的主要部分便可以啟動。
舉例來說,我們看看00488278位置的0040101D中的內容。
通過x32dbg,使用簡單的命令就可以進行檢視。
go 0x0040101D
如我們所見,這是C&C儲存的位置,該內容已經儲存到了棧中。
惡意軟體使用這種方式,儲存如下內容:
·C&C域名
· %APPDATA%資料夾
· Predator資料夾
· Predator壓縮檔案的臨時名稱和位置
· 傳送給C&C伺服器的壓縮檔名稱
· 等等…
惡意軟體在%APPDATA%/Roaming路徑下建立Predator資料夾(\ptst)。值得注意的是,其名稱是通過XOR操作後的硬編碼字串儲存的,而並非隨機生成。我們猜測,這有可能是“Predator The Stealer”的快捷方式。
資訊竊取過程中,臨時存檔的檔名為“zpar.zip”。
四、反逆向機制
當我們終於來到惡意軟體的主要模組時,發現定址獲得的結果是一個迴圈0x06400000次的文字。這應該是惡意軟體設計的反逆向工程機制。
五、混淆技術
5.1 大規模使用的XOR操作
在分析中我們發現,該樣本中幾乎所有字串都經過了XOR操作。但是,這種混淆技術很容易發現,並且是最易於解密的一種方式。在這裡,XOR操作的目的只是為了減慢惡意軟體分析的速度。
5.2 使用GetProcAddress的替代方案
為了避免直接呼叫來自不同庫的模組,惡意軟體使用一些傳統的機制,逐一搜索特定的API請求,並將其儲存到暫存器中。此外,它還允許將對模組的直接呼叫隱藏到簡單的暫存器呼叫中。
首先,解密XOR運算後的字串(一個DLL)。針對這種情況,惡意軟體要呼叫的特定模組需要用到kernel32.dll。
解密完成後,該庫使用LoadLibraryA進行載入。隨後,明文內容“CreateDirectoryA”被PUSH到EDX中,這是惡意軟體需要使用到的模組。
現在,惡意軟體需要從kernel32.dll中檢索並匯出函式CreateDirectoryA的地址。通常,需要通過GetProcAddress來實現。但由於GetProcAddress是眾多安全防護機制重點關注的目標,該惡意軟體換用了另一種方式來獲取該值。
該字串和kernel32.dll的IMAGE_DOS_HEADER都將一起被髮送到func_GetProcesAddress_0。我們可以在匯出表(Export Table)的幫助下,手動獲取到想要的函式地址的指標。我們接下來仔細檢視其中的程式碼。
struct IMAGE_EXPORT_DIRECTORY { long Characteristics; long TimeDateStamp; short MajorVersion; short MinorVersion; long Name; long Base; long NumberOfFunctions; long NumberOfNames; long *AddressOfFunctions;<= This good boy long *AddressOfNames;<= This good boy long *AddressOfNameOrdinals; <= This good boy }
結構IMAGE_EXPORT_DIRECTORY中,必須要包含三個欄位:
· AddressOfFunctions:包含模組中函式相對值地址(RVA)的陣列;
· AddressOfNames:包含模組中所有函式的陣列,以升序排列;
· AddressOfNamesOrdinals:一個16位陣列,其中包含AddressOfNames所有相關的函式名稱。
原始碼: Windows_Executable_Files" target="_blank" rel="nofollow,noindex">https://en.wikibooks.org/wiki/X86_Disassembly/Windows_Executable_Files
在儲存了這三個陣列的絕對位置後,迴圈過程非常簡單。
1、抓取一個函式的相對值地址(RVA);
2、獲取該函式的名稱;
3、將字串與所需字串進行比較。
在這裡,詳細分析一下其實現方式:
如果我們對ds:[eax+edx*4]進行仔細檢視,發現其中儲存了kernel32.dll匯出表函式的所有相對值地址。
下一條指令是eax,ecx,用於計算AddressOfNames陣列中字串值的準確位置。
DLLBaseAddress + AddressOfNameRVA[i] = Function Name 751F0000+0C41D4= CreateDirectoryA
經過比較後,發現二者匹配,所以對procAddress進行儲存。首先,儲存函式的序號(Ordinal Number),然後藉助該值,獲取函式地址位置,並儲存到ESI中。
ADDESI, ECX ProcAddress = Function Address + DLLBaseAddress
經過反彙編後,大致如下:
procAddress的程式碼如下:
至此,一切妥當,函式的地址已經儲存到EAX中,只需要等待呼叫即可。
六、反虛擬機器技術
在這裡,使用了一個簡單的反虛擬機器技術,來防止惡意軟體在虛擬機器上執行。這也是Predator所使用的唯一的反分析技術。
首先,通過LoadLibraryA,動態載入User32.dll(經過XOR處理),然後使用User32.dll請求EnumDisplayDevicesA模組。在這裡,惡意軟體希望獲取當前使用顯示器的“裝置描述”值。
完成後,將該結果與一些特定值進行比對(同樣經過了XOR處理):
Hyper-V VMware VirtualBox
如果字串匹配,那麼就會重定向到名為func_VmDetectedGoodBye的函式。
如何繞過這種反虛擬機器技術?
為了繞過惡意軟體的這種檢測技術,我們將DriverDesc的REG_SZ值修改為{4d36e968-e325-11ce-bfc1-08002be10318}。
然後,便成功繞過了這一檢測。
七、資訊竊取部分
接下來,我們分析這一惡意軟體的主要目的,也就是它如何完成資訊竊取的。目前,我對大部分程式碼進行了反彙編,得到了惡意軟體在ptst儲存庫上設定的所有資料夾,並將其壓縮後傳送到C&C伺服器。
資料夾
· Files:儲存特定路徑中所有文字或文件檔案。
· WinFTP:從FTP中獲取1個檔案。
· Cookies:儲存來自不同瀏覽器的Cookie內容。
· General:通用資料。
· Steam:竊取賬戶登入資訊。
· Discord:竊取賬戶登入資訊。
檔案
· Information.log
· Screenshot.jpeg:當前螢幕截圖。
7.1 竊取Telegram資料
惡意軟體通過檢查計算機上是否存在KeyPath“Software\Microsoft\Windows\CurrentVersion\Uninstall\{53F49750-6209-4FBF-9CA8-7A333C87D1ED}_is1”的方法,來驗證計算機是否安裝了Telegram。
那麼,這個KeyPath中的內容是什麼呢?在深入分析程式碼後,我們發現惡意軟體會獲取InstallLocation的值,這是主機上Telegram的安裝位置。
重新建立路徑(在這裡,所有字串也都被異或)
%TELEGRAM_PATH% \Telegram Desktop \tdata \D877F783D5D3EF8C
資料夾D877F783D5D3EF8C是儲存所有Telegram快取的位置,這也是惡意軟體想要獲取的敏感資料。此外,在此過程中,還會檢查map*檔案(例如map1),該檔案實際上是加密金鑰。所以,攻擊者如果獲取到這一資料夾中的內容,就能夠訪問目標使用者的應用軟體資料。
7.2 竊取Steam資料
該惡意軟體用於竊取某個特定軟體中資料的技術,在大多數情況下都是類似的。這樣一來,就能極大的幫助我們理解這一惡意軟體。
首先,惡意軟體檢查HKCU\Software\Valve\Steam中的SteamPath鍵值,獲取正確的Steam儲存位置。在獲取該位置之後,才能進一步找到儲存Steam賬戶資訊的相關檔案。
通過func_FindFiles,檢查計算機上是否存在ssfn檔案。如果存在,會將其複製到位於%APPDATA%/XXXX的惡意軟體臨時資料夾中。同樣,針對config.vdf也進行相同的操作。
那麼,這些檔案有什麼意義呢?經過搜尋,我們發現了Reddit上的一篇文章,主要介紹了ssfn檔案允許在使用者登入期間繞過SteamGuard防護機制。
那麼,第二個檔案的作用呢?在這裡,可以找到關於使用者賬戶,以及計算機上安裝的所有應用程式的相關資訊。此外,如果找到了有效的ConnectCache欄位,就可以在不經Steam身份驗證的情況下登入賬戶。其內容類似如下:
"ConnectCache" { "STEAM_USERNAME_IN_CRC32_FORMAT" "SOME_HEX_STUFF" }
攻擊者想要竊取的最後一個檔案是loginusers.vdf。該檔案有多種用途,但最主要的是用於手動對離線狀態的賬戶進行設定。
有關Steam資訊竊取的更多詳情,Kapersky曾經發布過一次非常 完整的分析 。
7.3 竊取加密貨幣錢包
該惡意軟體支援竊取多個數字錢包,包括:Ethereum、Multibit、Electrum、Armory、Bytecoin、Bitcoin等。
與之前一樣,相關的檔案都經過了XOR操作。
7.4 竊取FTP軟體資料
該惡意軟體支援對兩個FTP軟體的資訊竊取,包括FileZilla和WinFTP。
這部分模組非常簡單,只會對以下3個檔案進行搜尋,如果找到,會將其複製,以實現竊取過程:
%APPDATA%\Filezilla\sitemanager.xml %APPDATA%\Filezilla\recentservers.xml %PROGRAMFILES%\WinFtp Client\Favorites.dat
7.5 竊取瀏覽器資料
在本文,將不對惡意軟體竊取瀏覽器資料的過程做過多解釋,因為目前已經有很多文章都詳細解釋了此型別惡意軟體是如何獲取Web資料的。建議大家閱讀 @coldshell撰寫的文章 。
Predator的主要目標是如今流行的Chrome、Firefox和Opera瀏覽器。該惡意軟體支援對眾多瀏覽器進行資訊竊取,包括:Amigo、BlackHawk、Chromium、Comodo Dragon、Cyberfox、Epic Privacy Browser、Google Chrome、IceCat、K-Meleon、Kometa、Maxthon5、Mozilla Firefox、Nichrome、Opera、Orbitum、Pale Moon、Sputnik、Torch、Vivaldi、Waterfox。
惡意軟體使用SQLite,從瀏覽器中提取資料,並將其儲存到名為vlmi{lulz}yg.col的臨時檔案中。
該過程非常簡單:
1、竊取SQL瀏覽器檔案;
2、通過SQLite,將提取到的資料儲存到臨時檔案中;
3、讀取檔案,並將其中的內容儲存到特定名稱的文字檔案中(針對每種瀏覽器建立一個檔案)。
如果找到表單資料或身份認證憑據,則會將這部分內容儲存到通用儲存庫的相應檔案(forms.log、password.log、cards.log)中。
7.6 竊取Discord資料
如果檢測到計算機上安裝了Discord,惡意軟體將搜尋https_discordapp_*localstorage,並將其複製到ptst資料夾中。該檔案包含所有關於賬戶的敏感資訊,如果將該檔案複製到攻擊者計算機的正確目錄中,那麼攻擊者可以無需身份驗證直接進行登入
Predator會對多個位置進行檢查。主要將竊取3個資料夾(Desktop、Downloads、Documents)中的資料。每次,其執行的任務都是相同的,會通過GetFileAttributesA搜尋4種類型的檔案:*.doc、*.docx、*.txt、*.log。
如果找到,就會將其複製到名為Files的資料夾內。
7.7 產生Information.log
在上述任務完成後,惡意軟體將生成摘要檔案,該檔案包含被感染計算機的特定和敏感資料。其中,DFIR檔案適用於標識惡意軟體名稱的元件,其中包含惡意軟體的名稱和版本資訊。
首先,向該檔案中寫入被感染計算機的使用者名稱稱、計算機名稱和作業系統版本:
User name: lolilol Machine name: Computer OS version: Windoge 10
隨後,通過GetClipBoardData複製剪貼簿中的內容:
Current clipboard: -------------- Omelette du fromage
儲存啟動目錄下的內容:
Startup folder: C:\Users\lolilol\AppData\Local\Temp\predator.exe
將計算機的一些硬體資訊儲存到檔案中:
CPU info: Some bad CPU | Amount of kernels: 128 (Current CPU usage: 46.112917%) GPU info: Fumik0_ graphical display Amount of RAM: 12 GB (Current RAM usage: 240 MB) Screen resolution: 1900x1005
列出計算機上所有賬戶:
Computer users: lolilol Administrator All Users Default Default User Public
接下來的一部分內容,是一些看上去非常奇怪的外部資訊,我們沒有對這部分資訊進行深入猜測。這部分內容是在Payload中進行了硬編碼。
最後一部分奇怪的資訊,是在被感染主機執行資訊竊取操作的事件,這個資訊可能用於惡意軟體開發者除錯功能。
Additional information: Compile time: Aug 31 2018 Grabbing time: 0.359375 second(s)
八、C&C通訊
為了記錄Information.log,將會使用GET請求,獲取一些被感染使用者的網路資料。
首先,在請求中設定如下內容:
User-agent Content-type
API URL ( /api/info.get )
最終得到結果如下所示:
Amsterdam;Netherlands;52.3702;4.89517;51.15.43.205;Europe/Amsterdam;1012;
當請求完成後,惡意軟體使用迴圈和判斷語句,合併所獲得的資料。
任務完成後,將儲存到Information.log中。
City: Nopeland Country:NopeCountry Coordinates: XX.XXXX N, X.XXXX W IP: XXX.XXX.XXX.XXX Timezone: Nowhere Zip code: XXXXX
壓縮包並不完整,它的作用只是將資訊傳送到C&C伺服器。
現在,惡意軟體會將一些資訊,附加到gate.get請求的引數中,分別從p1到p7,例如:
·p1:竊取賬戶的數量
· p2:竊取Cookie的數量
· p4:竊取表單的數量
· ……
結果如下:
在POST請求發出後,惡意軟體會將所有內容清空,隨後退出。
Predator C&C伺服器Web介面的背景比較花哨:
九、版本更新:V2.3.7
在我們分析的過程中,這一惡意軟體又推出了新的版本,接下來,我們將對新版本的變化進行分析。
針對新的版本,如果從頭進行研究,無疑價效比是比較低的。因此,我們找到了惡意軟體編寫者釋出的修改日誌,只關注這些惡意軟體編寫者指出的變化部分。
惡意軟體進行版本升級,通常會在兩個方面進行改動。一是程式碼優化,以使惡意軟體執行速度更快,或者使其更為輕量化。二是增加功能,使惡意軟體具有更強大的能力。
正如我們所看到的,右側V2.3.7程式碼比左側V2.3.5要長很多,但其主幹部分都是相同的。
9.1 互斥體
在2.3.7版本中,增加了一個互斥體(Mutex),該互斥體與一個名為SyystemServs的特定字串整合在一起。
9.2 XOR與混淆
在C&C請求期間,URL引數是逐位元組生成的,並且經過了XOR操作。
例如:
push 04 ... push 61 ... push 70 ...
最後結果為:
HEX: 046170692F676174652E6765743F70313D STRING : .api/gate.get?p1=
這是一個非常基礎和簡單的功能,但足以減慢我們的安全研究進度。這一部分調整就是新版本程式碼變長的主要原因。
9.3 載入工具
在此前分析中,我們沒有見到這一載入工具(Loader)。在新版本中,集成了一個載入工具,用於向被感染主機推送其他的Payload。該內容可以通過GET請求輕鬆識別:
/api/download.get
該API請求允許惡意軟體將URL轉化為文字格式,然後下載,並將其儲存到磁碟。隨後使用ShellExecuteA來執行下載的Payload。
此外,還有一些其他調整,但我們認為沒有必要對這些變化進行詳細說明。如果大家好奇,可以自行探索發現。
十、IoC
10.1 V2.3.5
· 299f83d5a35f17aa97d40db667a52dcc | 加殼樣本
· 3cb386716d7b90b4dca1610afbd5b146 | 脫殼後樣本
· kent-adam.myjino.ru | C&C域名
10.2 V2.3.7
· cbcc48fe0fa0fd30cb4c088fae582118 | 脫殼後樣本
· denbaliberdin.myjino.ru | C&C域名
10.3 HTTP模式
· GET – /api/info.get
· POST – /api//gate.get?p1=X&p2=X&p3=X&p4=X&p5=X&p6=X&p7=X
· GET – /api/download.get
10.4 MITRE ATT&CK
V2.3.5
Discovery – Peripheral Device Discovery Discovery – System Information Discovery Discovery – System Time Discovery Discovery – Query Registry Credential Access – Credentials in Files Exfiltration – Data Compressed
V2.3.7
Discovery – Peripheral Device Discovery Discovery – System Information Discovery Discovery – System Time Discovery Discovery – Query Registry Credential Access – Credentials in Files Exfiltration – Data Compressed Execution –Execution through API
10.5 惡意軟體作者
· Alexuiop1337
10.6 Yara規則
rule Predator_The_Thief : Predator_The_Thief { meta: description = "Yara rule for Predator The Thief v2.3.5 & +" author = "Fumik0_" date = "2018/10/12" strings: $mz = { 4D 5A } $hex1 = { BF 00 00 40 06 } $hex2 = { C6 04 31 6B } $hex3 = { C6 04 31 63 } $hex4 = { C6 04 31 75 } $hex5 = { C6 04 31 66 } $s1 = "sqlite_" ascii wide condition: $mz at 0 and all of ($hex*) and all of ($s*) }
十一、安全建議
1、避免將檔案儲存在預設位置(例如:Desktop、Documents、Downloads),建議放在自定義的目錄下。
2、避免執行破解版本或其他非官方版本的遊戲,這些非官方版本的遊戲往往不能及時更新,特別是Fortnite的遊戲。
3、在執行軟體的過程中使用容器,從而降低竊取資料的風險。
4、在每次訪問後重新整理一次瀏覽器,並且不要將密碼直接儲存在瀏覽器中,不要使用自動填充功能。
5、不要在所有網站都使用相同的密碼,儘可能選用雙因素認證(2FA)。
6、針對一些重要資料,在計算機中準備一些迷惑性的檔案,這樣攻擊者即使成功竊取,也會受到誤導。
7、使用Vault等密碼管理軟體。
十二、總結
這一資訊洩露軟體並不複雜,但它們卻足以對被感染使用者產生不可逆轉的影響。其中,電子郵件賬戶和其他軟體/平臺賬戶是攻擊者重點關注的內容。由此提醒廣大使用者,應該具有良好的安全意識,並在使用計算機的過程中注重安全性。防護惡意軟體,並不是依靠一個簡單的安全產品就能實現的,還需要從方方面面多加註意。