一個Python開源項目-騰訊哈勃沙箱源碼剖析(上)

前言

2019年來了,2020年還會遠嗎? 請把下一年的年終獎發一下,謝謝。。。html

回顧逝去的2018年,最大的改變是從一名學生變成了一位工做者,不敢說本身多麼的職業化,可是正在努力往那個方向走。python

之前想的更可能是嘗試,如今須要考慮的更可能是落地。學校和公司仍是有很大的不同,學到了不少東西linux

 

2019年了,新年新氣象,給你們宣佈一下」七夜安全博客「今年的規劃:git

1. 2019年再也不接任何商業廣告(文末騰訊廣告除外),純粹輸出安全技術乾貨。github

2. 2019年每週至少兩篇原創圖文,也就是說每月至少八篇文章。web

3. 2019年每篇圖文都再也不單獨開讚揚,統一在每月1號開讚揚,並回顧上個月的內容,簡稱收租,你們以爲上個月的文章不錯,就多讚揚便可shell

4. 2019年的主題是二進制安全,至少上半年是這樣,包括木馬的設計與檢測方面,會按照系列和專題發佈文章。安全

 

廢話很少說,新的一年就從哈勃沙箱提及,用來檢測linux惡意文件。bash

 

哈勃沙箱

今天說的哈勃沙箱是騰訊哈勃檢測系統中,linux惡意文件檢測部分的開源代碼。github地址爲:markdown

 

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文件裏。

 

通常的動態檢測主要是監視程序三個部分的內容:

  1. syscall系統調用

  2. 進程內存

  3. 網絡流量

 

對於系統調用,哈勃使用了三種方式進行了全方位的監控: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】:領取 人工智能數學基礎 教程
本文章屬於原創做品,歡迎你們轉載分享,禁止修改文章的內容。尊重原創,轉載請註明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/
相關文章
相關標籤/搜索