一個Python開源專案-騰訊哈勃沙箱原始碼剖析(上)
前言
2019年來了,2020年還會遠嗎? 請把下一年的年終獎發一下,謝謝。。。
回顧逝去的2018年,最大的改變是從一名學生變成了一位工作者,不敢說自己多麼的職業化,但是正在努力往那個方向走。
以前想的更多是嘗試,現在需要考慮的更多是落地。學校和公司還是有很大的不一樣,學到了很多東西。
2019年了,新年新氣象,給大家宣佈一下”七夜安全部落格“今年的規劃:
1. 2019年不再接任何商業廣告(文末騰訊廣告除外),純粹輸出安全技術乾貨。
2. 2019年每週至少兩篇原創圖文,也就是說每個月至少八篇文章。
3. 2019年每篇圖文都不再單獨開讚賞,統一在每個月1號開讚賞,並回顧上個月的內容,簡稱
4. 2019年的主題是二進位制安全,至少上半年是這樣,包括木馬的設計與檢測方面,會按照系列和專題釋出文章。
廢話不多說,新的一年就從哈勃沙箱說起,用來檢測linux惡意檔案。
哈勃沙箱
今天說的哈勃沙箱是騰訊哈勃檢測系統中,linux惡意檔案檢測部分的開原始碼。github地址為:
https://github.com/Tencent/HaboMalHunter
今天是原始碼剖析的第一篇,目標是簡要介紹一下沙箱使用的檢測手段和主要技術點。從github中輸出的html報表裡,監控的資訊還是挺豐富的。這裡只擷取一部分,根據github中的說明,大家很容易就可以搭建一個沙箱。
靜態檢測
在哈勃沙箱的程式碼目錄中,static目錄下即為靜態檢測的程式碼,程式碼很清晰。靜態檢測的本質是特徵碼匹配,對已知的惡意檔案進行快速匹配進而查殺,如果能在靜態檢測層面發現惡意程式碼,就不需要動態分析了,這樣速度就會快很多。
從static_analyzer.py來看,哈勃linux沙箱靜態檢測,獲取的資訊主要有六個方面:
1. 檔案型別資訊
通過file命令獲取檔案資訊,比如是二進位制還是其他型別檔案,在linux中是無法通過後綴判斷它是什麼檔案的。
2. 檔案hash比對
對於已知的惡意檔案都有相應的hash庫,方便快速比對。哈勃主要計算檔案的md5,sha1,sha256,這是一種絕對匹配方式。
還有一種方式是計算檔案的ssdeep值,這個在我之前在公眾號講webshell檢測時講過這個,這個值可以通過相似度判斷惡意檔案的一些變形。
3. exiftool資訊
獲取檔案屬性資訊,通過exiftool工具來實現,內容包括修改時間,建立時間等等。
4. 檔案大小
檔案大小也是一個輔助判斷的依據,畢竟木馬檔案不會很大,幾兆的木馬檔案上傳也是費事。
5. yara模糊過濾
YARA是一款旨在幫助惡意軟體研究人員識別和分類惡意軟體樣本的開源工具,使用YARA可以基於文字或二進位制模式建立惡意軟體家族描述資訊。
YARA的每一條描述或規則都由一系列字串和一個布林型表示式構成,並闡述其邏輯。YARA規則可以提交給檔案或在執行程序,以幫助研究人員識別其是否屬於某個已進行規則描述的惡意軟體家族。比如下面這個例子:
rule silent_banker : banker { meta: description = "This is just an example" thread_level = 3 in_the_wild = true strings: $a = {6A 40 68 00 30 00 00 6A 14 8D 91} $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9} $c = "UVODFRYSIHLNWPEJXQZAKCBGMT" condition: $a or $b or $c }
實現程式碼為:
6. 查殼
一般的惡意檔案,為了防止被逆向人員分析,都會加殼的。
哈勃主要是判斷了是否是upx殼。如果是upx,則進行解壓。判斷是upx殼的方法很簡單,直接使用upx進行解壓,返回是否成功。
接著提取以下資訊:
-
明文字串(通過strings命令),
-
動態庫(通過ldd命令)
-
入口點,節,段,符號等資訊(通過readelf命令)
動態檢測
動態檢測是沙箱的核心部分,但是本篇不展開講解,在下一篇進行詳細分析,因為動態檢測的原理比較複雜。動態檢測的內容在dynamic目錄下的dynamic_analyzer.py檔案裡。
一般的動態檢測主要是監視程式三個部分的內容:
-
syscall系統呼叫
-
程序記憶體
-
網路流量
對於系統呼叫,哈勃使用了三種方式進行了全方位的監控:ltrace/strace/sysdig。
ltrace和strace
ltrace和strace都是基於ptrace機制進行檢測的,但是又有很大的不同,strace跟蹤系統呼叫,而ltrace可以跟蹤動態庫函式。我們知道,ptrace機制可以用來跟蹤系統呼叫,那麼ltrace是如何使用它跟蹤庫函式呢?
首先ltrace開啟elf檔案,對其進行分析。在elf檔案中,出於動態連結的需要,需要在elf檔案中儲存函式的符號,供連結器使用。具體格式,大家可以參考elf檔案的格式。
這樣ltrace就能夠獲得該檔案中,所有系統呼叫的符號,以及對應的執行指令。然後,ltrace將該執行指令所對應的4個位元組替換成斷點指令。
這樣在程序執行到相應的庫函式後,就可以通知到了ltrace,ltrace將對應的庫函式打印出來之後,繼續執行子程序。
實際上ltrace與strace使用的技術大體相同,但ltrace在對支援fork和clone方面,不如strace。strace在收到fork和clone等系統呼叫後,做了相應的處理,而ltrace沒有。
至於sysdig的原理,以及與ltrace,strace的區別,我們會在下一文章中進行詳細說明。
記憶體分析
對於記憶體,沙箱基本上都是基於volatility來做的,哈勃也不例外。哈勃主要分析了兩部分記憶體:
1.bash 呼叫歷史
2.父子程序的關係
網路分析
對於網路,沙箱主要做了兩個部分的工作,一部分是虛擬網路環境,另一部分是網路抓包。
1.INetSim虛擬網路環境
2.tcpdump 抓取資料包
有的木馬,還會有自刪除,自鎖定,自修改的行為,這是一些自保護的需要。沙箱中對此也進行了檢測:
現有程式碼的不足
對於開源的部分程式碼,發現一些不能落地生產環境的地方,付費版的程式碼應該沒這些問題。
1.沒有實現檢測的自動化
它是把沙箱安裝到虛擬機器中,然後人工拖動程式進入沙箱檢測,沒有發現自動化的程式碼。當然,對於虛擬機器的自動化控制,這個是可以做的,二次開發。
2.沒有策略
沙箱的檢測策略是沒有開源的,這是很寶貴的東西。我們雖然可以獲取大量的資訊,但是哪些是惡意的,我們沒辦法判別。當然這就是我們策略該做的事情了,只要有樣本,策略還是可以做的。
3.請期待下一篇:沙箱的動態檢測機制。
最後
關注公眾號:七夜安全部落格
- 回覆【1】:領取 Python資料分析 教程大禮包
- 回覆【2】:領取 Python Flask 全套教程
- 回覆【3】:領取 某學院 機器學習 教程
- 回覆【4】:領取 爬蟲 教程
- 回覆【5】:領取 編譯原理 教程
- 回覆【6】:領取 滲透測試 教程
- 回覆【7】:領取 人工智慧數學基礎 教程
最後
關注公眾號:七夜安全部落格
- 回覆【1】:領取 Python資料分析 教程大禮包
- 回覆【2】:領取 Python Flask 全套教程
- 回覆【3】:領取 某學院 機器學習 教程
- 回覆【4】:領取 爬蟲 教程
- 回覆【5】:領取 編譯原理 教程
- 回覆【6】:領取 滲透測試 教程
- 回覆【7】:領取 人工智慧數學基礎 教程