從零開始搭建Cuckoo Sandbox(2)

在上一篇文章的結尾,我留了個坑。在這篇文章,我們將會把這個坑連同我下面提到的幾個問題,一併解決掉。

如果你在提交樣本時主動選擇正確的文檔類型讓Cuckoo Sandbox進行分析並且成功拿到了分析報告的話,你會留意到以下幾個問題:

· “文檔類型”一欄是空的

· ssdeep值是空的

· 正常情況下提交包含數字簽名的文檔進行分析,在分析報告裏會提到文檔已被簽名(如果你安裝了社區版行為簽名庫),但是這裏也是沒有的

· 進程執行過程中彈出的提示有一部分無法自動點擊

· Office/PDF文檔即使指明文檔類型也無法分析(分析過程瞬間完成,分析報告裏包含錯誤信息。僅特定情況下會出現)

實際上,上一篇文章留下的坑,和我上面提到的五條內的第一條是同一個問題。讓我們逐個解決掉它們吧。

文檔類型識別

如果你有留意到運行“cuckoo -d”命令對應的命令行界面輸出的信息,你會發現Cuckoo Sandbox會把[Cuckoo工作目錄]\analyzer對應系統的整個文檔夾拷貝到虛擬機然後才會開始分析流程。而文檔類型識別的相關代碼也的確在這裏面,入口是[工作目錄]\analyzer\windows\analyzer.py

通過分析這個python腳本里run函數的代碼,我們很容易得知在第543行(由於代碼做過修改,實際的代碼行數不見得是我這邊實際提到的值,大家可以在相關行附近找下,後續提到的代碼行數均適用此規則)的if語句便是開始了文檔類型的判斷,實際上這個if語句只是判斷你是否有在提交樣本時手工指定文檔類型(這決定Cuckoo Sandbox啟動並分析文檔的方式),而在這裏便出現了一個bug。

如果你願意修改代碼把self.config.package的type打印出來,python會告訴你這是個string(不管你是否在提交樣本時手工指定文檔類型),那麼這就意味着這個if語句是根本進不去的,也就永遠無法觸發Cuckoo自動判斷文檔類型。

原因找到了,修復方案也就明瞭了:

if not self.config.package or self.config.package=="None" or self.config.package=="default"

或者

if self.config.package in [None, "None", "default"]

把需要Cuckoo進行文檔類型識別的情況覆蓋全即可。

但是事情還沒完。把這一處問題修改之後再次提交樣本,不指定文檔類型,你會發現Cuckoo還是報錯了。原因非常簡單,找到[Python安裝目錄]\Lib\site-packages\cuckoo\compat\magic.py,第18行。Cuckoo需要pymagic這個庫來進行文檔類型識別,這玩意實際上只是去調用libmagic識別庫,但是libmagic不支持64位版本的Python。

