魯大師檢測內存條好壞:內存檢測工具哪個好

背景

2021年8月BeaconEye項目發布,這是一個基於CobaltStrike內存特徵進行檢測的威脅狩獵工具。BeaconEye具有優秀的檢出率與檢測效率,使大多數已有規避技術無效化,在網路安全圈內掀起了關於CS內存攻防的新一輪討論熱潮。

為何BeaconEye切中要害

BeaconEye能夠掃描運行中的程序或 Minidump中的程序,識別出被Beacon注入的進程,並以上帝視角窺視其內部行為。

· 提取Beacon配置

· 獲取執行命令的返回結果

· 檢測使用了sleep_mask功能的Beacon

BeaconEye利用對解密後配置特徵值進行匹配,簡單的幾行規則便將無數隱匿手段斬於馬下,達到這種令人瞠目結舌的效果並非一日之功。能在攻擊技術與檢測技術都高度內卷的今天一枝獨秀則源於兩點:

1. 將Beacon Config作為特徵匹配對象

2. 將堆作為內存掃描的對象

阿喀琉斯之踵-Beacon Config

Beacon Config存儲了Beacon運行時的配置信息包含了C2配置,通訊參數,內存隱匿方式等重要信息。這些配置數據以典型的TLV格式來組織,偏移與內容相對固定,因而這些敏感信息非常易於根據特徵被提取與解析。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

使用分析工具從Beacon二進位中提取的配置信息

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

Becon執行流程的兩次解密過程

Beacon默認加密存儲於載入器中,執行時釋放到堆內存空間中。無論何種加密方式,解密後的配置將一直存在,即便開啟sleepmask功能也僅會對代碼段進行保護。無論採用何種加解密方式,最終Beacon Config都將裸露於堆內存中,這便是Beacon Config的死門,也是BeaconEye針對堆進行掃描的原因。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

BeaconEye中內置的yara規則

近期Tom Bonner研究在推特披露,Beacon Config中除了包含諸如域名/IP等關於Teamserver的情報之外,還包含了每個攻擊者獨一無二的身份水印信息。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

CobaltStrike服務端源碼中嵌入水印信息的部分

當Teamserver解析c2profile嵌入二進位中時,將從c2profile中讀取名為self,記錄著Teamserver文件哈希的值。對於大部分使用重編譯的方式對CobaltStrike進行破解修改的攻擊者來說,這個泄露的文件哈希可能暴露樣本歸屬信息。研究者對一些在野樣本中Beacon Config包含的Teamserver哈希進行了有效的分析聚類,更加精確地對在野攻擊利用進行追蹤分類。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

研究員利用Beacon Config的水印信息進行歸因聚類

奇招迭出,致盲BeaconEye

從BeaconEye的原理出發,規避掃描無非三種思路:

1. 規避BeaconEye的內存掃描,讓它掃不到自己

2. 尋找內置yara規則的漏洞,繞過匹配

3. 徹底修改Beacon配置的數據結構

第三種方法無疑是最治標又治本的,但也是攻擊成本最大的方案,接下來要介紹的兩種BeaconEye繞過方法皆是前兩種思路,以最小代價多快好省地繞過BeaconEye。

利用數據類型差異「修改1位元組」繞過yara規則

TeamServer與Becon DLL中表示Type的數據類型長度不一致,導致其中存在數據Gap,可填充為任意數據繞過yara規則。通過這種方式可以實現所謂的「修改1位元組繞過BeaconEye」。

以32位Beacon為例:

在TeamServer的Java代碼中使用長度為4 byte的Int類型來表示type,而在Beacon DLL中實際使用的只有前兩位 byte。因此下圖紅框區域的數據可任意填充而在不影響Beacon功能的情況下實現BeaconEye的繞過。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

利用堆遍歷演算法缺陷躲過內存掃描

