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

前言

2019年來了,2020年還會遠(yuǎn)嗎? 請把下一年的年終獎(jiǎng)發(fā)一下,謝謝。。。

回顧逝去的2018年,最大的改變是從一名學(xué)生變成了一位工作者,不敢說自己多么的職業(yè)化,但是正在努力往那個(gè)方向走。

以前想的更多是嘗試,現(xiàn)在需要考慮的更多是落地。學(xué)校和公司還是有很大的不一樣,學(xué)到了很多東西。


2019年了,新年新氣象,給大家宣布一下”七夜安全博客“今年的規(guī)劃:

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

2. 2019年每周至少兩篇原創(chuàng)圖文,也就是說每個(gè)月至少八篇文章。

3. 2019年每篇圖文都不再單獨(dú)開贊賞,統(tǒng)一在每個(gè)月1號開贊賞,并回顧上個(gè)月的內(nèi)容,簡稱收租,大家覺得上個(gè)月的文章不錯(cuò),就多贊賞即可

4. 2019年的主題是二進(jìn)制安全,至少上半年是這樣,包括木馬的設(shè)計(jì)與檢測方面,會按照系列和專題發(fā)布文章。


廢話不多說,新的一年就從哈勃沙箱說起,用來檢測linux惡意文件。


哈勃沙箱

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

https://github.com/Tencent/HaboMalHunter


今天是源碼剖析的第一篇,目標(biāo)是簡要介紹一下沙箱使用的檢測手段和主要技術(shù)點(diǎn)。從github中輸出的html報(bào)表里,監(jiān)控的信息還是挺豐富的。這里只截取一部分,根據(jù)github中的說明,大家很容易就可以搭建一個(gè)沙箱。



靜態(tài)檢測

在哈勃沙箱的代碼目錄中,static目錄下即為靜態(tài)檢測的代碼,代碼很清晰。靜態(tài)檢測的本質(zhì)是特征碼匹配,對已知的惡意文件進(jìn)行快速匹配進(jìn)而查殺,如果能在靜態(tài)檢測層面發(fā)現(xiàn)惡意代碼,就不需要?jiǎng)討B(tài)分析了,這樣速度就會快很多。

從static_analyzer.py來看,哈勃linux沙箱靜態(tài)檢測,獲取的信息主要有六個(gè)方面:

1. 文件類型信息

通過file命令獲取文件信息,比如是二進(jìn)制還是其他類型文件,在linux中是無法通過后綴判斷它是什么文件的。

2. 文件hash比對

對于已知的惡意文件都有相應(yīng)的hash庫,方便快速比對。哈勃主要計(jì)算文件的md5,sha1,sha256,這是一種絕對匹配方式。

還有一種方式是計(jì)算文件的ssdeep值,這個(gè)在我之前在公眾號講webshell檢測時(shí)講過這個(gè),這個(gè)值可以通過相似度判斷惡意文件的一些變形。

3. exiftool信息

獲取文件屬性信息,通過exiftool工具來實(shí)現(xiàn),內(nèi)容包括修改時(shí)間,創(chuàng)建時(shí)間等等。


4. 文件大小

文件大小也是一個(gè)輔助判斷的依據(jù),畢竟木馬文件不會很大,幾兆的木馬文件上傳也是費(fèi)事。


5. yara模糊過濾

YARA是一款旨在幫助惡意軟件研究人員識別和分類惡意軟件樣本的開源工具,使用YARA可以基于文本或二進(jìn)制模式創(chuàng)建惡意軟件家族描述信息。

YARA的每一條描述或規(guī)則都由一系列字符串和一個(gè)布爾型表達(dá)式構(gòu)成,并闡述其邏輯。YARA規(guī)則可以提交給文件或在運(yùn)行進(jìn)程,以幫助研究人員識別其是否屬于某個(gè)已進(jìn)行規(guī)則描述的惡意軟件家族。比如下面這個(gè)例子:

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

}

  加載yara的實(shí)現(xiàn)代碼為:


6. 查殼

一般的惡意文件,為了防止被逆向人員分析,都會加殼的。

哈勃主要是判斷了是否是upx殼。如果是upx,則進(jìn)行解壓。判斷是upx殼的方法很簡單,直接使用upx進(jìn)行解壓,返回是否成功。

接著提取以下信息:

1.明文字符串(通過strings命令),

2.動態(tài)庫(通過ldd命令)

3. 入口點(diǎn),節(jié),段,符號等信息(通過readelf命令)

動態(tài)檢測