在Github上,我們找到了其他人編譯出的64位版本的libmagic識別庫( https://github.com/julian-r/file-windows ),找到這個東西,問題就好解決了:

1. 把上面地址內的Release包拿下來,我們只需要裏面的DLL和mgc特徵庫文檔。將DLL改名為magic1.dll(為什麼改成這個名字?請看[Python安裝目錄]\Lib\site-packages\magic.py,第157行),放入C:\Windows\System32目錄下,mgc文檔則覆蓋到[Python安裝目錄]\Lib\site-packages\cuckoo\private\win32目錄下

2. 修改[Python安裝目錄]\Lib\site-packages\magic.py,第157行,在之前的Github鏈接裏,作者提到這個DLL的所有依賴庫均為靜態編譯,我們不再需要cygwin的支持

windows_dlls = ['magic1.dll']

就像這樣,把cygmagic-1.dll從檢測列表裏去掉就好。

3. 修改[Python安裝目錄]\Lib\site-packages\cuckoo\compat\magic.py,第19行,我們已經找到了64位版本的libmagic庫,就把supported置為True吧

全部處理完後,重啟Cuckoo,再次提交文檔,你會發現,Cuckoo可以自動進行文檔類型識別了,同時在分析報告頁面,文檔類型一欄也不再是空的。

SSDeep計算

試着去命令行運行“pip install pydeep”,你會發現即使安裝相關編譯器,最後仍然無法正常安裝,編譯時提示缺少一個頭文檔,就像這樣:

從零開始搭建Cuckoo Sandbox(2)
從零開始搭建Cuckoo Sandbox(2)

去網上搜索,有不少人也遇到了相關的麻煩,看來是pydeep並不支持在Windows機器上安裝。但是天無絕人之路,我們發現有人“曲線救國”,把Windows版本的計算ssdeep值的工具用Python做了次封裝(調用相關函數實際上時調用相關進程然後拉取其返回的內容): https://github.com/c0dist/ssdeep-ftw ,問題迎刃而解:

1. 把上面提到的鏈接內的ssftw.py下載下來放到[Python安裝目錄]\Lib\site-packages目錄下

2. 下載ssdeep: https://github.com/ssdeep-project/ssdeep/releases

3. 修改[Python安裝目錄]\Lib\site-packages\cuckoo\common\object.py,首先是開頭,有檢測pydeep是否存在的代碼,把“import pydeep”改成“from ssftw import SSFTW”;找到get_ssdeep函數,如果你有留意ssftw.py的代碼,我們在上一個步驟裏並沒有直接修改裏面設置的ssdeep進程的路徑,這裏我們首先需要指定ssdeep進程的路徑,然後再調用相關函數進行計算(部分函數名和pydeep略有區別,請務必注意)

try:
    pydeep=SSFTW("D:\\ssdeep-2.14.1\\ssdeep.exe") #pass ssdeep binary path to class constructor
    return pydeep.hash_from_file(self.file_path)

4.     還沒完呢,還有個地方。找到[Cuckoo工作目錄]\signatures\windows\packer_polymorphic.py,這個行為簽名是用來識別被分析的樣本是否生成了與自身極其相似的文檔,同樣調用了pydeep,這兒我就不再展示修改後的代碼了

全部處理完後,重啟Cuckoo,提交文檔,查看報告,ssdeep值也可以正常展示了。

數字簽名提取

如果你在之前提交了帶有數字簽名的樣本,你會發現在用於處理結果的Cuckoo進程所在的命令行界面上會在處理結果時輸出錯誤信息,告訴你缺了M2Crypto這個庫。

在64位Windows環境下,我們只能選擇這個: https://pypi.org/project/M2CryptoWin64 ,如PyPI所在頁面上提示你的,在部分情況下,直接使用“pip install M2CryptoWin64”是沒法正常安裝。這個時候我們需要使用“pip install --egg M2CryptoWin64”來完成安裝。而在pip 10.0+版本,--egg這種安裝模式已經被刪掉了,這也就是為什麼我上一篇文章的“初期準備”部分建議對pip進行降級。

M2CryptoWin64並沒有對M2Crypto進行修改,因此我們安裝後無需為了適配而修改相關代碼。

模擬點擊

如果你有留意你提交上去的樣本在分析報告裏的截圖,你會發現Cuckoo在碰到部分彈窗時並沒有進行點擊(尤其是中文的彈窗)。

Cuckoo有關模擬點擊的模塊也在Cuckoo工作目錄的analyzer子目錄下,具體位置在這兒:[Cuckoo工作目錄]\analyzer\windows\modules\auxiliary\human.py,在foreach_child函數內進行適配就好,就像下圖這樣:

從零開始搭建Cuckoo Sandbox(2)
從零開始搭建Cuckoo Sandbox(2)

Office/PDF文檔分析

如果你和我一樣,給虛擬機裏安裝Office時,一是用的精簡版,二不把Office裝在C盤,那麼你就需要做一些額外的操作,畢竟Cuckoo並沒有那麼聰明。

這裏只介紹最簡單粗暴的方法:找到[Cuckoo工作目錄]\analyzer\windows\modules\packages,doc/xls/ppt這三個Python腳本分別控制三類Office文檔的啟動方式以及一些預處理,找到它們的start函數,直接指定一個進程路徑就好,就像這樣:

從零開始搭建Cuckoo Sandbox(2)
從零開始搭建Cuckoo Sandbox(2)

PDF也是一樣,Cuckoo Sandbox只對Acrobat Reader做了識別,也需要適配,步驟就不多闡述了。

到這裏,絕大多數的坑都被排掉了,大家總算是可以愉快地在沙盒內跑樣本了。下一章將會講述行為簽名編寫相關的內容,也是整篇文章的最後一節。