最近真的太忙了,天天打仗一樣,感謝大家的支持和關注,繼續加油!該系列文章將系統整理和深入學習系統安全、逆向分析和惡意代碼檢測,文章會更加聚焦,更加系統,更加深入,也是作者的慢慢成長史。漫漫長征路,偏向虎山行。享受過程,一起奮斗~

前文詳細介紹Cape沙箱批量分析,通過調用Python腳本文件submit.py來實施批量處理。這篇文章將講解如何將Cape沙箱分析結果Report報告的API序列批量提取,主要是提取Json文件的內容并存儲至指定位置。基礎性文章,希望對您有幫助,如果存在錯誤或不足之處,還請海涵。且看且珍惜!

通常批量分析的結果如下圖所示,每個樣本對應一個文件夾,并且Reports文件夾中具有四個文件,它們對應樣本沙箱分析的結果。

文章目錄:

  • 一.惡意軟件分析
  • 1.靜態特征
  • 2.動態特征
  • 二.Cuckoo和Cape沙箱簡介
  • 1.Cuckoo沙箱簡介
  • 2.Cape沙箱簡介
  • 3.Cape原理
  • 三.Cape沙箱識別單樣本特征
  • 1.啟動沙箱關鍵步驟
  • 2.樣本分析
  • 四.Python批量提取Report報告
  • 1.分析結果
  • 2.文件批量提取
  • 五.Python提取Json文件API特征和時間序列
  • 六.總結

作者的github資源:

  • 逆向分析:
  • https://github.com/eastmountyxz/
  • SystemSecurity-ReverseAnalysis
  • 網絡安全:
  • https://github.com/eastmountyxz/
  • NetworkSecuritySelf-study


作者作為網絡安全的小白,分享一些自學基礎教程給大家,主要是關于安全工具和實踐操作的在線筆記,希望您們喜歡。同時,更希望您能與我一起操作和進步,后續將深入學習網絡安全和系統安全知識并分享相關實驗。總之,希望該系列文章對博友有所幫助,寫文不易,大神們不喜勿噴,謝謝!如果文章對您有幫助,將是我創作的最大動力,點贊、評論、私聊均可,一起加油喔!

聲明:本人堅決反對利用教學方法進行犯罪的行為,一切犯罪行為必將受到嚴懲,綠色網絡需要我們共同維護,更推薦大家了解它們背后的原理,更好地進行防護。(參考文獻見后)

一.惡意軟件分析

惡意軟件或惡意代碼分析通常包括靜態分析和動態分析。特征種類如果按照惡意代碼是否在用戶環境或仿真環境中運行,可以劃分為靜態特征和動態特征。

那么,如何提取惡意軟件的靜態特征或動態特征呢? 因此,第一部分將簡要介紹靜態特征和動態特征。

1.靜態特征

沒有真實運行的特征,通常包括:

  • 字節碼
  • 二進制代碼轉換成了字節碼,比較原始的一種特征,沒有進行任何處理
  • IAT表
  • PE結構中比較重要的部分,聲明了一些函數及所在位置,便于程序執行時導入,表和功能比較相關
  • Android權限表
  • 如果你的APP聲明了一些功能用不到的權限,可能存在惡意目的,如手機信息
  • 可打印字符
  • 將二進制代碼轉換為ASCII碼,進行相關統計
  • IDA反匯編跳轉塊
  • IDA工具調試時的跳轉塊,對其進行處理作為序列數據或圖數據
  • 常用API函數
  • 惡意軟件圖像化

靜態特征提取方式:

  • CAPA
  • – https://github.com/mandiant/capa
  • IDA Pro
  • 安全廠商沙箱

2.動態特征

相當于靜態特征更耗時,它要真正去執行代碼。通常包括:

– API調用關系:比較明顯的特征,調用了哪些API,表述對應的功能

– 控制流圖:軟件工程中比較常用,機器學習將其表示成向量,從而進行分類

– 數據流圖:軟件工程中比較常用,機器學習將其表示成向量,從而進行分類

動態特征提取方式:

  • Cuckoo
  • – https://github.com/cuckoosandbox/cuckoo
  • CAPE
  • – https://github.com/kevoreilly/CAPEv2
  • – https://capev2.readthedocs.io/en/latest/
  • 安全廠商沙箱

二.Cuckoo和Cape沙箱簡介

1.Cuckoo沙箱簡介

Cuckoo Sandbox 是一個開源的自動惡意軟件分析系統,并且是經典的沙箱分析工具。Cuckoo沙箱將在幾秒鐘內為您提供一些詳細的分析結果,概述該文件在隔離環境中執行時的情況。不像在線VirusTotal、VirusShare、微步、AnyRun、Hybrid等在線沙箱,Cuckoo可以實現本地安裝和離地分析,其定制化和可控程度更高。

  • https://github.com/cuckoosandbox/cuckoo