動態(tài)檢測是沙箱的核心部分,但是本篇不展開講解,在下一篇進(jìn)行詳細(xì)分析,因?yàn)閯討B(tài)檢測的原理比較復(fù)雜。動態(tài)檢測的內(nèi)容在dynamic目錄下的dynamic_analyzer.py文件里。

一般的動態(tài)檢測主要是監(jiān)視程序三個(gè)部分的內(nèi)容:

1. syscall系統(tǒng)調(diào)用

2. 進(jìn)程內(nèi)存

3. 網(wǎng)絡(luò)流量


對于系統(tǒng)調(diào)用,哈勃使用了三種方式進(jìn)行了全方位的監(jiān)控:ltrace/strace/sysdig。

ltrace和strace

ltrace和strace都是基于ptrace機(jī)制進(jìn)行檢測的,但是又有很大的不同,strace跟蹤系統(tǒng)調(diào)用,而ltrace可以跟蹤動態(tài)庫函數(shù)。我們知道,ptrace機(jī)制可以用來跟蹤系統(tǒng)調(diào)用,那么ltrace是如何使用它跟蹤庫函數(shù)呢?

首先ltrace打開elf文件,對其進(jìn)行分析。在elf文件中,出于動態(tài)鏈接的需要,需要在elf文件中保存函數(shù)的符號,供鏈接器使用。具體格式,大家可以參考elf文件的格式。

這樣ltrace就能夠獲得該文件中,所有系統(tǒng)調(diào)用的符號,以及對應(yīng)的執(zhí)行指令。然后,ltrace將該執(zhí)行指令所對應(yīng)的4個(gè)字節(jié)替換成斷點(diǎn)指令。

這樣在進(jìn)程執(zhí)行到相應(yīng)的庫函數(shù)后,就可以通知到了ltrace,ltrace將對應(yīng)的庫函數(shù)打印出來之后,繼續(xù)執(zhí)行子進(jìn)程。

實(shí)際上ltrace與strace使用的技術(shù)大體相同,但ltrace在對支持fork和clone方面,不如strace。strace在收到fork和clone等系統(tǒng)調(diào)用后,做了相應(yīng)的處理,而ltrace沒有。

至于sysdig的原理,以及與ltrace,strace的區(qū)別,我們會在下一文章中進(jìn)行詳細(xì)說明。

內(nèi)存分析

對于內(nèi)存,沙箱基本上都是基于volatility來做的,哈勃也不例外。哈勃主要分析了兩部分內(nèi)存:

1.bash 調(diào)用歷史

2.父子進(jìn)程的關(guān)系

網(wǎng)絡(luò)分析

對于網(wǎng)絡(luò),沙箱主要做了兩個(gè)部分的工作,一部分是虛擬網(wǎng)絡(luò)環(huán)境,另一部分是網(wǎng)絡(luò)抓包

1.INetSim虛擬網(wǎng)絡(luò)環(huán)境

2.tcpdump 抓取數(shù)據(jù)包


有的木馬,還會有自刪除,自鎖定,自修改的行為,這是一些自保護(hù)的需要。沙箱中對此也進(jìn)行了檢測:

現(xiàn)有代碼的不足

對于開源的部分代碼,發(fā)現(xiàn)一些不能落地生產(chǎn)環(huán)境的地方,付費(fèi)版的代碼應(yīng)該沒這些問題。

1.沒有實(shí)現(xiàn)檢測的自動化

它是把沙箱安裝到虛擬機(jī)中,然后人工拖動程序進(jìn)入沙箱檢測,沒有發(fā)現(xiàn)自動化的代碼。當(dāng)然,對于虛擬機(jī)的自動化控制,這個(gè)是可以做的,二次開發(fā)。


2.沒有策略

?沙箱的檢測策略是沒有開源的,這是很寶貴的東西。我們雖然可以獲取大量的信息,但是哪些是惡意的,我們沒辦法判別。當(dāng)然這就是我們策略該做的事情了,只要有樣本,策略還是可以做的。


3.請期待下一篇:沙箱的動態(tài)檢測機(jī)制。


關(guān)注公眾號:七夜安全博客?

回復(fù)【1】:領(lǐng)取 Python數(shù)據(jù)分析 教程大禮包

回復(fù)【2】:領(lǐng)取 Python Flask 全套教程

回復(fù)【3】:領(lǐng)取 某學(xué)院 機(jī)器學(xué)習(xí) 教程

回復(fù)【4】:領(lǐng)取 爬蟲 教程

回復(fù)【5】:領(lǐng)取 編譯原理 教程?

回復(fù)【6】:領(lǐng)取 滲透測試 教程?

回復(fù)【7】:領(lǐng)取 人工智能數(shù)學(xué)基礎(chǔ) 教程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容