Jaff勒索軟體分析
Jaff勒索軟體最初於2017年春季出現,但它在很大程度上被忽視了,因為當時WannaCry是全球新聞機構的頭條。從那時起,Jaff勒索軟體潛伏在黑暗中,感染全世界的機器。在FortiGuard Labs這篇分析文章中,我們將研究該惡意軟體使用的一些常見技術,以及作為勒索軟體它是如何感染的。
一、入口點
與許多勒索軟體一樣,Jaff勒索軟體通常作為pdf附件傳送。開啟附件後,它會顯示一行文件以及一條彈出訊息,詢問是否要開啟嵌入式檔案(參見圖1)。
圖1
如果選擇開啟檔案,有趣的事情就開始了。之後,它會啟動一個嵌入式文件,其中包含有關如何從文件中移除巨集保護的說明(參見圖2)。文件頂部的黃色條帶包含“啟用內容”按鈕,可以執行文件中的任何巨集。 當然,我們都知道這個文件包含巨集。
圖2
二、無處不在的巨集
實際上,這個文件包含許多巨集(參見圖3),其中只有一個下載了Jaff二進位制檔案。 以下是此變體中的巨集列表:
·autoopen()
· Document_Open()
· setAsMainTarget()
· Challenge(sender As String, e As Integer)
· Subfunc(MethodParam2() As Byte, MethodParam As String)
· Lipochanko(a, b)
· Synomati(Comps)
· Vgux(strComputer As Integer)
· enumMembers(objDomain)
· Assimptota4(FullPath As String, NumHoja As Integer)
· Assimptota6(FullPath As String, NumHoja As Integer)
· WidthA(Dbbb As String, bbbJ As String, Optional system_ofADown_Sexote As String)
· Function system_ofADown_ProjectSpeed()
· privateProbe()
· SaveDataCSVToolStripMenuItem_Click(e As Integer)
· RepackOK(sheetToMove As String, sheetAnchor As String, Assimptota6OrAfter As String)
· CheckRectsAd()
圖3
privateProbe巨集包含下載Jaff二進位制檔案的程式碼(參見圖4)。
圖4
我們可以做一個簡單的替換來手動生成下載連結。
從編碼連結中,我們可以將字母“RRDD”替換為“om”,並從每次出現的單詞“Nbiyure3”中拆分連結(參見圖5)。
圖5
三、解密、重定向及垃圾程式碼
下載二進位制檔案後,Jaff勒索軟體開始解密部分惡意軟體程式碼。它使用簡單的程式碼重定向例程作為反分析技巧,延長分析實際惡意程式碼所需的時間。在程式碼執行之間,它使用了與惡意軟體執行無關的垃圾程式碼。
圖6顯示了以隨機方式執行的不同程式碼塊。來自這組程式碼的每次傳遞都會解密DWORD值,然後繼續,直到它解密其餘的惡意軟體。它還顯示瞭解密例程的編號執行方向。
圖6
一旦我們刪除了垃圾程式碼和不相關的塊,我們就可以看到只有三個塊用於實際的解密。圖7顯示了同一組塊,突出顯示了用於解密例程的實際相關程式碼。事實證明,實際的解密程式只是一個簡單的XOR。
圖7
四、解析API
解密惡意軟體程式碼後,惡意軟體使用的大多數API名稱仍然是隱藏的。
隱藏API名稱是惡意軟體的一種功能,旨在將其隱藏在防病毒掃描程式中。它有助於規避基於惡意軟體使用的已知API的組合進行檢測。隱藏API有不同的方法,一些惡意軟體使用加密,一些使用雜湊。Jaff使用後者。下面是解析API所需的步驟。
最初,它通過解析PEB(程序環境塊)結構來查詢“kernel32.dll”字串。它計算在PEB中找到的每個模組名稱的雜湊值,並將其與“kernel32.dll”的雜湊值進行比較。匹配後,它會抓取kernel32.dll的位置,並以類似的方式開始解析其餘所需的API。
五、程序挖空
在解析了所有需要的API之後,Jaff執行了程序挖空。 這是一種惡意功能,它不是刪除另一個可執行檔案並執行它,而是用新的可執行程式碼覆蓋記憶體中的部分原始程式碼。
為了讓Jaff進行挖空處理,它使用UnmapViewOfFile API清除當前程序的記憶體塊。 然後,它使用VirtualAlloc API重新分配相同的記憶體塊,並通過呼叫VirtualProtect API將其保護更改為PAGE_EXECUTE_READWRITE。 一系列REPE MOVSB指令用於將惡意程式碼的內容複製到新分配的記憶體塊。
六、加殼
正如我們目前所見; 解密,程式碼重定向,API解析和程序挖空只是旨在隱藏實際惡意二進位制檔案的加殼程式碼的一部分。執行完所有這些程式碼後,惡意軟體現在已準備好顯示其真實性質。
有趣的是,使用加殼技術可以基本上只需升級殼程式碼,而無需升級惡意可執行檔案。通過這種方式,可以快速部署新版本的惡意軟體,避免之前使用的檢測引數。
現在讓我們看一下嵌入式可執行程式碼的不同部分和功能所在的位置。
七、資源部分
惡意軟體的資源部分包含金鑰塊。它還包含加密的副檔名列表,下載URL連結和勒索資訊(參見圖8)。
圖8
八、金鑰塊
金鑰塊是在其中一個資源中找到的260位元組金鑰。它用於解密該部分內不同資源的內容。
圖9顯示了獲取資源的程式碼的快照,包含金鑰塊的資源和260位元組金鑰。
圖9
九、副檔名
其中一個資源包含解密的副檔名列表。 圖10顯示了惡意軟體將嘗試搜尋和加密的檔案的的副檔名列表(加/解密形式)(另請參見圖11)。
圖10
圖11
十、勒索票據
Jaff的贖金票據以三種不同的格式儲存; html,text和影象(bmp)。 text和html版本位於資源部分,bmp版本也使用相同的文字生成。 圖12顯示了加密和解密形式的贖金票據的html版本,以及其在資源部分的位置。
圖12
為以圖片形式生成贖金票據,Jaff使用以下API組合。
· CreateStreamOnHGlobal
· CreateDCW(DISPLAY)
· GetDeviceCaps
· SetRect
· CreateSolidBrush
· FillRect
· OleDraw
圖13
圖13顯示了圖片形式的贖金票據樣本。解密ID是動態生成的並新增到影象中。在Jaff勒索軟體的這個特定變體中,此圖片被設定為感染後的桌面桌布。
十一、檔案加密
在所有複雜的程式碼包裝和初始化之後,加密檔案的主要惡意載荷是最簡單的例程。
為了加密檔案,Jaff搜尋給定目錄中的檔案,然後檢查列表中是否找到了檔案的副檔名(參見圖11)。 接下來,它使用.jaff副檔名重新命名該檔案並將其開啟以進行加密。然後,它呼叫CryptEncrypt API來加密檔案(參見圖14)。
在對所有可能的檔案進行加密後,惡意軟體會在給定目錄中釋放贖金票據的ReadMe.bmp,ReadMe.html和ReadMe.txt版本。
圖14
十二、最後
影響勒索軟體普及的因素之一是它何時被釋放。 Jaff幾乎與WannaCry同時被釋放,從而在瞬間殺死了它的明星夢想。 或許,它選擇在那一刻故意釋放,就是為了增加其感染的隱身性。
無論哪種方式,我們都應該始終為任何惡意軟體或勒索軟體做好準備,同時保持我們的防禦定期更新。
Sha256: 387812ee2820cbf49812b1b229b7d8721ee37296f7b6018332a56e30a99e1092
檢測: W32/Jaff.ED11!tr.ransom