Cuckoo Sandbox始于2010年蜜網計劃中的谷歌Summer of Code項目,它最初是由Claudio“nex”Guarnieri設計和開發的。在2010年夏天開啟該工作之后,第一個測試版于2011年2月5日發布,這是Cuckoo第一次公開發布。2011年3月,在谷歌Code Summer of 2011期間,Cuckoo再次被選為蜜網項目的支持項目,在此期間Dario Fernandes加入了該項目并擴展了其功能。

Cuckoo Sandbox started as a Google Summer of Code project in 2010 within The Honeynet Project. It was originally designed and developed by Claudio “nex” Guarnieri, who is still the main developer and coordinates all efforts from joined developers and contributors.

2.Cape沙箱簡介

CAPE Sandbox 是一款用于自動分析可疑文件或惡意軟件的開源系統,它使用自定義組件來監視在隔離環境中運行的惡意進程的行為。CAPE來源于Cuckoo Sandbox,目的是添加自動惡意軟件解包和配置提取——因此它的名字是一個縮寫“配置和有效載荷提取(Config And Payload Extraction)”。自動解包允許基于Yara簽名的分類,以補充網絡(Suricata)和行為(API)簽名。于2016年誕生。

  • https://github.com/kevoreilly/CAPEv2
  • https://capesandbox.com
CAPE Sandbox is an Open Source software for automating analysis of suspicious files. To do so it makes use of custom components that monitor the behavior of the malicious processes while running in an isolated environment.

CAPE被用來自動運行和分析文件,并收集全面的分析結果,概述惡意軟件在孤立的Windows操作系統中運行時的行為。它可以檢測以下類型的結果:

  • 由惡意軟件生成的所有進程執行的win32 API調用的痕跡。
  • 惡意軟件在執行過程中創建、刪除和下載的文件。
  • 惡意軟件進程的內存轉儲。
  • PCAP格式的網絡流量跟蹤。
  • 在執行惡意軟件期間截取的Windows桌面截圖。
  • 機器的全內存轉儲。

由于CAPE的模塊化設計,它既可以作為獨立的應用程序使用,也可以集成到更大的框架中。它可以用來分析:

  • Generic Windows executables
  • DLL files
  • PDF documents
  • Microsoft Office documents
  • URLs and HTML files
  • PHP scripts
  • CPL files
  • Visual Basic (VB) scripts
  • ZIP files
  • Java JAR
  • Python files
  • Almost anything else

雖然CAPE沙箱的配置和有效載荷提取是最初聲明的目標,但CAPE調試器的首要目標是:為了從任意惡意軟件家族中提取配置文件或解壓縮有效負載,而不依賴進程轉儲(遲早會被壞人破壞),指令級別的監視和控制是必要的。CAPE中的新調試器遵循最大化使用處理器硬件和最小化使用Windows調試接口的原則,允許通過Yara簽名或API調用在引爆期間以編程方式設置硬件斷點,從入口點偷偷地檢測和操縱惡意軟件。這允許捕獲指令跟蹤,或執行操作,如控制流操作或轉儲內存區域。

調試器允許CAPE在其原始功能之外繼續發展,這些功能現在包括了動態反規避繞過。由于現代惡意軟件通常試圖在沙箱中逃避分析,例如通過使用定時陷阱來進行虛擬化或API鉤子檢測,CAPE允許開發動態對策,結合調試器在Yara簽名中的動作,來檢測隱藏的惡意軟件,并執行控制流程操作,迫使樣品完全引爆或跳過規避動作。CAPE的動態旁路越來越多,其中包括:

  • Guloader
  • Ursnif
  • Dridex
  • Zloader
  • Formbook
  • BuerLoader
  • Pafish

CAPE利用了許多惡意軟件技術或行為,允許未打包的有效載荷捕獲,這些行為將導致捕獲注入、提取或解壓縮的有效載荷,以便進一步分析。此外,CAPE自動為每個進程創建一個進程轉儲,或者在DLL的情況下,為內存中的DLL模塊映像創建一個進程轉儲。

推薦讀者學習官方文檔:

  • https://capev2.readthedocs.io/en/latest/
  • https://capev2.readthedocs.io/en/latest/usage/submit.html


3.Cape原理

CAPE Sandbox由處理樣本執行和分析的中央管理軟件組成。每個分析都在一個全新的、孤立的虛擬機中啟動。CAPE的基礎結構由一臺主機(管理軟件)和一些Guest機器(用于分析的虛擬機)組成。主機Host運行管理整個分析過程的沙盒核心組件,而Guest是安全執行和分析惡意軟件樣本的隔離環境。

CAPE的主要架構如下圖所示:

  • 推薦的設置是GNU/Linux (Ubuntu LTS最好)作為主機,Windows 7作為客戶。


