【PC樣本分析】一個(gè)botnet的樣本分析
作者論壇賬號(hào):Assassin_
一個(gè)botnet的樣本分析
前言
樣本涉及的網(wǎng)絡(luò)結(jié)構(gòu)和設(shè)計(jì)模式比較陌生。對(duì)于我來說值得一看,可能有些地方理解不準(zhǔn)確請(qǐng)海涵輕錘,但是深入研究,會(huì)發(fā)現(xiàn)這個(gè)樣本越看越有意思,并且會(huì)有不少收獲。
環(huán)境與工具
win 7 64位、IDA?7.0、exeinfo、OD
分析
其樣本整體行為如下,中間有涉及hook和隱藏自身模塊等操作還是可以學(xué)習(xí)的,其中隱藏模塊自己實(shí)現(xiàn)了一下,但樣本本身最有意思的地方還是網(wǎng)絡(luò)通信。

靜態(tài)分析
樣本基本信息
文件名稱:crashreporter.exe
MD5:41a867c465464efa23b2451ae1367396
SHA256:6c362198a8879579c074ee8b0b14e712e059ff7f6037305e26f6d9ed47c6d39b
大小:116.00 KB
類型:Win32 EXE
作用(下載/釋放):釋放執(zhí)行
打包/編譯語言:Microsoft Visual C++ ver. 8.0 / Visual Studio 2005 [ Debug:02 ]
編譯/保存日期:2015:05:20 12:48:00+01:00
pdb:C:\cc694wkw\x\4wiefw4\bv7mmx\67nqxrcs\g\e0q09q\2qnp\p4gxr\l9e7\xl4n6aq.pdb

靜態(tài)拖入IDA,發(fā)現(xiàn)代碼加密

查殼,發(fā)現(xiàn)無殼,不過代碼應(yīng)該還是被壓縮了

動(dòng)態(tài)分析
首先利用rdtsc進(jìn)行反調(diào)試


調(diào)用VirtualProtectEx修改內(nèi)存屬性

代碼解密

利用jmp指令跳轉(zhuǎn)到解密代碼

利用fs:[30]獲取指定模塊基址,通過獲取Loadlibrary和Getprocaddress,然后利用GetProcAddress獲取指定API

申請(qǐng)空間,并拷貝相應(yīng)數(shù)據(jù)到該空間

申請(qǐng)空間并解壓數(shù)據(jù)

解壓之后發(fā)現(xiàn)該段數(shù)據(jù)為一個(gè)PE文件

接下來就是樣本自身編寫的一個(gè)PE Loader
修改自身PE內(nèi)存屬性,并將解密后的PE拷貝到原PE內(nèi)存

重定位

獲取API

修復(fù)內(nèi)存屬性

最后跳轉(zhuǎn)到修改后的PE入口點(diǎn)

我們將其dump下來,此時(shí)就是惡意軟件的本體了,對(duì)其進(jìn)行分析
首先判斷是否存在參數(shù) /pid

對(duì) ZwQueryVirtualMemory 進(jìn)行Hook


我們查看該段代碼

對(duì)其進(jìn)行分析可以發(fā)現(xiàn)該段代碼是對(duì)付沙箱的內(nèi)存掃描,調(diào)用該函數(shù)會(huì)返回一段虛假的內(nèi)存以欺騙沙箱

返回來,繼續(xù)分析,通過申請(qǐng)空間,拷貝映像,并利用UnmapViewOfFile釋放之前的映射的本體內(nèi)存,這里可以自己寫代碼實(shí)現(xiàn)

發(fā)現(xiàn)找不到自身模塊了

我們自己把代碼摳出來,以后可以自己用


設(shè)置Token

解密字符串并拼接


與當(dāng)前目錄進(jìn)行比較,若存在指定目錄則直接返回,否則,繼續(xù)執(zhí)行

查看當(dāng)前是否位admin用戶,如果不是則創(chuàng)建兩個(gè)線程


這兩個(gè)線程執(zhí)行以下操作
線程1 :
以admin用戶進(jìn)行啟動(dòng)

線程2:
虛擬鍵盤輸入空格

根據(jù)時(shí)間創(chuàng)建目錄,并再次拷貝文件到該目錄


創(chuàng)建名為syshost的服務(wù),如果存在該服務(wù),則先刪除該服務(wù),然后再次創(chuàng)建

嘗試開啟服務(wù),如果開啟失敗,則不在利用服務(wù)進(jìn)行自啟動(dòng),而是通過注冊(cè)表進(jìn)行自啟動(dòng)

