AnglerEK的Flash樣本解密方法初探

wyzsk發表於2020-08-19

360安全衛士 · 2016/06/17 15:59

作者:360QEX團隊

0x00 前言


在病毒查殺過程中,一直存在著攻與防的技術對立,惡意程式會採用各種方法躲避防毒引擎的檢測,增加分析難度。360QEX團隊之前分別對JS敲詐者和巨集病毒的隱藏與反混淆分享過相關內容,這次則分享一些AnglerEK的Flash樣本解密方法。

Angler EK攻擊包是當前最為著名的一個攻擊包,從出現至今,已經被大量用於網頁掛馬。由於Angler EK能夠整合最新被修復的漏洞利用程式碼,甚至偶爾會出現0day的利用程式碼,因而被視為最先進的漏洞攻擊包。

近兩年來,Angler EK大量使用Flash作為漏洞利用載體,往往Adobe剛剛曝光一個漏洞,就立即出現在了Angler EK攻擊包中。為了躲避防毒軟體的檢測,Angler EK採用了多種方法加密Flash攻擊程式碼,增加了檢測難度和安全人員的分析難度。

0x01 字串與函式名的混淆


在ActionScript3中程式碼呼叫的相關函式名稱和類名,均以字串形式儲存在doabc欄位中,所以為了規避針對呼叫函式名和類名的檢測,AnglerEK採用了getDefinitionByName函式,根據傳入的字串引數轉換為呼叫對應的函式或者類,然後在將這些字串進行切分,躲避過了簡單的特徵字串檢測,這也是很多其他EK攻擊包所常用的方法。

這種方法進一步進行混淆的話,就可以將這些字串採用拼接、正則替換的手法,例如樣本c288ccd842e28d3845813703b9db96a4中,使用瞭如下的方法,基本可以完美的躲避字串特徵檢測。

圖1 字串拆分

此外,ActionScript和JavaScript同樣基於ECMAScript,因此很多JavaScript的混淆方法同樣適用於ActionScript,例如下標運算子同樣能夠用於訪問物件的成員,這時可以參照JavaScript常見混淆方法來進行程式碼還原。

在樣本eeb243bb918464dedc29a6a36a25a638中,摘錄了部分採用下標運算來訪問物件成員的程式碼,如下所示:

程式碼1 下標運算子執行類成員

#!javascript
vree = getDefinitionByName("flash.utils.ByteArray") as Class;
weruji = "length";
var _loc2_:* = new vree();
wxwrtu = "writeByte";
while(_loc7_ < _loc4_[weruji])
{
    _loc2[wxwrtu](_loc4_[_loc7_]);
    _loc7_++;
}
複製程式碼

以上這段程式碼等價於如下程式碼段:

程式碼2 還原後的程式碼

#!javascript
var _loc2_:* = new flash.utils.ByteArray();
while(_loc7_ < _loc4_.length)
{
    _loc2_.writeByte(_loc4_[_loc7_]);
    _loc7_++;
}
複製程式碼

0x02 外殼flash加密


除了字串及呼叫函式名以外,還有一大塊比較重要的特徵是ShellCode。ActionScript中ShellCode經常是存放在陣列、Vector中,或者使用連續的pushInt、pushByte等程式碼構造,這些大段連續的程式碼,也是非常明顯的特徵,並且大多數情況下都不會有大幅度的改變。為了加密掉這些特徵,通常會採取類似PE的加密殼的方法,使用一個外層的Flash解密並載入實際的帶有漏洞利用功能的Flash檔案。這樣外殼Flash的功能非常簡單,沒有明顯的特徵,每次只需要對外殼Flash進行簡單的特徵修改,就能夠躲避特徵查殺。

隨之帶來的問題是,如何儲存這些加密的資料。最初的方法是直接儲存與大段的字串中。例如樣本eeb243bb918464dedc29a6a36a25a638中,可以發現其存在一個非常長的字串,如圖2中的this.ybe所示。外殼Flash正是通過對該字串進行解碼和解密,得到實際的Flash,並進行載入。其具體的過程如下:

圖2 樣本中的長字串

1.Base64解碼

主要是將字串轉換成二進位制資料,程式碼中的wigr方法就是Base64解碼函式的具體實現。這也是非常常用的方法,如果看到類似圖2中的this.eruuf字串,則基本可以認為使用了Base64編碼方法。

2.進行簡單的解密運算,獲得其實際的Flash。

其具體的解密是使用RC4對稱加密演算法。解密程式碼包含兩個256次的迴圈,第一個while迴圈將是S盒初始化,第二個while迴圈是根據解密金鑰打亂S盒,看到這個程式碼就可以猜測是使用了RC4加密演算法。解密的key則是圖2中的this.jety。