三.Cape沙箱識別單樣本特征

1.啟動沙箱關鍵步驟

第一步,安裝VMware虛擬機并載入Cape環境鏡像。

第二步,按照四個關鍵步驟啟動Cape沙箱。

  • (1)在任意文件夾中運行"sudo virtualbox",現在已經安裝了一個Win7 X64專業版虛擬機。
  • (2)進入/opt/CAPEv2/文件夾,運行"sudo python3 cuckoo.py"。
  • (3) 在/opt/CAPEv2/文件夾下運行"sudo python3 utils/process.py -p7 auto",參數代表優先級劃分,輸入多個樣本時,沙箱會優先運行高優先級樣本。
  • (4)在/opt/CAPEv2/web目錄下(由于環境依賴的問題,必須由指向該文件夾的shell運行該命令),運行"sudo python3 manage.py runserver 127.0.0.1:8088"(該虛擬機的8080端口已被占用,端口可自己指定)。


2.樣本分析

在虛擬機的火狐中打開127.0.0.1:8088,在submit頁面提交樣本即可。

再次強調
在惡意軟件分析中,一定要做好本機保護,包括在虛擬機隔離環境中進行分析,甚至需要斷網防止沙箱逃逸。同時,本人堅決反對滲透和破壞行為,一切犯罪行為必將受到嚴懲,綠色網絡需要我們共同維護。這里僅是分享惡意軟件分析背后的原理,更好地進行防護。

運行結如下圖所示:

點擊控制面板的“Recent”查看分析結果。由圖可知,本文分析的結果已產生,同時有之前提交的兩個樣本。

對應的分析結果如下圖所示:

此時會遇到一個問題:在做惡意軟件分析過程中,通常會遇到大量的惡意軟件。如果手動添加其過程極其繁瑣并且耗時,如何解決該問題呢?


四.Python批量提取Report報告

1.分析結果

假設存在某個APT組織的樣本分析結果,如下圖所示,每個文件夾對應一個樣本,其命名序號為樣本在Cape沙箱中的分析順序,比如“203”。

每個文件夾中的內容如下圖所示:

當Cape分析完成,所有的分析都存儲在storage/analyses/目錄下,該目錄位于一個子目錄下,該子目錄以增量數字ID命名,該數字ID表示數據庫中的分析任務。

