怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

零日情報局發表於2019-11-25

大家好,我是零日情報局。

本文首發於公眾號零日情報局,微信ID:lingriqingbaoju


我原本認為,在聽音樂這件事上,最不需要的就是提心吊膽了。


直到又一例隱藏惡意程式碼的WAV音訊檔案曝光,隱寫術的魔爪終於從PNG和JPG伸向WAV檔案。


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


10月17日,BlackBerry Cylance威脅研究人員最新發現:WAV音訊檔案中嵌入模糊惡意程式碼。


播放時,你聽到的WAV檔案發出的音樂沒有明顯的毛刺或質量問題,甚至還有點動聽。


背地裡,音訊載入程式解碼並執行音訊資料中的惡意程式碼,目標很清晰,就是挖礦。


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


無獨有偶,俄羅斯Turla也用過這一招。

今年6月,俄羅斯網路間諜組織Turla就創意性地將惡意程式碼隱藏在WAV音訊檔案中並傳輸至攻擊目標,這也是全球首個用WAV檔案傳播惡意程式碼的攻擊活動。


有點不同的是,人家Turla組織不挖礦,而是用WAV音訊檔案發起的國家級攻擊活動,直接指向網路間諜入侵。


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


Turla組織顛覆了以往文字、圖片、連結等形式的侷限,拉開了用WAV音訊檔案傳播惡意程式碼的大幕。


繼Turla組織的間諜行動後,其他駭客也效仿了起來。


BlackBerry Cylance所發現的是全球首例用WAV音訊隱寫術加密挖礦的網路攻擊。受感染主機在下載並使用特定WAV載入程式載入WAV檔案後,會繞開電腦防毒軟體與防火牆,安裝XMRrig加密貨幣礦工應用程式,變身“挖礦機”。


BlackBerry Cylance研究與情報副總裁還補充說,現在Windows桌面和伺服器上都發現這種隱寫惡意程式碼的WAV檔案。簡言之,個人及企業使用者已暴露在了隱寫術加持下的惡意攻擊威脅中。


什麼是隱寫術?


安全員都知道,隱寫術就是指將資訊隱藏在另一種資料介質中的技術。例如,將純文字隱藏在影像中,又例如將惡意程式碼隱藏在音訊中。 


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


這挺雞賊的,因為透過這種手段,暗藏惡意程式碼的檔案就可以躲開安全軟體的查殺攔截,甚至“洗白”享受白名單待遇,長久潛伏而不被發現。


隱寫術在惡意程式開發中已經流行了十多年,最近開始,隱寫術開始從PNG、JPG圖片蔓延至WAV音訊檔案。


我們以Blackberry Cylance披露的報告威力進行分析,這類WAV檔案載入器可以分為以下三類:


採用最低有效位(LSB)隱寫術的載入程式解碼並執行PE檔案。


載入程式採用基於rand()的解碼演算法來解碼和執行PE檔案。


載入程式採用基於rand()的解碼演算法來解碼和執行shellcode。


第一類:隱寫術PE載入器


第一類載入程式採用隱寫術從WAV檔案中提取可執行內容。隱寫術是一種在另一個檔案中隱藏檔案或訊息的做法,一般情況下不會引起對目標檔案的懷疑。攻擊者大量使用隱寫技術來隱藏資料。


實際上,BlackBerry Cylance於4月釋出了一份報告,該報告描述了海蓮花組織如何利用隱寫術來隱藏影像檔案中的惡意後門。


本文分析的樣本使用了最低有效位隱寫術(LSB)將惡意程式碼隱藏在音訊檔案中,其中單個位元組的最右位包含惡意程式碼。


樣本資訊如下:


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

技術細節:


這個載入器讀取wav檔案頭的最後四個位元組,這四個位元組表示wav檔案中儲存資料的大小,在這個惡意的wav檔案裡,這個大小是15,179,552 位元組。


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:WAV檔案頭-資料大小


在下面的程式碼片段中,載入程式讀取這四個位元組,並依此分配記憶體空間。然後,它讀取資料並關閉WAV檔案。最後,do-while迴圈遍歷前64個位元組。按照下圖所示的演算法進行解碼。


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:解碼檔案大小


