1. 程式人生 > >一個Python開源項目-騰訊哈勃沙箱源碼剖析(上)

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

blog tps 獲取文件屬性 scrip bsp 變形 string 大量 ltrace

前言

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

技術分享圖片

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

  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】:領取 人工智能數學基礎 教程

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