作者:
360安全衛士
·
2016/04/01 20:15
0x00 前言
最近不少網友反映電腦中了敲詐者病毒(又名“Locky勒索軟體”),電腦中的文件,圖片等重要資料被病毒加密。此類病毒載體為js指令碼,由js指令碼下載遠端伺服器的pe檔案,並使此pe檔案在本地執行,從而完成對受害電腦資料的加密。
根據360安全中心監測,js敲詐者病毒主要透過網頁掛馬和釣魚郵件兩種途徑進行傳播,本文將對此類病毒的傳播方法及反查殺技巧進行分析。
0x01 網頁掛馬傳播
駭客會利用部分網站的漏洞,將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
0x02 郵件傳播
駭客透過社會工程學,利用人們的好奇心,精心構造一封釣魚郵件,將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安全中心會密切關注這類病毒的最新動向,第一時間為使用者提供有效的防護方案。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!