移動(dòng)源文件到臨時(shí)目錄

最后清理文件,結(jié)束該進(jìn)程

我們可以看到該進(jìn)程再駐留時(shí)存在兩種啟動(dòng)方式,一種是加參數(shù) \service的服務(wù)啟動(dòng),還有一種是直接注冊(cè)表不加參數(shù)再指定目錄直接啟動(dòng)的方式,二者無論以什么方式啟動(dòng),其最終的行為是類似的。
我們首先分析直接啟動(dòng)的方式,經(jīng)過之前的分析,我們定位到比較指定目錄的地方,即上文中的下圖,我們可以看到此時(shí)該函數(shù)直接返回

返回之后執(zhí)行如下代碼

我們沒有參數(shù),所以執(zhí)行的是函數(shù) 00405BAC這個(gè)函數(shù)
進(jìn)入該函數(shù),首先判斷進(jìn)程類型

設(shè)置安全級(jí)別到最低,并且創(chuàng)建事件。其事件名分別為之前的解密字符串 Global/NitrGB 和 Local_NitrGB


設(shè)置錯(cuò)誤處理函數(shù),查看異常所在線程及其原因

之后遍歷進(jìn)程,排除自身對(duì)其他進(jìn)程進(jìn)行代碼注入

注入采用CreateRemoteThread的方式

利用特殊指令檢查虛擬機(jī)


更改并設(shè)置防火墻規(guī)則

解密內(nèi)置域名

解密內(nèi)置ip,總共有32個(gè)

獲取卷GUID

根據(jù)卷GUID查詢相關(guān)注冊(cè)表


解碼樣本內(nèi)置數(shù)據(jù)并利用WinAPI進(jìn)行加密


將加密后的數(shù)據(jù)寫入臨時(shí)文件中

并復(fù)制其數(shù)據(jù)到注冊(cè)表中

利用p2p進(jìn)行網(wǎng)絡(luò)連接
首先獲取隨機(jī)端口

進(jìn)入主函數(shù)
開放tcp和udp的隨機(jī)端口,并創(chuàng)建一個(gè)線程

[b]進(jìn)入該線程,該線程功能為通過發(fā)送請(qǐng)求到其他bot,解析接收到的內(nèi)容并更新自己的bot list或者C2或者ip list 或者發(fā)送內(nèi)容到bot list中的任意bot,默認(rèn)每5S發(fā)送一次,這段代碼要好好看一下,如果能夠理解,真的挺有意思的。

之后設(shè)置注冊(cè)表,其值為隨機(jī)端口進(jìn)行加密后的值


其后再次查詢并設(shè)置一系列注冊(cè)表

開始進(jìn)行網(wǎng)絡(luò)連接, 利用C2進(jìn)行數(shù)據(jù)的更新和惡意軟件的分發(fā)

利用facebook.com和microsoft.com進(jìn)行網(wǎng)絡(luò)測試


創(chuàng)建4個(gè)線程

并4個(gè)線程中獲取隨機(jī)的域名迷惑分析者并通過對(duì)其進(jìn)行DNS查詢,將可以查詢到的ip數(shù)據(jù)保存在一個(gè)列表中

對(duì)DNS查詢的ip與之前獲取facebook.com和microsoft.com的信息進(jìn)行對(duì)比,確保不等于這兩個(gè)ip的地址

然后連接硬編碼域名,進(jìn)行數(shù)據(jù)傳輸,獲取當(dāng)前精確時(shí)間


完成之后開始真正的C2連接
首先第一種就是硬編碼的域名進(jìn)行連接

第二種方式就是利用硬編碼的Ip進(jìn)行連接

如果C2連接成功之后,減慢bot之間的連接,變?yōu)槊?0S請(qǐng)求一次

如果以上兩種連接不成功則加快bot之間的通信變?yōu)槊恳幻胝?qǐng)求一次,利用第三種方法繼續(xù)嘗試C2的連接.

第三種方式,分為兩部分拼接域名
第一部分


第二部分,獲取后綴


最后進(jìn)行數(shù)據(jù)的傳輸與交互

返回?cái)?shù)據(jù)需要解密等復(fù)雜操作,故根據(jù)之前的分析,對(duì)其只能靜態(tài)分析,不過我們可以看到后續(xù)的部分操作
如更新Botlist

代碼執(zhí)行

創(chuàng)建驅(qū)動(dòng)文件等操作

結(jié)語
路漫漫其修遠(yuǎn)兮,吾將上下而求索。
原帖地址:https://www.52pojie.cn/thread-1235576-1-1.html