圖3 樣本解密程式碼

解密出來的樣本md5是d9f01b5a3b3dd6616491f391076fbb8f,其程式碼結構就與早期的未加密AnglerEK程式碼結構一致。外殼Flash會使用LoadBytes函式載入這個解密出來的Flash,此處就使用了字串替換以便掩蓋呼叫LoadBytes函式。

圖4 LoadBytes程式碼

0x03 BinaryData儲存加密資料


方法二中的長字串,也是一個非常明顯的特徵,因此後續AnglerEK選擇這個資料儲存於BinaryData結構中,這也是當前很多的Flash加密工具的做法,例如Doswf等。

AnglerEK應該是呼叫了某個加密工具,把實際的Flash加密後儲存在BinaryData中,這個加密工具包有個特點是預設開啟的時候存在兩個不同顏色並且在不停旋轉的字串動畫。例如樣本56827d66a70fb755967625ef6f002ad9中,變存在這樣的動畫,其加密演算法的特點是會構造一個長度為91的字元陣列,BinaryData裡面的資料字元都在這個範圍內,然後變換出實際的二進位制資料,最後對這些資料進行解碼後zlib解壓得到資料。

AS3程式碼過長,這裡使用python程式碼實現相同的解密過程,具體的AS3程式碼,可以使用FFDec開啟該檔案,不過要注意的是,在反編譯這個程式碼的過程中,FFDec會丟失部分程式碼,可以同時使用AS3 Sorcerer配合檢視。

圖5 BinaryData資料解碼程式碼

隨後樣本6cb6701ba9f78e2d2dc86d0f9eee798a又對這個演算法進行了一定的改進,對於解碼出來的資料,進行了異或解密,對應的Python程式碼如下:

圖6 資料解密程式碼

0x04 圖片儲存加密資料


實際上,不論如何加密資料都無法阻止分析人員手工分析並解密提取檔案的,只能增加分析難度。例如近期的樣本c288ccd842e28d3845813703b9db96a4則不再採用將資料存放與BinaryData中,而是選擇以畫素形式儲存於圖片中,以這種方式增強了躲避防毒軟體掃描的能力。

圖7 圖片資料解密程式碼

解密程式碼如圖7所示,具體的過程如下:

1.提取資料

二進位制資料分別儲存於非壓縮影象的畫素值中,其中,第一個畫素存放實際的資料長度,剩餘的畫素中RGB值分別是資料的三個位元組內容。把這些資料沿圖片縱向拼接在一起,便得到了所需要的內容。

2.使用RC4對獲得的資料進行解密。

請注意此處的加密演算法又變成的最初的RC4,並且這種將資料儲存於圖片

的做法非常新穎,猜測這個演算法應該是AnglerEK自行設計的,程式碼簡單有效。

0x05 總結與展望


在本文中,解密獲得實際的Flash攻擊程式碼只是分析AnglerEK所利用的Flash攻擊程式碼的第一步,事實上解出的Flash攻擊程式碼仍然是經過大量混淆,我們也會繼續分析這些程式碼,嘗試重構其程式碼結構。

除了上述手工解密Flash檔案以外,另外一種比較通用方便的方法是直接Hook LoadBytes函式來解密。不論殼Flash如何解密和程式碼變換,實際的Flash都會通過LoadBytes函式載入,通過Hook該函式,可以dump所有的Flash資料,但是這樣做的唯一缺點是需要把Flash執行起來。

從AnglerEK一次又一次的改變加密演算法中,可以看出其躲避引擎查殺的意圖,因此採用傳統的特徵掃描引擎是必然無法應對的。雖然近期AnglerEK突然停止活動,但是如此高水平的攻擊包必然會捲土重來,360QEX團隊也會繼續關注該攻擊包的後續活動,並會第一時間支援查殺。鑑於目前層出不窮的Flash漏洞攻擊,同時也建議使用者及時升級Adobe Flash Player為最新版本。

參考連結

技術揭祕:巨集病毒程式碼三大隱身術
bobao.360.cn/learning/de…

近期js敲詐者的反查殺技巧分析
bobao.360.cn/learning/de…

Is it the End of Angler ?
malware.dontneedcoffee.com/2016/06/is-…

相關樣本來源

eeb243bb918464dedc29a6a36a25a638
malware.dontneedcoffee.com/2015/01/cve…

c288ccd842e28d3845813703b9db96a4
malware-traffic-analysis.net/2016/05/31/…

56827d66a70fb755967625ef6f002ad9
malware.dontneedcoffee.com/2015/03/cve…

6cb6701ba9f78e2d2dc86d0f9eee798a
malware.dontneedcoffee.com/2015/05/cve…

相關文章