<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    用 Speakeasy 模擬惡意 Shellcode

    安全俠2020-08-27 10:13:03

    為了能夠大規模仿真惡意軟件樣本,我們通過Speakeasy仿真框架。Speakeasy旨在使非惡意軟件分析人員的用戶能夠盡可能輕松地自動獲取分類報告,并使工程師能夠編寫自定義插件來分類惡意軟件。

    Speakeasy最初是為了模擬Windows內核模式的惡意軟件而創建的,現在也支持用戶模式示例。該項目的主要目標是針對x86和amd64平臺進行動態惡意軟件分析的Windows操作系統的高分辨率仿真。存在類似的仿真框架來仿真用戶模式二進制文件。Speakeasy嘗試通過以下方式與其他仿真框架區分開來:

    • 專為模擬Windows惡意軟件而設計
    • 支持內核模式二進制文件的仿真,以分析難以分類的rootkit
    • 由當前惡意軟件趨勢推動的仿真和API支持,為社區提供了無需額外工具即可提取危害指標的方法
    • 完全可配置的仿真環境,無需其他代碼

    該項目當前支持內核模式驅動程序,用戶模式Windows DLL和可執行文件以及shellcode。可以自動模擬惡意軟件樣本,并生成報告供以后進行后期處理。正在進行的項目目標將是繼續增加對新的或流行的惡意軟件家族的支持。

    在此博客文章中,我們將展示一個Speakeasy在從在線惡意軟件集合中獲取的Cobalt Strike Beacon示例中自動提取網絡指標的有效性示例。

    背景

    Windows惡意軟件的動態分析一直是惡意軟件分析過程中的關鍵步驟。了解惡意軟件如何與Windows API交互以及提取有價值的基于主機和基于網絡的危害指標(IOC)對于評估惡意軟件對受影響的網絡的影響至關重要。通常,以自動化或有針對性的方式執行動態分析。惡意軟件可以排隊等待在沙盒中執行以監視其功能,也可以手動進行調試以顯示沙盒運行期間未執行的代碼路徑。

    過去,代碼仿真一直用于測試,驗證甚至是惡意軟件分析。能夠模擬惡意代碼可從手動和自動分析中獲得許多好處。CPU指令的仿真允許對二進制代碼進行全面檢測,在此過程中,可以影響控制流以最大程度地覆蓋代碼。在仿真時,可以監視和記錄所有功能,以便快速提取危害或其他有用情報的指標。

    與在管理程序沙箱中執行相比,仿真具有一些優勢。關鍵優勢是降低噪音。在仿真時,唯一可以記錄的活動是由惡意軟件作者編寫的,或者是在二進制文件中靜態編譯的。虛擬機管理程序中的API掛鉤(尤其是從內核模式的角度來看)可能很難歸因于惡意軟件本身。例如,沙箱解決方案通常會在不知道惡意軟件作者是否打算分配內存,還是由較低級別的API負責內存分配的情況下掛接堆分配器API調用。

    但是,仿真也有缺點。由于我們要從分析階段中刪除操作系統,因此,作為仿真器,我們現在負責提供API調用和仿真期間發生的內存訪問的預期輸入和輸出。為了成功地模擬預期在合法Windows系統上運行的惡意軟件樣本,這需要大量的精力。

    Shellcode作為攻擊平臺

    通常,shellcode是使攻擊者在受感染的系統上保持隱身的絕佳選擇。Shellcode在可執行內存中運行,不需要磁盤上的任何文件進行備份。這使攻擊者代碼可以輕松隱藏在大多數形式的傳統法醫分析無法識別的內存中。必須首先確定裝入shellcode的原始二進制文件,或者必須從內存中轉儲shellcode本身。為了避免檢測,可將shellcode隱藏在出現的良性加載程序中,然后注入到另一個用戶模式進程中。

    在本博客系列的第一部分中,我們將展示在事件響應調查期間遇到的一種較為常見的Shellcode惡意軟件樣本中進行仿真的有效性。Cobalt Strike是一個商業滲透測試框架,通常使用階段程序來執行其他代碼。分段器的一個示例是通過HTTP請求下載其他代碼并執行HTTP響應數據的分段器。在這種情況下,數據是shellcode,通常以解碼循環開始,然后是有效的PE,該PE包含反射性地加載自身的代碼。對于Cobalt Strike,這意味著它可以從可執行標頭的開頭執行,并將自身加載到內存中。在“鈷打擊”框架內,這種情況下的有效載荷通常是稱為信標的植入物。信標被設計為駐留在內存中的后門,用于在受感染的Windows系統上維護命令和控制(C2)。它是使用Cobalt Strike框架構建的,無需進行任何代碼修改,并且可以輕松構建以使其核心功能以及命令和控制信息得到修改。

    所有這些使攻擊者能夠在受感染的網絡上快速構建和部署新的信標植入變體。因此,有必要使用一種工具來快速提取Beacon的可變組件,并且理想情況下,它不需要惡意軟件分析師的寶貴時間。

    Speakeasy設計

    Speakeasy當前使用基于QEMU的仿真器引擎Unicorn來仿真x86和amd64體系結構的CPU指令。Speakeasy旨在將來通過抽象層支持任意仿真引擎,但目前依賴Unicorn。

    分析所有樣本可能總是需要使用完整的操作系統沙箱來進行分析,因為通常情況下模擬所有Windows都是不可行的。沙箱可能難以按需擴展,并且可能很費時間來運行樣本。但是,通過確保我們模擬特定的惡意軟件家族(例如本例中的Beacon),我們可以快速減少反向工程變體的需求。能夠以自動化方式生成高級分類報告通常是對惡意軟件變體所需要的所有分析。這使惡意軟件分析人員有更多時間專注于可能需要更深入分析的樣本。

    Shellcode或Windows PE被加載到模擬地址空間中。在嘗試模擬惡意軟件之前,創建了有助于Windows內核模式和用戶模式的基本模擬所需的Windows數據結構。進程,驅動程序,設備和用戶模式庫是“偽造的”,以便為惡意軟件提供逼真的執行環境。惡意軟件將能夠與模擬文件系統,網絡和注冊表進行交互。所有這些仿真子系統都可以使用提供給每個仿真運行的配置文件進行配置。

    Windows API由Python API處理程序處理。這些處理程序將嘗試模擬這些API的預期輸出,以便惡意軟件樣本將繼續其預期的執行路徑。在定義API處理程序時,所需要做的就是API的名稱,API期望的參數數量以及可選的調用約定規范。如果未提供調用約定,則假定為stdcall。當前,如果嘗試了不支持的API調用,則Speakeasy將記錄不受支持的API并繼續到下一個入口點。圖1顯示了由kernel32.dll導出的Windows HeapAlloc函數的示例處理程序。


    圖1:Windows HeapAlloc函數的示例處理程序

    默認情況下模擬所有入口點。例如,對于DLL,將模擬所有導出,對于驅動器,將分別模擬IRP主要功能。此外,還會跟蹤在運行時發現的動態入口點。動態入口點的一些示例包括創建的線程或注冊的回調。在嘗試確定惡意軟件感染的影響時,將活動歸因于特定的入口點對于查看整個圖片至關重要。

    報告中

    當前,模擬器捕獲的所有事件均被記錄并由JSON報告表示,以便于后期處理。該報告包含在仿真過程中記錄的關注事件。像大多數模擬器一樣,所有Windows API調用都與參數一起記錄。仿真所有入口點并為其標記相應的API列表。除了API跟蹤外,還會調用其他特定事件,包括文件,注冊表和網絡訪問。所有已解碼或“內存駐留”的字符串都將轉儲并顯示在報告中,以揭示在靜態字符串分析中找不到的有用信息。圖2顯示了Speakeasy JSON報告中記錄的文件讀取事件的示例。


    圖2:Speakeasy報告中的文件讀取事件

    速度

    因為該框架是用Python編寫的,所以速度是一個明顯的問題。Unicorn和QEMU用C編寫,提供了非常快的仿真速度。但是,我們編寫的API和事件處理程序使用Python。本機代碼和Python之間的轉換非常昂貴,應盡量減少。因此,目標是僅在絕對必要時才執行Python代碼。默認情況下,我們在Python中處理的唯一事件是內存訪問異常或Windows API調用。為了捕獲Windows API調用并在Python中模擬它們,導入表中摻雜了無效的內存地址,因此我們僅在訪問導入表時才切換到Python。當shellcode訪問惡意軟件的模擬地址空間中加載的DLL的導出表時,將使用類似的技術。

    內存管理

    Speakeasy在模擬器引擎的內存管理之上實現了輕量級的內存管理器。跟蹤并標記由惡意軟件分配的每個內存塊,以便可以獲取有意義的內存轉儲。能夠將活動歸因于特定的內存塊對于分析人員而言非常有用。記錄對敏感數據結構的內存讀寫可以揭示API調用記錄未揭示的惡意軟件的真實意圖,這對于rootkit等樣本尤其有用。

    Speakeasy提供了可選的“內存跟蹤”功能,該功能將記錄樣本展示的所有內存訪問。這將記錄所有讀取,寫入和執行到內存。由于仿真器標記了所有分配的內存塊,因此有可能從該數據中收集更多上下文。如果惡意軟件鉤住關鍵數據結構或將執行轉移到動態映射的內存,這將被揭示出來,對于調試或歸因很有用。但是,此功能的成本很高,并且默認情況下未啟用。

    呈現給惡意軟件的模擬環境包括Shellcode用于定位和執行導出的Windows系統功能的通用數據結構。為了調用Win32 API,必須解析導出的函數,從而對目標系統產生有意義的影響。在大多數情況下(包括信標),這些功能是通過遍歷過程環境塊(通常稱為PEB)來定位的。Shellcode可以從PEB訪問進程的虛擬地址空間內所有已加載模塊的列表。

    圖3顯示了通過模擬Beacon shellcode示例生成的內存報告。在這里,我們可以跟蹤在PEB上行走的惡意軟件,以查找kernel32.dll的地址。然后,該惡意軟件手動解析并調用“ VirtualAlloc” API的函數指針,然后繼續進行解碼并將其自身復制到新緩沖區中,以進行執行。


    圖3:內存跟蹤報告

    配置

    Speakeasy高度可配置,并允許用戶創建自己的“執行配置文件”。可以指定不同的分析級別,以優化各個用例。最終目標是允許用戶在不更改代碼的情況下輕松切換配置選項。當前,配置文件的結構為JSON文件。如果用戶未提供配置文件,則框架將提供默認配置。各個字段記錄在Speakeasy項目中。

    圖4顯示了網絡仿真器配置子部分的代碼片段。在這里,用戶可以指定在進行DNS查找時返回哪些IP地址,或者在某些信標示例的情況下,指定在TXT記錄查詢期間返回哪些二進制數據。HTTP響應也配置了自定義響應。


    圖4:網絡配置

    許多HTTP登臺者都會使用HTTP GET請求來檢索Web資源。通常,例如使用Cobalt Strike或Metasploit分級機時,此緩沖區將立即執行,以便可以開始執行下一個階段。可以使用Speakeasy配置輕松配置此響應。在圖4的配置中,除非被覆蓋,否則框架將提供引用的default.bin文件中包含的數據。該文件當前包含調試中斷指令(int3),因此,如果惡意軟件嘗試執行數據,它將退出并記錄在報告中。使用此工具,我們可以輕松地將惡意軟件標記為可下載其他代碼的下載器。還存在用于文件系統和注冊表仿真的配置字段。

    局限性

    如前所述,仿真帶來了一些挑戰。與正在仿真的系統保持功能均等是一場持續的戰斗。但是,它提供了控制惡意軟件和更多自省選項的獨特機會。

    在仿真未完全完成的情況下,仍然可以生成仿真報告和內存轉儲,以收集盡可能多的數據。例如,后門可能會成功安裝其持久性機制,但無法連接到其C2服務器。在這種情況下,仍會記錄有價值的基于主機的指標,并且可以為分析師提供價值。

    可以快速輕松地將缺少的API處理程序添加到仿真器中,以處理這些情況。對于許多API處理程序而言,僅返回成功代碼就足以使惡意軟件繼續執行。雖然不可能對每個惡意軟件進行完全仿真,但是針對特定惡意軟件家族的功能可以極大地減少反向工程相同家族變種的需求。

    用法

    現在可以在我們的GitHub上使Speakeasy 。它可以使用隨附的Python安裝程序腳本安裝,也可以使用提供的Dockerfile安裝在Docker容器中。它與平臺無關,可用于在Windows,Linux或MacOS上模擬Windows惡意軟件。可以在項目的README上找到更多信息。

    安裝后,Speakeasy可以用作獨立庫,也可以使用提供的run_speakeasy.py腳本直接調用。
    包含的腳本旨在模擬單個樣本,并使用記錄的事件生成JSON報告。圖5顯示了run_speakeasy.py的命令行參數。


    圖5:run_speakeasy.py的命令行參數

    Speakeasy還提供了豐富的開發和掛鉤界面,用于編寫自定義插件。這將在以后的博客文章中更詳細地介紹。

    模擬信標植入

    對于此示例,我們將仿真Shellcode,該Shellcode解碼并執行Beacon植入程序變體,該變體的SHA-256哈希值為7f6ce8a8c2093eaf6fea1b6f1ef68a957c1a06166d20023ee5b637b5f7838918。我們首先驗證樣本的文件格式。預期該示例將由加載程序啟動,或用作漏洞有效負載的一部分。


    圖6:惡意軟件的十六進制轉儲示例

    在圖6中,我們可以清楚地看到該文件不是PE文件格式。看到許多shellcode示例的分析人員可能會注意到前兩個字節:“ 0xfc 0xe8”。這些字節反匯編為intel匯編指令“ cld”和“ call”。“ cld”指令是放置獨立的shellcode的常見前奏,因為它將清除方向標志,從而使惡意軟件可以輕松地分析系統DLL導出表中的字符串數據。shellcode通常使用以下調用指令,通過在其后跟隨“ pop”指令來獲取其當前程序計數器。這使惡意軟件可以從內存中發現其執行位置。

    由于我們可以肯定地確定此樣本是shellcode,因此我們將使用圖7所示的命令行調用Speakeasy。


    圖7:用于模擬惡意軟件示例的命令行

    這將指示Speakeasy將偏移量為零的樣本模擬為x86 shellcode。注意:即使我們正在仿真代碼而不實際執行代碼,它們仍然是攻擊者生成的二進制文件。在使用任何本機CPU仿真引擎發現漏洞的情況下,在虛擬機中仿真惡意代碼仍然是明智的選擇。

    仿真后,將生成一個名為“ report.json”的報告。此外,還將壓縮仿真環境的完整內存轉儲并將其寫入“ memory_dump.zip”。該惡意軟件將被加載到假容器過程內部的模擬內存中,以模擬shellcode預期在其中運行的真實執行環境。一旦開始模擬,模擬的API調用將連同其參數和返回值一起記錄到屏幕上。圖8顯示了Beacon示例,該示例分配了一個新的內存緩沖區,它將在其中復制自身。然后,該惡意軟件開始手動解決它需要執行的導出。


    圖8:網絡配置

    經過額外的解碼和設置后,惡意軟件嘗試連接到其C2服務器。在圖9中,我們可以看到使用Wininet庫的惡意軟件使用HTTP連接和讀取了C2服務器中的數據。


    圖9:Wininet API調用以連接到C2

    惡意軟件將無限循環,直到從C2服務器接收到期望的數據為止。Speakeasy將在預定時間后超時并生成JSON報告。


    圖10:網絡C2事件

    在生成的報告的“ network_events”和“ traffic”部分中匯總了網絡指標。在圖10中,我們可以看到IP地址,端口號,在這種情況下,還可以看到與惡意軟件建立的連接相關的HTTP標頭。

    在此示例中,當我們模擬示例時,我們指示Speakeasy創建模擬地址空間的內存轉儲。將為每個內存分配及其周圍的上下文創建一個ZIP存檔。該上下文包括基址,大小和由仿真器分配的標簽,以標識內存分配對應的內容。圖11顯示了在仿真過程中創建的內存轉儲文件的片段。文件名包含與每個內存分配關聯的標簽和基址。


    圖11:通過仿真獲得的單個存儲塊

    如果僅在這些內存轉儲上運行字符串,我們可以快速找到有趣的字符串以及Beacon配置數據,如圖12所示。


    圖12:惡意軟件的配置字符串數據

    在分類分析中,我們可能僅關心已知家族的惡意軟件變體的危害指標。但是,如果需要對樣本進行完全反向工程,我們還可以DLL形式恢復Beacon惡意軟件的解碼版本。通過簡單地對“ MZ”魔術字節執行原始grep,我們發現唯一的問題是與原始樣本分配有關的內存轉儲以及惡意軟件將自身復制到的虛擬分配緩沖區(圖13)。


    圖13:包含已解碼惡意軟件的內存轉儲

    如果我們查看原始shellcode緩沖區中的字節,我們可以看到它在被復制之前已被解碼,并且位于內存中,準備以偏移量0x48進行轉儲。現在,我們可以成功地將解碼后的Beacon DLL加載到IDA Pro中進行全面分析(圖14)。


    圖14:已解碼的惡意軟件已成功加載到IDA Pro中

    結論

    在此博客文章中,我們演示了如何使用Speakeasy仿真框架自動對Beacon惡意軟件樣本進行分類。我們使用它來發現有價值的網絡指示器,從內存中提取其配置信息,并獲取已解碼的Beacon DLL進行進一步分析。

    beacon仿真軟件
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    本次工作中,我們利用各種不同的攻擊場景評估EDR和其他端點安全方案在APT檢測及阻止方面的效率。但無論如何這項工作不應作為任何特定EDR方案的安全投資指南。事實上,定制EDR規則可能會顯著改變他們的作用。由于并不只依靠特征值,所以EDR也能夠檢測未知威脅,并在產生破壞之前阻止他們。
    是一套用于對域名進行偵察的工具。該程序會檢查 SPF 和 DMARC 記錄中是否存在允許欺騙的弱配置。用于發現計算機網絡上的主機和服務,從而構建網絡的“地圖”。自動滲透測試偵察掃描儀。不受 API 限制,因為它使用 Selenium 檢測瀏覽器。輸出報告以幫助關聯跨站點的目標。是一個 python 腳本,它檢查電子郵件帳戶是否在數據泄露中受到損害,如果電子郵件帳戶受到損害,它會繼續查找受損害帳戶的密碼。LinkedIn 枚舉工具,通過搜索引擎抓取從組織中提取有效員工姓名。
    為了能夠大規模仿真惡意軟件樣本,我們通過Speakeasy仿真框架。Speakeasy旨在使非惡意軟件分析人員的用戶能夠盡可能輕松地自動獲取分類報告,并使工程師能夠編寫自定義插件來分類惡意軟件。 Speakeasy最初是為了模擬...
    如果成功連接到管道, 使用WriteFile函數將shellcode數據寫入已連接的命名管道。使用IDA分析檢查導出函數:第一個是反射式DLL注入,限于篇幅,在本篇中不展開分析第二個是DLL的入口函數。在后續的文章中,會根據檢測特征和csprofile的繞過按照專題進行分析。同時,大部分的CS檢測特征都是在此。而在后續的文章分析中,將會著重的分析CS beacon中使用到的幾種DLL注入方式;beacon config的檢測;同時結合CS profile 的配置,研究一下CS的對抗檢測方式。
    從零開始開發CS beacon
    2021-12-21 16:01:20
    因為我也才學golang,基本面向github編程,在網上只找到python版加解密的方式,所以需要翻譯成go語言。
    Beacon 通常是反射加載到內存中,還可以配置各種內存中混淆選項以隱藏其有效負載。 Beacon 可以配置各種內存中混淆選項以隱藏其有效負載。例如,obfuscate-and-sleep 選項會試圖在回調之間屏蔽部分 Beacon 有效負載,以專門避開基于特征的內存掃描。
    Beacon 通常是反射加載到內存中,還可以配置各種內存中混淆選項以隱藏其有效負載。Beacon 可以配置各
    SMB Beacon 與命名管道在 Windows 中,無管理員權限的情況下,即無法添加白名單。定義特定版本的協議的消息數據包集稱為方言。進行身份驗證后,用戶可以訪問服務器上不受共享級別安全性保護的所有共享。
    CobaltStrike ShellCode詳解
    2022-08-04 16:51:50
    接下來就是重點了,加載起來的這段shellcode開頭先將DF標志位置0,這里為什么這樣做后面會提到。
    微軟社區網友 LiCaoZ 發文表示,自 8 月 19 日 11 時起,包括必應搜索在內的部分 Microsoft 服務受到了部分地區中國移動省份網關屏蔽,流向 Microsoft 數據中心節點的數據包會在經過省份網關時被丟棄。
    安全俠
    暫無描述
      亚洲 欧美 自拍 唯美 另类