<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>

    通過內存分析尋找依靠Cobalt Strike發生的攻擊

    VSole2022-12-22 10:40:07

    Unit 42研究人員檢查了幾個包含Cobalt Strike組件的惡意軟件樣本,并發現通過分析進程中關鍵執行工件可以捕獲這些樣本。

     cobalt strike(簡稱CS)是一款團隊作戰滲透測試神器,分為客戶端及服務端,一個服務端可以對應多個客戶端,一個客戶端可以連接多個服務端。它不僅在紅隊中流行,而且也被用于惡意目的。

    盡管該工具包只出售給受信任的組織進行安全測試,但由于源代碼泄露,它的各種組件不可避免地進入了攻擊者的武器庫,從勒索軟件組織到國家支持的攻擊組織。濫用Cobalt Strike的惡意軟件甚至在2020年臭名昭著的SolarWinds供應鏈攻擊事件發揮了作用。

    為什么是Cobalt Strike?

    Cobalt Strike之所以被如此廣泛的利用,主要是因為Cobalt Strike集成了端口轉發、掃描多模式端口Listener、Windows exe程序生成、Windows dll動態鏈接庫生成、java程序生成、office宏代碼生成,包括站點復制獲取瀏覽器的相關信息等。由于它的設計是從底層開始的,所以攻擊者會定期使用它引入新的規避技術。

    Cobalt Strike的主要優點之一是,一旦初始加載程序被執行,它主要在內存中運行。當有效負載是靜態防護的、僅存在于內存中并且拒絕執行時,這種情況會給檢測帶來問題。這對許多安全軟件產品來說都是一個挑戰,因為掃描內存絕非易事。

    在許多情況下,Cobalt Strike是在目標網絡中獲得初始足跡的自然選擇。攻擊者可以使用具有大量部署和混淆選項的構建器,根據可定制的模板創建最終有效負載。

    該有效負載通常以加密或編碼的形式嵌入到文件加載程序中。當受害者執行文件加載程序時,它將有效負載解密/解碼到內存中并運行它。由于有效負載以其原始形式存在于內存中,因此由于某些特定功能,可以很容易地檢測到它。

    作為惡意軟件研究人員,我們經常看到潛在的有趣的惡意樣本,結果只是Cobalt Strike的加載程序。通常也不清楚加載程序是由紅隊創建的還是真正的攻擊者創建的,因此使歸因更具挑戰性。

    接下來我們將深入研究三種不同的Cobalt Strike加載程序,它們是由我們設計的一個新的基于管理程序的沙箱檢測到的,該沙箱允許我們分析內存中的工件。每個示例加載不同的植入類型,即SMB、HTTPS和stager信標。我們將這些Cobalt Strike裝載程序稱為KoboldLoader, MagnetLoader和LithiumLoader。我們還將討論可以用來檢測這些有效負載的一些方法。

    KoboldLoader SMB信標

    以以下樣本為例

    SHA256: 7ccf0bbd0350e7dbe91706279d1a7704fe72dcec74257d4dc35852fcc65ba292

    這個64位KoboldLoader可執行文件使用各種已知的技巧來繞過沙盒,并使分析過程更加耗時。

    為了繞過只掛鉤高級用戶模式函數的沙盒,它只調用內置API函數。為了使分析人員的工作更加困難,它通過哈希而不是使用純文本字符串來動態解析函數。惡意軟件包含調用以下函數的代碼:

    該惡意軟件創建了兩個單獨的函數哈希/地址對表。一個表包含所有內置函數的一對,而第二個表只包含Nt*個函數對。

    對于所使用的Rtl*函數,它循環遍歷第一個表并搜索函數哈希以獲得函數地址。對于使用的Nt*函數,它遍歷第二個表并同時增加一個計數器變量。

    當找到哈希時,它將獲取計數器值,即相應內置函數的系統調用號,并輸入自定義系統調用存根。這有效地繞過了許多沙盒,即使掛接了較低級別的內置函數而不是高級函數。

    加載程序的整體功能相對簡單,并使用映射注入來運行負載。它生成Windows工具sethc.exe的子進程,創建一個新部分,并將解密的Cobalt Strike信標加載程序映射到其中。Cobalt Strike加載程序的最終執行是通過調用RtlCreateUserThread來加載SMB信標的。

    內存中的規避功能

    通過新的基于管理程序的沙盒,我們能夠在內存中檢測到解密的Cobalt Strike SMB信標。這個信標加載程序甚至使用了一些內存中的規避功能,創建了一種奇怪的嵌合體文件。雖然它實際上是一個DLL,但“MZ”神奇的PE字節和隨后的DOS標頭被一個小的加載程序shellcode覆蓋,如下圖所示。

    解密的Cobalt Strike SMB信標shellcode

    shellcode加載程序跳轉到導出的函數DllCanUnloadNow,該函數在內存中準備SMB信標模塊。為此,它首先加載Windows pla.dll庫,并清空代碼段(.text)中的一大塊字節。然后,它將信標文件寫入該blob并修復導入地址表,從而創建一個可執行內存模塊。

    在分析該文件的過程中,我們可以找出所使用的一些內存內規避功能,如下表所示。

    內存內規避功能

    總之,信標加載程序和信標本身是同一個文件。PE標頭的部分用于跳轉到導出函數的shellcode,該函數反過來在Windows DLL中創建自己的模塊。最后,shellcode跳轉到信標模塊的入口點,在內存中執行它。

    如上所述,我們沒有辦法成功檢測我們的KoboldLoader示例的信標,除非我們可以在執行過程中查看內存內部。

    MagnetLoader

    我們將研究的第二個加載程序是一個模仿合法庫的64位DLL。

    SHA256:6c328aa7e903702358de31a388026652e82920109e7d34bb25acdc88f07a5e0

    這個MagnetLoader示例試圖在一些方面看起來像Windows文件mscms.dll,通過使用以下類似的功能:

    相同的文件描述;

    一個具有許多相同函數名的導出表;

    幾乎相同的資源;

    一個非常相似的互斥鎖;

    這些功能也顯示在下圖中,其中惡意軟件文件與有效的mscml.dll進行了對比。

    MagnetLoader(左)和mscml.dll(右)的文件描述、導出表和資源的比較

    MagnetLoader不僅嘗試靜態地模擬合法的Windows庫,而且在運行時也如此。

    MagnetLoader的所有導出函數內部調用相同的主要惡意軟件例程。當調用其中一個時,首先運行DLL入口點。在入口點,惡意軟件加載原始的mscms.dll,并解析它所偽造的所有函數。

    這些原始函數的地址在執行偽方法后被存儲和調用。因此,每當調用MagnetLoader的導出函數時,它都會運行主惡意軟件例程,然后調用mscms.dll中的原始函數。

    主要的惡意軟件例程相對簡單。它首先創建了一個名為SM0:220:304:WilStaging_02_p1h的互斥體,看起來與mscms.dll創建的原始互斥體非常相似。

    Cobalt Strike信標加載程序被解密到內存緩沖區中,并在一個已知的技巧的幫助下執行。加載程序沒有直接調用信標加載程序,而是使用Windows API函數EnumChildWindows來運行它。

    該函數包含三個參數,其中一個是回調函數。惡意軟件可能濫用此參數,通過回調函數間接調用地址,從而隱藏執行流程。

    LithiumLoader

    最后一個Cobalt Strike示例是DLL側加載鏈的一部分,其中使用了一種安全軟件的自定義安裝程序。DLL側加載是一種劫持合法應用程序以運行獨立的惡意DLL的技術。

    SHA256: 8129 bd45466c2676b248c08bb0efcd9ccc8b684abf3435e290fcf4739c0a439f

    這個32位的LithiumLoader DLL是由攻擊者自定義創建的Fortinet VPN安裝包的一部分,該安裝包以FortiClientVPN_windows.exe (SHA256: a1239c93d43d657056e60f6694a73d9ae0fb304cb6c1b47ee2b38376ec21c786)的形式提交給VirusTotal。

    FortiClientVPN_windows.exe文件不是惡意的或被破壞的。由于該文件是簽名的,攻擊者利用它來逃避反病毒檢測。

    安裝程序是一個自解壓縮RAR存檔,包含以下文件:

    FortiClientVPN_windows.exe文件內容

    自解壓腳本命令如下:

    自解壓腳本命令列表

    當安裝程序運行時,所有文件都會被無聲地放到本地%AppData%文件夾中,兩個可執行文件都會啟動。當FortiClient VPN安裝程序執行時,WinGup工具側加載libcurl.dll LithiumLoader惡意軟件。惡意軟件之所以這樣做,是因為它從libcurl庫的合法副本中導入了以下函數,如下圖所示:

    導入WinGup.exe的地址表

    此威脅還試圖通過PowerShell將%AppData%文件夾路徑添加到Windows防御器中的排除列表中。

    在啟動GUP.exe時,惡意的libcurl.dll文件被加載到進程空間中,因為它靜態地導入上圖所示的函數。雖然所有四個libcurl函數都在運行,但只有curl_easy_cleanup包含在編譯庫的新版本時注入的惡意例程。因此,我們不是在處理合法DLL的打了補丁的版本。這是一種更干凈的解決方案,不會像在其他惡意軟件中經常看到的那樣,在插入惡意程序后破壞代碼。

    這個curl_easy_cleanup函數通常只包含一個子例程(Curl_close),并且沒有返回值(如其在GitHub上的源代碼所示)。修改后的函數如下圖所示。

    修改了libcurl.dll的curl_easy_cleanup導出函數

    load_shellcode函數通過XOR和密鑰0xA解密shellcode,如下圖所示。

    Shellcode加載程序函數load_shellcode()

    這個函數通過EnumSystemGeoID間接運行Cobalt Strike階段shellcode,而不是直接跳轉到它。這個Windows API函數有三個參數,最后一個參數是一個被LithiumLoader濫用的回調函數。

    Cobalt Strike stager shellcode是從Metasploit借來的,是反向的HTTP外殼負載,它使用以下API函數:

    shellcode連接到以下URL,其中包含泰國一所大學的IP地址

    LithiumLoader檢測問題

    在本文發布時,Cobalt Strike信標的有效負載已不再可用。如果API調用的執行報告中沒有有效負載或任何可操作的信息,沙盒通常很難確定樣本是否惡意。這個示例本身沒有任何可以被歸類為惡意的功能。

    通過內存分析尋找Cobalt Strike

    在這三個例子中都存在一些常見的檢測挑戰。這些示例不能在正常的沙盒環境中執行。但是正如我們所討論的,如果我們在執行期間查看內存內部,就可以使用大量的信息進行檢測,比如函數指針、已解碼的加載程序階段和其他工件。

    為了準確地檢測,研究人員發現解決高度規避惡意軟件的一個關鍵功能是,除了使用系統API更好地理解所發生的事情外,還需要在執行樣本時查看內存。

    研究人員發現,在惡意軟件檢測中,查看執行關鍵點的內存增量,以提取有意義的信息和工件是很有用的。當我們的系統處理大量的樣本時,要實現大規模的工作有很多挑戰。接下來,我們將詳細介紹目前從內存中收集的一些主要類型的數據,以幫助檢測。盡管我們在本文介紹的是通過內存方法,但我們絕不是說檢測和記錄API調用對檢測沒有用。

    自動有效負載提取

    如上所述,惡意軟件開發者混淆其有效負載越來越普遍。雖然使用可執行打包器可以壓縮和模糊文件來實現這一點并不新鮮,但當它與逃避策略結合使用時就會出現問題,因為沒有對準確檢測有用的靜態或動態數據。

    編碼、壓縮、加密或下載額外的執行階段的策略有無限的組合。為這些有效負載制作簽名的能力顯然是分析師能夠從Cobalt Strike等框架中捕獲大量不同惡意軟件組件的重要方式。如果我們能在內存中捕捉到它們,那么惡意軟件最終決定不執行也無所謂。

    下面簡化圖顯示了我們可能在兩個階段中看到的示例,這些階段在初始可執行文件中從未出現過。

    可以在打包的惡意軟件可執行文件中看到的典型階段

    在圖的左側,我們看到了一個shellcode階段的示例。盡管“shellcode”一詞最初是為利用漏洞在目標系統上彈出外殼而手工制作的程序集而創造的,但該詞已演變為包含任何為惡意目的編寫的自定義程序集。一些惡意軟件階段是沒有可識別的可執行結構的自定義程序集。惡意軟件開發者采用這種方法的常見模式是將所有函數指針動態解析到一個表中,以便于訪問。

    在圖的右側,我們看到后期是一個格式良好的可執行文件的示例。一些惡意軟件階段或有效負載是格式良好的可執行文件。這些可以由OS通過系統API加載,或者惡意軟件開發者可能會使用他們自己的PE加載程序,如果他們試圖隱蔽地避免調用任何API來為他們加載。

    函數指針數據

    我們可以從內存中提取的另一組用于檢測的豐富數據是動態解析函數指針,如下圖所示。惡意軟件的開發者很久以前就知道,如果他們顯式地調用他們計劃在導入表中使用的所有WINAPI函數,它就會被用來對付他們。現在的標準做法是隱藏惡意軟件或其任何階段將使用的功能。

    Shellcode哈希是另一種常見的隱蔽策略,用于解析函數的指針而不需要它們的字符串。

    可能在內存段中看到的動態解析WINAPI指針示例

    在Advanced WildFire中,我們已經開始有選擇地搜索和使用在我們的檢測邏輯中解析了哪些WINAPI函數指針的信息。

    操作系統結構修改

    研究人員從分析內存中發現的另一個有用的檢測數據來源是尋找對Windows記賬結構的任何更改(惡意軟件開發者喜歡混淆這些!)。這些結構對于OS維護進程的狀態非常重要,例如加載了哪些庫、加載了可執行映像的位置以及OS稍后可能需要了解的進程的其他各種特征。考慮到這些字段中的許多都不應該被修改,跟蹤惡意軟件樣本何時以及如何操作它們通常很有用。

    下圖顯示了示例如何從LDR模塊列表中卸載它加載的模塊。取消查找模塊意味著不再存在該模塊存在的記錄。例如,這樣做之后,Windows中的任務管理器將不再列出它。

    此圖僅是研究人員所看到的許多不同的OS結構修改中的一種,但它表明有許多不同類型的OS結構更改對惡意軟件檢測問題有用。

    如何將模塊從LDR模塊列表中解關聯的示例

    頁面權限

    最后,檢測數據的另一個有用來源是對頁面權限所做的所有更改的完整日志。打包惡意軟件的開發者通常需要更改內存權限,以便正確加載和執行進一步的階段。了解哪些內存頁的權限發生了更改,通常可以提供有關代碼加載和執行位置的重要見解,這對檢測非常有用。

    總結

    盡管Cobalt Strike已經存在多年,但檢測它對許多安全軟件提供商來說仍然是一個挑戰。這是因為該工具主要在內存中工作,不太接觸磁盤。

    本文介紹了三種新的加載程序,并展示了如何使用各種技術檢測它們,這些檢測技術在新的基于管理程序的沙盒中可用。

    函數調用功能分析
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    寫一個android中so文件反混淆的系列文章,目前這是第三篇。根據其他人的分析可知,libDexHelper.so是指令抽取的實現,libdexjni.so是VMP的實現。在android so文件攻防實戰-百度加固免費版libbaiduprotect.so反混淆中我們是交叉引用拿到加密后的字符串和它對應的解密函數的表然后frida主動調用得到的解密后的字符串,但是在這里這個方法就不太好用了。
    概述在windows系統上,涉及到內核對象的功能函數,都需要從應用層權限轉換到內核層權限,然后再執行想要的內核函數,最終將函數結果返回給應用層。本文就是用OpenProcess函數來觀察函數從應用層到內核層的整體調用流程。OpenProcess函數,根據指定的進程ID,返回進程句柄。NTSTATUS Status; //保存函數執行狀態。OBJECT_ATTRIBUTES Obja; //待打開對象的對象屬性。HANDLE Handle; //存儲打開的句柄。CLIENT_ID ClientId; //進程、線程ID. dwDesiredAccess, //預打開進程并獲取對應的權限。ObjectNamePresent = ARGUMENT_PRESENT ; //判斷對象名稱是否為空
    關于堆棧ShellCode操作:基礎理論002-利用fs寄存器尋找當前程序dll的入口:從動態運行的程序中定位所需dll003-尋找大兵LoadLibraryA:從定位到的dll中尋找所需函數地址004-被截斷的shellCode:加解密,解決shellCode的零字截斷問題
    反射式DLL注入實現
    2022-05-13 15:59:21
    反射式dll注入與常規dll注入類似,而不同的地方在于反射式dll注入技術自己實現了一個reflective loader()函數來代替LoadLibaryA()函數去加載dll,示意圖如下圖所示。藍色的線表示與用常規dll注入相同的步驟,紅框中的是reflective loader()函數行為,也是下面重點描述的地方。
    該漏洞發生的位置是在驅動文件Win32k.sys中的xxxHandleMenuMessage函數,產生的原因是沒有對該函數中調用的xxxMNFindWindowFromPoint函數的返回值進行合法性驗證,直接將其作為參數傳遞給后面的xxxSendMessage函數調用,從而造成了提權漏洞。
    Win32k組件最初的設計和編寫是完全建立的用戶層上的,但是微軟在 Windows NT 4.0 的改變中將 Win32k.sys 作為改變的一部分而引入,用以提升圖形繪制性能并減少 Windows 應用程序的內存需求。窗口管理器(User)和圖形設備接口(GDI)在極大程度上被移出客戶端/服務端運行時子系統(CSRSS)并被落實在它自身的一個內核模塊中。
    結構&拷貝與引用
    2023-05-10 11:27:04
    結構&拷貝與引用開始之前,我們約定數據塊也叫插槽,也就是storage。storage是永久存儲在區塊鏈上的地方。Stack 的最大深度為 1024 個元素,支持 256 位的字長。結構當定義局部變量時,它存儲在內存中,然后壓入堆棧以執行。1024棧深簡介EVM不是寄存器機而是堆棧機,所以所有的計算都在稱為堆棧的數據區域上進行。1024 是一個非常保守的值,以盡可能安全EVM 的設計方式往往會使更大的堆棧變得無用。EVM 只能訪問堆棧中前16個slot。
    可是當我們開啟了smap保護之后,內核態就沒有辦法訪問用戶態的數據,此時當我們再hijack tty_operation到我們的用戶態時,我們的kernel就會panic,更別說劫持執行流到用戶態上執行rop了。當我們調用msgsnd時,在linux內核中會調用do_msgsnd。
    本篇針對該JS中的字符串混淆進行還原。字符串是如何混淆的解密方式想要對字符串反混淆就要先分析該樣本是如何對字符串進行混淆的。而處于全局作用域的_0x1f1a68實際上也是對另一個函數的調用。
    當線程從等待狀態蘇醒后,會自動檢測自己得APC隊列中是否存在APC過程。所以只需要將目標進程的線程的APC隊列里面添加APC過程,當然為了提高命中率可以向進程的所有線程中添加APC過程。然后促使線程從休眠中恢復就可以實現APC注入。往線程APC隊列添加APC,系統會產生一個軟中斷。第二個參數表示插入APC的線程句柄,要求線程句柄必須包含THREAD_SET_CONTEXT訪問權限。第三個參數表示傳遞給執行函數的參數。如果直接傳入shellcode不設置第三個函數,可以直接執行shellcode。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类