顯而易見,迴圈是在計數器<32且計數器每次迭代遞增1時執行的。另外,data_offset表示編碼資料內的偏移量,其值每次迭代從零開始遞增2。此迴圈將覆蓋資料的前64個位元組(32* 2):


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:WAV檔案資料-64位元組


對於每個已處理的位元組,載入程式將提取LSB並將其分配給decoded_size中的相應位位置,從31(即最左邊的位)開始,並在每次迭代時遞減1,並將此演算法應用於資料的前64個位元組。


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


接下來,分配大小為decoded_size的儲存器,並且執行各種計算。修改了預設標籤名稱,以指示所有計算的結果。這些數字將在即將到來的解碼迴圈中用作已編碼資料的偏移量:


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:分配記憶體並計算偏移量


按照上面的程式碼,do-while迴圈開始解碼其餘的編碼資料:


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:解碼檔案內容


與前一個解碼迴圈類似,此迴圈提取每個其他位元組的LSB。但是,區別就在於它起始於最低位(最右一位)。每次迭代都從8個位元組中提取LSB,以形成8位(1個位元組)的解碼資料。


如果應用此演算法生成兩個位元組的解碼資料,就需要32個編碼位元組。因為8位組成一個解碼位元組,並且每兩個編碼位元組提取一個LSB,所以生成兩個解碼位元組就需要32個編碼位元組(2個解碼位元組*每個解碼位元組8個LSB * 2 = 32):


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:32個位元組的編碼資料


解碼資料的第一個位元組將產生如下(不包括跳過的編碼位元組):


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


解碼資料的第二個位元組產生如下(同樣,不包括跳過的編碼位元組):


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


結果,前兩個位元組分別具有二進位制值01001101和01011010,兩個位元組的十六進位制表示為0x4D5A,指的是PE檔案開頭眾所周知的“ MZ”。


do-while迴圈將繼續進行迭代,直到在記憶體中生成XMRigDLL。最後,將解碼後的DLL對映到記憶體中,並執行“start”匯出函式,開始挖礦。


第二類 基於Rand()的PE載入程式


第二類載入器使用基於rand()的解碼演算法來隱藏PE檔案。


樣本資訊如下:


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


技術細節:
執行後,此載入程式將讀取WAV檔案頭,提取資料大小,相應地分配記憶體,並將WAV資料儲存在新分配的記憶體中。接下來,載入器解碼WAV檔案的資料內容:


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:基於Rand()的PE載入器解碼迴圈


注意,size_of_data表示從WAV頭中提取的資料大小,wave_data包含編碼的WAV資料的地址。載入程式呼叫srand函式和rand函式,從WAV資料中提取PE檔案。


為什麼選擇這兩個函式呢?因為當srand函式接收一個固定的值作為種子的時候,每次呼叫rand函式就會生成一個固定的偽隨機數。


此時,do-while迴圈遍歷編碼資料的每個位元組,用從編碼位元組中減去rand()生成的偽隨機數替換該位元組。例如,讓我們解碼此處顯示的資料的前兩個位元組:

怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


使用本節分析的載入器和WAV檔案,下表顯示srand()種子值為0x309的前兩次迭代的值:


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了


前兩個位元組代表通常在PE檔案開頭出現的“ MZ”。迴圈遍歷所有資料位元組後,就解碼出XMRig Monero CPU64位挖礦DLL。生成的DLL與Song.wav解碼的DLL僅相差四個位元組:   


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:解碼後的click.wav與Song.wav


雖然不清楚這些位元組為何不同,但是它們對DLL的功能沒有影響,因此這兩個XMRig DLL檔案實際上是相同的。


接下來,載入器獲取在命令列中指定的匯出函式地址。如果存在,則載入器將啟動一個執行緒來執行它:


怎麼回事?聽個WAV音樂怎麼就成“挖礦機”了

圖:確定匯出和啟動執行緒的地址以執行它



第三類:基於Rand()的Shellcode載入器


此方式和上述的方式及原理完全相同,不同點僅僅是前者載入的PE檔案而後者載入的Shellcode


零日反思


網路威脅的演進,從來都是多維立體的。


隱寫術從文字、圖片擴散至音訊,就是最直觀的例子。


而隱寫術+惡意程式碼+音訊多種形式融合的網路威脅手段,也不斷提醒著我們,網路空間威脅會越來越複雜,單純的攻防策略已難以有效守護網路空間的一片安寧。

相關文章