最近不少網友反映電腦中了敲詐者病毒(又名“Locky勒索軟件”),電腦中的文檔,圖片等重要資料被病毒加密。此類病毒載體為js腳本,由js腳本下載遠程服務器的pe文件,并使此pe文件在本地運行,從而完成對受害電腦數據的加密。
根據360安全中心監測,js敲詐者病毒主要通過網頁掛馬和釣魚郵件兩種途徑進行傳播,本文將對此類病毒的傳播方法及反查殺技巧進行分析。
黑客會利用部分網站的漏洞,將js敲詐者病毒植入到網頁中,當用戶訪問帶有惡意代碼的網頁時,電腦就會自動下載并執行此病毒。
圖 1:樣本1
如圖1所示的樣本,它利用十六進制對代碼進行簡單的加密,因此對它進行解密相對來說比較簡單,解密后的代碼如圖2所示:
圖 2:解密后的樣本1
通過分析解密后的代碼可以看出,它利用IE的ActiveX控件來獲取遠程的PE文件,執行過程包括下載文件,保存文件和運行文件三個步驟。它首先創建MSXML2.XMLHTTP對象來與遠程服務器進行通信,獲取服務器中的數據,然后使用創建的ADODB.Stream對象將獲取的數據保存到用戶的TEMP目錄下,最后利用創建的WScript.Shell對象直接運行此文件。
樣本1由于加密方式比較簡單,所以很容易被殺毒軟件查殺,為了進行反查殺,它的變種進行更加復雜的加密,如圖3所示的樣本就是目前比較流行的加密方式。
圖 3:樣本2
首先它為字符串定義一個daughters函數,通過此函數來完成對字符串的截取。
圖 4:字符截取操作
然后在代碼中插入一些無意義的變量進行混淆,如圖5所示的變量abeUtGplX、ojfdmCwgalh、yHoFUfYVm和GapGRiqoRoK就是起到混淆代碼的作用。
圖 5:代碼混淆
最后為了進一步達到免查殺目的,它將代碼中將要使用的關鍵字定義到了一個數組nUvahxKnc中,它或者將關鍵字與和一些無意義的字符進行組合,或者將一個關鍵字拆分成幾個不同的字符,在使用的時候再對字符進行拆分或者拼接操作。它還會在數組中插入一些無意義的字符進行代碼混淆,而在腳本執行中動態地修改數組的長度從而去除那些無意義的字符,具體代碼如圖6所示。
圖 6:使用數組進行代碼混淆
樣本最終的解密結果如圖7所示:
圖 7:解密后的樣本2
黑客通過社會工程學,利用人們的好奇心,精心構造一封釣魚郵件,將js敲詐者腳本放入到郵件附件中,當用戶雙擊運行js文件時便會中招,常見的郵件形式如下圖所示。
圖 8:釣魚郵件1
圖 9:釣魚郵件2
為了達到反查殺的目的,釣魚郵件1中的js文件首先用到了字符拆分和拼接的方法,這些方法由于前面已經提到,不再進行分析。
其次它將主要的惡意代碼放到一個if條件表達式中,通過調用Date.getMilliseconds和WScript.Sleep函數來獲取幾個不同的毫秒數,然后通過判斷這幾個變量值是否相等來決定是否執行if條件中的內容,如圖10。
圖 10:if表達式
釣魚郵件1中的樣本解密后如圖11所示。
圖 11:解密后的樣本
通過分析加密后的代碼,可以看出通過釣魚郵件方式傳播的js敲詐者和掛馬傳播方式不同的,它沒有利用ActiveX控件來進行運行,而是選擇使用WScript對象。由于windows操作系統中wscript.exe會為js腳本文件提供一個宿主環境,因此當郵件保持到本地后,雙擊js文件便會直接運行。
釣魚郵件2中的樣本是釣魚郵件1的變種,為了達到進一步的反查殺效果,它在如下幾個方面發生了變化。
首先它的if條件表達式發生了變化,它使用了[email protected]_on @*/
條件編譯,首先將Kcm賦值為false,然后在條件編譯中將Kcm的值賦值為true,如果殺毒軟件對此沒有特殊處理的話,就很難檢測到下面的內容,具體代碼見圖12。
圖 12:變化后的if條件表達式
其次在計算毫秒時,它使用的不再是Date.getMilliseconds函數,而換成了Date.getUTCMilliseconds函數來進行計算,具體見圖12。
釣魚郵件2的樣本解密后如圖13所示。
圖 13:解密后的樣本
還有一種類型的js樣本,樣本中經過加密的關鍵字需要使用特定的函數進行解密。如圖14,樣本中加密的值要調用adjurepe6函數才能進行解密,而它為了提高復雜性,在adjurepe6函數中需要再次調用btoa函數,只有經過這兩個函數的解密才能得到最終的結果。
圖 14:使用函數加密
js代碼使用escape函數進行加密而躲避查殺的情況也比較常見,此函數會同eval函數一起使用。使用時首先通過unescape函數對字符串進行解碼,然后通過eval函數將字符串轉化為js代碼。此種手法在以前的js敲詐者樣本中也經常碰到,但是以前是對整個js腳本進行加密,而現在它們只對部分代碼進行加密,而未加密的部分又要使用加密部分定義的函數和變量,如圖15和16所示。
圖 15:加密的代碼
圖 16:未加密的代碼
可以看到detectDuplicates、matchesSelector、fragment和string函數中所使用的addHandle在未加密代碼中是無法找到的,而加密代碼解密后,可以看到addHandle值為eval。代碼經過解密后,主要的代碼如圖17所示。
圖 17:解密后的腳本
通過上面的分析可以看到為了達到反查殺的目的,js敲詐者使用了各種代碼混淆和加密的方法,甚至使用了類似于[email protected]_on @*/
條件編譯的用法。由于這種病毒有經濟上的利益,因此它們的更新速度特別快,360安全中心會密切關注這類病毒的最新動向,第一時間為用戶提供有效的防護方案。