您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何進(jìn)行越南APT攻擊樣本的深度分析,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
APT已經(jīng)成為了安全領(lǐng)域熱門的話題。
Eleven Paths旗下Innovacio?n y laboratorio 4月發(fā)表《Docless Vietnam APT》報告:
上述信息表述,我們偵測到一些惡意郵件發(fā)送到屬于越南政府的郵箱,這封越南語郵件的日期是2019年3月13號。這封郵件可能是來源于越南政府內(nèi)部,不排除是有人把這封郵件投送到安全部門,因為這封郵件存在可疑因素。
TKCT quy I nam 2019.doc.lnk.malw樣本信息如下:
圖片一:TKCT quy I nam 2019.doc.lnk.malw
1. TKCT quy I nam 2019.doc.lnk.malw樣本被下載到本地后,巧妙偽裝成Word快捷方式,欺騙受害運行或者習(xí)慣性雙擊查看,如下所示:
圖片二:偽裝doc快捷方式
首先word文檔一般不會是.lnk鏈接,鏈接的大小應(yīng)該在1kb左右,而該APT樣本快捷方式竟然126kb,很明顯隱藏著別的東西,很多病毒把文件名偽裝成.dat、.docx等,其實后綴是.exe,開啟文件名擴(kuò)展就可以看到。
2. 提取樣本屬性中目標(biāo)包含的惡意代碼,發(fā)現(xiàn)是經(jīng)混淆加密的一段cmd指令,且執(zhí)行powershell,如下所示:
圖片三:混淆指令
APT攻擊手段非常青睞vbs、powershell、js等類型腳本語言,容易混淆與加密,而且方便做免殺處理。
所以歷來的病毒及惡意軟件都有這種共性,如蔓零花、Xbash、勒索都喜歡執(zhí)行powershell作為第一個“見面禮”(payload)送給計算機(jī)當(dāng)作驚喜。
3. 解析混淆指令,發(fā)現(xiàn)重定向TKCT quy I nam 2019.doc.lnk快捷方式到s.sp1文件,其實桌面快捷方式是一個powershell的腳本文件,梳理混淆變量如下所示:
最終將TKCT quy I nam 2019.doc.lnk重定向到temp文件夾下,命名為s.ps1執(zhí)行該powershell,如下所示:
圖片四:去混淆
4. 手動去除iex混淆也是可以的,打開文件去掉“iex”這幾個字符,powerhell運行指令格式:文件名(原) >> s.sp1(新文件名)即可,重定向文件如下所示:
圖片五:powershell惡意代碼
5. 如圖五所示,發(fā)現(xiàn)了兩段Base64編碼的數(shù)據(jù),powershell意圖將編碼后的惡意數(shù)據(jù)執(zhí)行,添加定時任務(wù),每9分鐘執(zhí)行創(chuàng)建,利用了InstallUtil服務(wù)實現(xiàn)了自啟動與持久性化,有意思的利用Wscript.Shell執(zhí)行,越出其不意越有意想不到的效果,如下所示:
圖片六:s.sp1
6. Base64編碼數(shù)據(jù)解析后,其實是兩個可執(zhí)行文件,分別是惡意.net與.doc,執(zhí)行手段如下圖所示:
圖片七:通用的套路
7. 分析tmp_pFWwjd.dat.exe,經(jīng)過dnSpy工具反匯編后,代碼清晰可見,雖然有一些小混淆(可以使用de4dot.exe去混淆即可),不影響代碼程度。
定位關(guān)鍵函數(shù)Exec(),發(fā)現(xiàn)Base64String編碼的數(shù)據(jù),根據(jù)執(zhí)行流程,由.NET去委托去調(diào)用函數(shù)Call,而且是可讀可寫,那么就要申請內(nèi)存VirtualAlloc(),將Base64shellcode拷貝到申請內(nèi)存中,獲取CreateThread()指針委托執(zhí)行回調(diào)指針,執(zhí)行惡意的shellcode,如下所示:
圖片八:.net反匯編
如何理解shellcode或payload?本質(zhì)上可以是說一堆十六進(jìn)制組成的數(shù)據(jù),對于可執(zhí)行文件來說則是能夠被匯編引擎所解釋執(zhí)行的數(shù)據(jù)。
因為下面將會涉及二進(jìn)制數(shù)據(jù)提取與匯編分析,所以這里做了一副簡單的圖先介紹關(guān)于shellcode或者payload基本概念(針對惡意代碼),如下圖所示:
圖片九:payload
如圖九所示,對于病毒來說,特別是可自啟動,持久化攻擊,沒有后門很難實現(xiàn)(漏洞持續(xù)化利用,每次拉取少量流量做數(shù)據(jù)竊取之類的除外)。
舉例來說,ASLR地址隨機(jī)化每次系統(tǒng)重啟后基址都會改變,或者注入到新的進(jìn)程空間,代碼本身的函數(shù)基址都是錯誤的,如何精準(zhǔn)的獲取函數(shù)地址?從而達(dá)到完美運行,需要格外的一些操作,當(dāng)然這些都不是問題,技術(shù)相對成熟。
下面一段知識所講述的內(nèi)容,假設(shè)讀者對Windows PE格式及匯編、內(nèi)核相關(guān)內(nèi)容有一定的基礎(chǔ)。不會普及基礎(chǔ)知識,將從PE格式及匯編層面去分析這些shellcode如何去做,如何實現(xiàn)動態(tài)獲取模塊基址如kernel32.dll,如何利用散列值或者Hash遍歷導(dǎo)出表,過免殺敏感字符串及敏感函數(shù)API等。
以上述的惡意代碼舉例,因為.net執(zhí)行shellcode調(diào)試過程中遇到諸多問題,所以用c/c++還原了tmp_pFWwjd.dat.exe樣本。
再一次OD進(jìn)行動態(tài)調(diào)試,當(dāng)然可以Dump下來分析,根據(jù)個人愛好,直接在執(zhí)行shellcode下斷,如下所示:
圖片十:Pointer
1. 入口點進(jìn)入,接著就是數(shù)據(jù)的異或解密,將需要真正執(zhí)行的惡意代碼還原,如下所示:
圖片十一:異或解密
2. 散列值加密字符串,這樣的好處既可以減少shellcode體積,而且可以隱蔽敏感字符,不容易被殺毒軟件截獲,如下所示:
圖片十二:散列值獲取函數(shù)地址
3. 我們進(jìn)入函數(shù)1E0A42,發(fā)現(xiàn)一堆看上去很平常的賦值操作,如下所示:
圖片十三:fs:[0x30]
Fs是寄存器,內(nèi)核態(tài)是fs = 0x30,用戶態(tài) fs = 0x3B,fs在內(nèi)核態(tài)指向_KPCR,用戶態(tài)指向_TEB。
TEB(Thread Environment Block),線程環(huán)境塊,也就是說每一個線程都會有TEB,用于保存系統(tǒng)與線程之間的數(shù)據(jù),便于操作控制。那么Fs:[0x30]就是PEB進(jìn)程環(huán)境塊。
4. PEB就是當(dāng)前進(jìn)程環(huán)境,shellcode就可以輕易獲取PEB信息,通過偏移0xc獲取到了_PEB_LDR_DATA,這個結(jié)構(gòu)體包含有關(guān)進(jìn)程的已加載模塊的信息.
通過偏移0x1c獲取到一個雙向循環(huán)鏈表,每個鏈表指向LDR_DATA_TABLE_ENTRY結(jié)構(gòu)體,這個結(jié)構(gòu)體包含的數(shù)據(jù)我們來看一下,以上數(shù)據(jù)偏移與操作系統(tǒng)有關(guān),如下所示:
圖片十四:獲取模塊基質(zhì)
圖片十五:獲取當(dāng)前環(huán)境模塊基址步驟
5. 通過上述的過程,就會成功獲取如ntdll.dll,如下所示:
圖片十六:獲取模塊Address
6. 繼續(xù)分析函數(shù)1E0B2A,兩個參數(shù),根據(jù)函數(shù)調(diào)用約定,參數(shù)1是kernel32基地址,參數(shù)2是函數(shù)名散列值,該函數(shù)則是一個自己實現(xiàn)的GetProcAddress()函數(shù),如下所示:
圖片十七:GetProcAddress
7. 該函數(shù)會判斷是不是PE標(biāo)準(zhǔn)格式,然后獲取NT頭,獲取導(dǎo)出表。導(dǎo)出表保存了三張表的地址,先來看導(dǎo)出表結(jié)構(gòu)體,如下所示:
惡意代碼需要定位到這三張表的地址,遍歷函數(shù)名稱表AddressOfName,獲取函數(shù)名進(jìn)行散列值計算,如果與參數(shù)2散列值相同,意味著是同一個函數(shù)。
返回當(dāng)前遍歷的下標(biāo),通過下標(biāo)去函數(shù)序號表AddressOfNameOrdinals找到對應(yīng)的序號,獲取序號表保存的數(shù)值,在函數(shù)地址表中獲取AddressOfFunctions,如下圖所示簡單表述了三者關(guān)系:
圖片十八:三者關(guān)聯(lián)
如上圖所示,序號表與名稱表一一對應(yīng),下標(biāo)與下標(biāo)中存儲的值是相關(guān)聯(lián)的,這三張表設(shè)計巧妙,利用了關(guān)系型數(shù)據(jù)庫的概念。
需要注意的是,序號不是有序的,而且會有空白。地址表中有些沒有函數(shù)名,也就是地址表有地址卻無法關(guān)聯(lián)到名稱表中,這時候用序號調(diào)用,序號內(nèi)容加上Base序號基址才是真正的調(diào)用號。
8. 當(dāng)有了這些認(rèn)知,再來看樣本中的惡意代碼,會發(fā)現(xiàn)與上述的描述是一摸一樣的,如下所示:
圖片十九:GetProcAddress()
9. 最后驗證結(jié)果是否成功,如下所示:
圖片二十:驗證
11. 創(chuàng)建了新得線程,線程回調(diào)會創(chuàng)建目錄及文件,但是本地驗證創(chuàng)建文件失敗,如下所示:
圖片二十一:創(chuàng)建目錄
創(chuàng)建文件及目錄名路徑c:\User\......\AppData\Roaming\
11. 服務(wù)器響應(yīng)及下載惡意代碼,這將開啟一段新得旅程,如下所示:
圖片二十二:DownLoader
1. 跟進(jìn)函數(shù)后我們發(fā)現(xiàn)了大量的散列值,動態(tài)獲取函數(shù)地址,與上述函數(shù)調(diào)用一致,梳理函數(shù)名如下:
1E0AAA函數(shù)解密如下:
2. 做了預(yù)熱操作,其實根據(jù)函數(shù)名稱,應(yīng)該猜測到接下來會發(fā)生什么,如下圖所示:
圖片二十三:InternetOpenA
圖片二十四:InternetConnectA
圖片二十五:HttpOpenRequestA
3. 動態(tài)調(diào)試過程中會卡斷在請求,靜態(tài)分析代碼,lstrcmpiA比較下載數(shù)據(jù)的指紋信息text字段是否為plain,然后利用InternetReadFile讀取下載數(shù)據(jù)執(zhí)行,否則的話將陷入睡眠、請求死循環(huán)狀態(tài)。
圖片二十六:請求狀態(tài)
我們根據(jù)已知的ip與請求格式,直接訪問該網(wǎng)頁,如下所示:
圖片二十七:vkT2
發(fā)現(xiàn)Web解析的全是亂碼?下載到本地,根據(jù)原代碼執(zhí)行流程,這是一段二進(jìn)制數(shù)據(jù),老規(guī)矩寫個程序來調(diào)試這段惡意代碼。
4. vkT2分析,先是解密了數(shù)據(jù),然后動態(tài)獲取函數(shù)地址,樣本慣用的老套路了。
循環(huán)拼接各區(qū)段(節(jié)表)數(shù)據(jù),這里按照VirtuallAddress,各區(qū)段在加載到內(nèi)存后的地址循環(huán)拼接,內(nèi)存的對齊粒度0x1000,抹掉了DOS頭特征碼,形成了一個PE格式文件,如下所示:
圖片二十八:內(nèi)存擴(kuò)展
5. 既然是PE格式擴(kuò)展到了內(nèi)存里面,接下來就是修復(fù)了IAT表與重定位了,這里涉及的面比較多,還屬于PE格式內(nèi)容,可查閱《Windows權(quán)威指南》,如下圖所示:
圖片二十九:修復(fù)IAT
6. 接下來分析關(guān)鍵要點,獲取了系統(tǒng)變量,判斷是否運行在64bit系統(tǒng)上,如下所示:
圖片三十:判別運行環(huán)境
8. 系統(tǒng)數(shù)據(jù)、主機(jī)ip、主機(jī)名等信息收集,如下所示:
圖片三十一:數(shù)據(jù)收集
9. 新一輪的C&C通信開始,如下圖示所示:
圖片三十二:建立通信
9. 繼續(xù)分析,使用函數(shù)HttpOpenRequest和HttpSendRequest打開文件。HttpOpenRequest創(chuàng)建個請求句柄并且把參數(shù)存儲在句柄中,HttpSendRequest把請求參數(shù)送到HTTP服務(wù)器,如下所示:
圖片三十三:HttpOpenRequest
圖片三十四:HttpSendRequestA
11. 遺憾的是HttpSendRequeSt已經(jīng)沒有什么響應(yīng)了,靜態(tài)分析剩余的代碼(模擬執(zhí)行),讀取服務(wù)器返回的惡意代碼,有用到線程安全上下文。
情報分析沒找到更有價值的數(shù)據(jù),不過這種請求方式很獨特,而且構(gòu)造的數(shù)據(jù)包也很特別,下面會講到這樣做的特殊性。
關(guān)聯(lián)樣本過程,梳理執(zhí)行流程圖如下所示:
圖片三十五:TKCT quy I nam 2019.doc執(zhí)行流程
如圖三十五,客戶端通信的服務(wù)器應(yīng)該都是代理服務(wù)器,其實真是的環(huán)境遠(yuǎn)遠(yuǎn)要比上述過程復(fù)雜更多,這也是溯源的難點。
如圖三十三,堆棧內(nèi)存中提取關(guān)鍵的數(shù)據(jù)信息,這與往常的我們所見到的請求數(shù)據(jù)不太一樣,梳理如下所示:
APT通訊的手段越來越謹(jǐn)慎,如果不進(jìn)行詳細(xì)的樣本分析,沙箱模擬運行、內(nèi)存取證、抓包工具來對網(wǎng)絡(luò)層面進(jìn)行分析,結(jié)果與想要的數(shù)據(jù)可能有一定的出入,樣本進(jìn)行通信的時候,其實用到了域前端網(wǎng)絡(luò)攻擊技術(shù)。
什么是域前端網(wǎng)絡(luò)攻擊技術(shù)?簡單點來說可以將msf、cs(Cobalt Strike)等團(tuán)隊控制服務(wù)器的流量,目的用來繞過一定程度的防火墻與檢測器,一些較大的廠商都會提供服務(wù),所以用msf或cs等工具都可以實現(xiàn)。
我們用Cobalt Strike這款工具舉例,集成了端口轉(zhuǎn)發(fā)、掃描多模式端口Listener、Windows exe程序生成、Windows dll動態(tài)鏈接庫生成、java程序生成、office宏代碼生成,包括站點克隆獲取瀏覽器的相關(guān)信息等。
其中比較有用的一個功能就是Beacon payload的行為,修改框架默認(rèn)屬性值,更改檢入的頻率及修改Beacon網(wǎng)絡(luò)流量,而這些功能的配置都在文件Malleable C2。
Malleable-C2-Profiles功能就可以做到構(gòu)造一個正常的Web偽裝流量,最終達(dá)到通信隱匿的效果,我們摘取amazon.profile舉例,如下所示:
set useragent "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko";http-get {Seturi"/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books";client {header "Accept" "*/*";header "Host" " www.amazon.com ";metadata {base64;prepend "session-token=";prepend "skin=noskin;";append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996";header "Cookie";}http-post {set uri "/N4215/adj/amzn.us.sr.aps";client {header "Accept" "*/*";header "Content-Type" "text/xml";header "X-Requested-With" "XMLHttpRequest";header "Host" " www.amazon.com ";parameter "sz" "160x600";parameter "oe" "oe=ISO-8859-1;";id {parameter "sn";}parameter "s" "3717";parameter "dc_ref" "http%3A%2F%2F www.amazon.com ";}
上述代碼與樣本vkT2.shellcode通信的特征完全匹配,通過加載相應(yīng)的profile文件,來改變目標(biāo)主機(jī)與server端的流量特征,以此來隱藏流量,最終達(dá)到通信隱匿的目的。
以上就是如何進(jìn)行越南APT攻擊樣本的深度分析,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。