BeaconEye所檢測的Beacon Config數據存在於堆中,因而BeaconEye的有效性非常依賴對堆的掃描。舊版本BeaconEye存在堆塊掃描不全的問題,究其根源是使用了NtQueryVirtualMemory函數進行堆的枚舉。使用該函數獲得的堆大小存在天然的缺陷:只會計算屬性一致的內存頁,而實際上堆段中的內存屬性是不同且不連貫的。這導致BeaconEye在獲取堆信息時實際只獲取了第一個堆段的內容。但是這種問題並不一定會觸發,而是有特定的觸發條件。

通過調用SymInitialize函數或反覆調用HeapAlloc等方式,可手動造成Beacon 配置存在於BeaconEye無法掃描的堆段的情況。但該方法的發現者在披露繞過方式後就向BeaconEye官方提交了正確的堆塊遍歷方法,官方在接收提交後該方法也將生效。

朝花夕拾- Beacon檢測技術與對抗發展歷程

簡單有效-可疑內存屬性與靜態特徵

針對可疑的內存屬性進行威脅狩獵是一種常見的思路。在默認情況下Beacon會在RWX(可讀可寫可執行)許可權的內存空間執行,這種敏感的內存屬性會使得Beacon存在的內存空間更易被發現。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

未使用C2 Profile下RWX的內存區域中存儲的即是完整的明文Beacon。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

RWX內存區域的明文Beacon

在明文Beacon中DLL頭及命名管道名稱字元串等靜態特徵明顯,部分廠商利用這些靜態特徵進行內存中Beacon的識別掃描。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

官方救火員-C2 profile改變靜態特徵

但通過Malleable C2 profile這一官方提供的定製化配置文件,攻擊者可對Beacon的內存屬性靜態特徵等做進一步的定製和隱匿:

· 自定義內存屬性 rwx/rx

· 自定義或刪除文件頭

· 自定義命名管道名稱、替換字元串

通過其強大而靈活的特性,C2 profile幫助Beacon成功規避大部分針對內存屬性與靜態特徵的檢測,大大增強了Beacon的隱匿能力,增加了檢測的成本。

固定密鑰異或?直接解密提取Beacon配置

由於某些原因,CobaltStrike在導出Beacon時僅會對其中包含的Beacon配置信息用簡單的異或加密進行保護。更致命的是加密密鑰是固定的,對3.x版本的CobaltStrike默認是0x69,對4.x版本的CobalStrike默認是0x2e,用戶並不能通過C2 Profile等方式對加密方式或密鑰進行修改。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

用於匹配的固定開始特徵

結構相對固定的明文配置的特徵在經過異或後的值依然具有明確的特徵,可通過簡單的特徵匹配捕獲。

自己動手-魔改Beacon Config密鑰

Beacon Config的默認密鑰可以通過手動patch的方式進行修改,雖然較為繁瑣,但只要同時對服務端與beacon二進位模板中的異或密鑰同時進行修改,便可以逃過利用默認異或密鑰來進行特徵掃描的工具。

從BeaconEye說起,圍繞CS內存特徵的檢測與規避

Beacon Config默認以固定密鑰加密的孱弱的加密方式給檢測工具提取Beacon配置提供了可乘之機,攻擊者仍可通過魔改二進位的手段修改該密鑰。但只要加密方式不變,通過爆破異或等方式依然不難提取加密後的配置。

小結

BeaconEye的檢測思路切中CobaltStrike要害,除非徹底變更數據結構,不存在一勞永逸的繞過方法。未來類似BeaconEye將C2框架內的固定數據結構作為檢測對象的工具將會更多出現,各種隱匿技術也會相伴而生,將這場拉鋸戰繼續下去。

CS內存檢測與對抗技術的發展,顯示了攻防雙方在博弈中共同成長的路徑。由內存特徵到Beacon配置,隨著理解的加深,攻防陣地越來越接近底層;由C2profile官方定製到動手魔改,社區研究在實戰驅使下補全官方未提供的對抗能力。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/223141.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:14
下一篇 2024-12-09 14:14

相關推薦

發表回復

登錄後才能評論