.
|-- analysis.conf
|-- analysis.log
|-- binary
|-- dump.pcap
|-- memory.dmp
|-- files
|   |-- 1234567890
|       `-- dropped.exe
|-- logs
|   |-- 1232.raw
|   |-- 1540.raw
|   `-- 1118.raw
|-- reports
|   |-- report.html
|   |-- report.json
|   |-- report.maec-4.0.1.xml
|   `-- report.metadata.xml
`-- shots
    |-- 0001.jpg
    |-- 0002.jpg
    |-- 0003.jpg
    `-- 0004.jpg

2.文件批量提取

本文的目標是將每個Report文件夾中的兩個報告提取出來,并利用樣本的MD5值命名,從而為第五部分API特征提取提供幫助。

  • report.html
  • report.json

需要提取如下圖所示的MD5值來命名文件。

關鍵代碼如下:

"target": {
    "category": "file",
    "file": {
        "name": "033ad372890****ffc827fbac.bin",
        "path": "/opt/CAPEv2/storage/binaries/26f5e813e34c05cd1e55****c24e58546e60",
        "guest_paths": null,
        "size": 70803,
        "crc32": "12BCC81F",
        "md5": "033ad372890****0ffc827fbac",
        "sha1": "03b084e2c1c039****81d5f7d60eae",
        "sha256": "26f5e813e34c05cd1e5532****416232c24e58546e60",
        "sha512": "644860affd840d140198cea****bed41cca7887faebc",
        "ssdeep": "1536:GiA3gHfirellrelGrzB/QhoCDW+4oDCdYH****3gHfirezre8/aDCdFoBjRaUnq",
        "type": "Microsoft Word 2007+",
        "yara": [],
        "cape_yara": [],
        "clamav": []
    }
},

下面是提取文件名稱的Python代碼。json提取所利用的擴展包為JsonSearch,在前文中有相關描述。

首先,定位report.json文件位置并分析Json文件的關鍵Key和Value值。


#coding:utf-8#By:Eastmount CSDN 2023-04-10import csvimport reimport osimport jsonfrom jsonsearch import JsonSearch
def getAllFiles(targetDir):    listFiles = os.listdir(targetDir)    return listFiles
#-------------------------1.判斷指定文件-----------------------------aptname = "AAAA"filenames = getAllFiles(aptname)#['203', '204', ...,'277', '278']
i = 0count = 0  #樣本數量while i    #判斷該文件夾中是否存在reports件夾 eg:Aggah\277\reports    filename = aptname + "\\" + filenames[i] + "\\reports"    print(filename)    if os.path.exists(filename):        #report.html report.json report.pdf summary-report.html        for n in os.listdir(filename):            if n=="report.json":                #----------------------2.提取MD5名稱------------------                jsonfile = filename + "\\report.json"                print(jsonfile)                with open(jsonfile) as fp:                    data = json.load(fp)                    print(data.keys())                count += 1    i += 1    print("Cape沙箱成功提取樣本特征數量:", count)


輸出結果如下圖所示,

  • dict_keys([‘statistics’, ‘CAPE’, ‘info’, ‘behavior’, ‘curtain’, ‘debug’, ‘deduplicated_shots’, ‘dropped’, ‘network’, ‘procdump’, ‘static’, ‘strings’, ‘suricata’, ‘target’, ‘procmemory’, ‘malfamily_tag’, ‘signatures’, ‘malscore’, ‘ttps’])

其次,定位target標簽中的name位置,提取文件對應的md5值,并對文件進行重新命名,復制到指定文件夾中。


#coding:utf-8#By:Eastmount CSDN 2023-04-10import csvimport reimport osimport jsonfrom jsonsearch import JsonSearchimport shutil
def getAllFiles(targetDir):    listFiles = os.listdir(targetDir)    return listFiles
#-------------------------1.判斷指定文件-----------------------------aptname = "AAAA"writename = aptname + "-Result"filenames = getAllFiles(aptname)#['203', '204', ...,'277', '278']
i = 0count = 0  #樣本數量while i    #判斷該文件夾中是否存在reports件夾 eg:Aggah\277\reports    filename = aptname + "\\" + filenames[i] + "\\reports"    print(filename)    if os.path.exists(filename):        #report.html report.json report.pdf summary-report.html        for n in os.listdir(filename):            if n=="report.json":                #----------------------2.提取MD5名稱------------------                jsonfile = filename + "\\report.json"                htmlfile = filename + "\\report.html"                print(jsonfile)                with open(jsonfile) as fp:                    data = json.load(fp)                    #print(data.keys())                    target = data["target"]                    #print(target)                                        #查找name對應的值                    jsondata = JsonSearch(object=target,mode='j')                    name = jsondata.search_all_value(key='name')                    md5 = name[0].split(".")[0]                    print(md5) #fb41ec1ea500beae2a7d5d373ebb906b.bin                                        #-----------------3.文件寫入--------------------                    if not os.path.exists(writename):                        os.mkdir(writename)                    fname = writename + "\\" + md5 + ".json"                    shutil.copy(jsonfile, fname)                    fname = writename + "\\" + md5 + ".html"                    shutil.copy(htmlfile, fname)                count += 1    i += 1    print("Cape沙箱成功提取樣本特征數量:", count)


運行結果如下圖所示:

最后,我們需要將每個Json文件的API特征提取到執行CSV數據集中。


五.Python提取Json文件API特征和時間序列

首先,我們在VS Code中下載一個折疊解析Json的工具,顯示report.json的結果如下圖所示:

其中,API特征位于“behavior”->“calls”處,接著提取“api”特征。

接著,撰寫代碼提取Json文件的API特征,利用JsonSearch庫實現,并且部分特征為空值,如下圖所示。

完整代碼如下:

#coding:utf-8#By:Eastmount CSDN 2023-04-10import csvimport reimport osimport jsonfrom jsonsearch import JsonSearchimport shutil
def getAllFiles(targetDir):    listFiles = os.listdir(targetDir)    return listFiles
apt = "AAAA"aptname = apt + "-Result"filenames = getAllFiles(aptname)print(len(filenames))
writename = apt + "_result.csv"fw = open(writename, mode="w", newline="")writer = csv.writer(fw)writer.writerow(['no', 'apt', 'md5', 'api'])
i = 0while i    #打開json文件    name = aptname + "\\" + filenames[i]    print(name)    api_str = ""    md5 = filenames[i].split(".")[0]    with open(name, encoding='utf-8') as fp:        #特征解析        data = json.load(fp)        behavior = data["behavior"]        jsondata = JsonSearch(object=behavior, mode='j')        api = jsondata.search_all_value(key="api")        print("特征數量:", len(api))        print(api)
        #特征存儲        k = 0        while k            value = str(api[k])            api_str += value + ";"            k += 1        else:            print("提取成功")            #print(api_str)    i += 1    #文件存儲    writer.writerow([str(i), apt, md5, api_str])    print("------------------------------")fw.close()


輸出結果如下圖所示:


六.總結

寫到這里這篇文章就結束,希望對您有所幫助。忙碌的四月,真的很忙,項目本子論文畢業,等忙完后好好寫幾篇安全博客,感謝支持和陪伴,尤其是家人的鼓勵和支持, 繼續加油!