您好,登錄后才能下訂單哦!
?病毒樣本下載來源于i春秋逆向版主Crazyman_Army主題帖《記一次蔓靈花APT組織針對巴基斯坦定向的樣本分析》,樣本鏈接:https://bbs.ichunqiu.com/thread-50002-1-1.html
?對于個人而言,看過APT分析報告,但是很少逆向相關得惡意代碼,畢竟樣本少,既然發現了一枚,走過路過不能錯過。
??APT(Advanced Persistent Threat)是指高級持續性威脅,特別有針對性得方式。
?個人對于APT的理解?:APT是綜合了社會工程學,人性弱點,系統漏洞等等,多方因素協調惡意代碼發起Attack,長期潛伏,時效長達半年或者更久,收集大量的數據為attack做準備。有組織,有紀律,是一名合格的"間諜",隱蔽性很強(代碼的隱蔽性),運行方式獨特,難以查殺。
??
線上惡意代碼分析如下:
????????????????????圖片一:線上分析
?通過在線分析,與原貼中殺毒識別的個數略有差異,這是一個被明確且已能被防范的樣本。
???
手動分析如下:
1、Exinfo PE查看文件信息,如下所示:
????????????????????圖片二:樣本信息
通過Exinfo PE觀察,樣本沒有加殼,而且是c++編寫的,是圖形用戶界面程序(GUI)。?
??
2、IDA靜態分析:
????????????????????圖片三:GUI流程
????????????????????圖片四:過程化流程
下面在IDA中具體的分析一下代碼,先看圖片三中的GUI流程,如下所示:
????????????????????圖片五:GUI代碼分析
?通過ShowWindow第二個參數填入SW_HIDE數值(也就是0),意味著創建了一個隱藏窗口,調用sub_401330去執行惡意代碼。
?進入函數sub_401330之后,發現了大量的數據的初始化及循環解密字符串的環節,如下所示:
????????????????????圖片六:數據初始化
????????????????????圖片七:字符串解密
?根據個人習慣,遇到著這情況就要動態調試,單純的靠靜態去分析有些麻煩,下面通過動態分析去還原這些數據的操作。
???
3、OD動態調試:
?主要分析sub_401330函數都干了那些事情,首先初始化了一堆數據,如圖片六所示,然后又結束進程?句柄參數還是NULL,如下所示:
????????????????????圖片八:TerminateProcess
?句柄為空,返回值會是INVALID_HANDLE無效的句柄值,接下來通過字符串運算獲取了注冊表(自啟動路徑),如下所示:
????????????????????圖片九:獲取自啟動路徑
接下來拷貝了獲取的字符串,如下所示:
????????????????????圖片十:拷貝
運算字符串獲取msdtcv,如下所示:
????????????????????圖片十一:msdtcv
拼接成msdtcv.exe,如下所示:
????????????????????圖片十二:msdtcv.exe
?這時候已經拼接成一個后綴為.exe的程序了,按照一般的套路基本都是查找資源,鎖定資源釋放到某一個文件夾下,運行釋放的可執行代碼,終止當前進程,其實這個套路也是,只不過是拷貝了自己,如下所示:
????????????????????圖片十三:_mkdir
先在C盤下創建了一個文件夾,應該是準備來文件夾下拷貝或者寫入資源,如下所示:
????????????????????圖片十四:字符串拼接
?如上圖用了rep movs 匯編指令進行了文件夾路徑與msdtcv.exe拼接,高級語言的就是strcat函數,既然路徑野拼接出來了,接下來理論是要該路徑的程序落實,獲取了當前程序運行路徑,接著獲取了Open字符串,如下所示:
????????????????????圖片十五:Open
?感覺前奏應該快完了,可是發現了一個新函數,不用說應該前奏還沒結束,繼續跟如新函數一探究竟,如下所示:
????????????????????圖片十六:SHGetFolderPathA
?官方給出的函數解釋Deprecated. Gets the path of a folder identified by a CSIDL value.,獲取CSIDL路徑,這個函數已廢棄。繼續接著看,如下所示:
????????????????????圖片十七:cmd命令
?看到了上面字符串格式:copy "" "" 拷貝當前數據到c:\intel\msdtcv.exe,與猜測的步驟吻合,確實要拷貝了,既然cmd無非那幾個函數可以作為參數執行cmd指令WinExec、ShellExecute、CreateProcess等API來實現,樣本中用到了ShellExecute與CreateProcess,繼續分析,如下圖所示:
????????????????????圖片十八:reg cmd命令
?利用cmd進行自啟動,這個函數運算拼接獲取了這些即將會被用到的字符串,向下繼續分析,碰見了函數如下:
????????????????????圖片十九:sub_401F00函數
對于數據則很簡單,有編程基礎的人沒有一點難度,貼上一張IDA轉成C之后的圖:
????????????????????圖片二十:Reg API
打開及檢索AppId鍵值,如果存在則寫入路徑c:\intel\msdtcv.exe,如下所示:
????????????????????圖片二十一:設置成功
?為什么要在Environment下的AppID中設置呢?HKEY_CURRENT_USER根鍵中的信息的修改都會導致對HKEY_USERS.Default中子鍵信息的修改,修改當前用戶環境,AppId設置為運行路徑,后面會使用cmd的命令,調用%AppId%環境變量啟動且退出,如下所示:
這種方式相對于直接調用敏感的API來說很聰明,接著又開了注冊表,如下所示:
????????????????????圖片二十二:RegOpenKeyEx
?通過觀察參數,我們就可以確定這是對自啟動鍵值進行相關操作,下面調用了CreateThread函數,如下圖所示:
????????????????????圖片二十三:CreateThread
重點分析一下上圖中標紅處的回調函數,如下所示:
????????????????????圖片二十四:回調函數分析
?意圖很明顯了,樣本字符串的規律來看,這個樣本只要是對字符串賦值,意味著后面一定會有運算解密,果真如下所示:
????????????????????圖片二十五:解密代碼
?上面一段代碼動態解密出來的字符串是ComSpec,其實也就是%ComSpec%環境變量,來看一下,如下所示:
????????????????????圖片二十六:echo %ComSpec%
?前面獲取了大量的cmd指令,又獲取了cmd.exe可執行路徑,下面必須是創建cmd進程,否則那么多的sub不就白費了.....如下所示:
????????????????????圖片二十七:CreateThread
接下來向cmd.exe寫入執行的數據,完成了cmd命令拷貝,如下圖所示:
????????????????????圖片二十八:WriteFile
?回調函數結束了它的使命,創建了cmd線程且利用匿名管道寫入執行的cmd指令,實現自身拷貝,這段代碼還是比較有意思。接下來到了分水嶺,也就是當前進程的終點了,如下圖所示:
????????????????????圖片二十九:分水嶺
如圖二十二,我們明白這是要檢測是否已存在啟動項,如果響應成功則執行如下:
????????????????????圖片三十: 執行1
?那么上述代碼就結束了exit退出了,然后運行msdtcv.exe,其實還是自己,我繼續來下看,下面就是網絡相關的操作,接著調用了一個sub_4037b0,這是一個有意思的函數,如下圖所示:
????????????????????圖片三十一:RegOpenKeyEx
????????????????????圖片三十二:MachineGuid
?有意思的代碼如上,MachineGuid?這個就是所謂的超級硬件唯一標識,但是什么都沒有操作....只是做了判斷獲取了標識符數據,應該另有用處,如下所示:
????????????????????圖片三十三:sub_4037b0返回值
進行了WSA初始化及socket操作,如下所示:
????????????????????圖片三十四:gethostname
????????????????????圖片三十五:sub_402520返回值
接著調用了函數sub_4025B0,函數內容如下所示:
????????????????????圖片三十六:收集系統信息
?函數sub_4025B0里面大量的采集了操作系統的信息,應該是為了發送給服務端,為后續下載的惡意代碼兼容性提供數據支撐,線性分析發現sub_402070函數,收集的數據形成GET請求,包含了系統唯一標識及版本數據等信息,如下所示:
????????????????????圖片三十七:GET報文形成
?數據也收集,下面就發送吧,sub_402890函數包含了完整socket操作,并且發送給了服務器,如下圖所示:
????????????????????圖片三十八:send與recv
還有最后一個函數sub_402BA0,我們繼續看一下,如下所示:
????????????????????圖片三十九:socket
????????????????????圖片四十:send Data
?通過上面數據我們發現,仍在是在與服務進行通訊,格式化拼接數據發送到服務器端,下面則是下載并寫入本地惡意代碼,如下所示:
????????????????????圖片四十一:獲取絕對路徑
?以上C++代碼環境在windows10 64bit下測試,那么意味了當前系統的該路徑并且寫入文件數據,比較有意思的,服務端下載的惡意代碼進行了數據解密,通過對文件光標選擇性讀寫數據,抽取真正執行的惡意代碼,然后創建線程,如下所示:
????????????????????圖片四十二:選擇性惡意代碼讀寫
?為什么這樣做呢?為了混淆免殺,下載下來的惡意代碼為了避免被殺毒軟件查殺,可以在代碼中進行混淆,不論是從PE偏移點的改變或者是對一些敏感字符的匹配都有可能失效,躲避一些所謂的啟發式查殺,最后在本地生成真正的惡意代碼且執行,如下所示:
????????????????????圖片四十三:運行惡意代碼文件
?最后在收集數據,調用sub_402890函數,也就是上面分析完整的socket操作,如上圖三十八所示,調用圖如下所示:
?最后是獲取了時間與偽隨機數,且這是一個大循環,又會回到當初分水嶺WSACleanup的地方,如下所示:
????????????????????圖片四十四:數據提供
??以上就是整個樣本的分析,其實發現有意思的是字符串獲取的方式以及惡意代碼下載后躲避啟發式查殺的手段。本身程序并不攜帶任何具有惡意性的操作,而是收集了當前系統大量的數據發送服務端(特洛伊),服務器端根據當前系統下載兼容的混淆惡意代碼,在本地進行文件解密且運行,可惜是下載不下來惡意代碼了....
?最后,有興趣的朋友可以到文章開頭中Crazyman_Army帖子中下載APT的樣本,學習研究一下。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。