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

前言

上一篇中,咱們講解了哈勃沙箱的技術點,詳細分析了靜態檢測和動態檢測的流程。本篇接着對動態檢測的關鍵技術點進行分析,包括strace,sysdig,volatility。volatility的介紹不會太深刻,內存取證這部分的研究還須要繼續。html

strace機制

上一篇講到了strace和ltrace都是基於ptrace機制,可是對ptrace機制和strace/ltrace是如何利用ptrace監控系統調用,沒有進行詳細的講解。linux

 

那什麼是ptrace機制呢?程序員

 

ptrace機制是操做系統提供了一種標準的服務來讓程序員實現對底層硬件和服務的控制。shell

 

當一個程序須要做系統調用的時候,它將相關參數放進系統調用相關的寄存器,而後調用軟中斷0x80,這個中斷就像一個讓程序得以接觸到內核模式的窗口,程序將參數和系統調用號交給內核內核來完成系統調用的執行。ubuntu


ptrace會在何時出現呢?
瀏覽器

 

在執行系統調用以前,內核會先檢查當前進程是否處於被「跟蹤」(traced)的狀態。若是是的話,內核暫停當前進程並將控制權交給跟蹤進程,使跟蹤進程得以察看或者修改被跟蹤進程的寄存器。安全

 

strace監控系統調用markdown

 

下面就以strace爲例,以下圖所示,在第2步和第3步是關鍵。網絡

 

strace使用ptrace機制來檢測目標進程並「監聽」該進程的系統調用,strace能夠在每次調用系統調用時中斷跟蹤的進程,捕獲調用,解碼它,而後繼續執行跟蹤的進程數據結構

 

你們可能知道,每次調用系統調用(例如,打開,讀取,寫入,關閉)時,都須要從用戶級別到內核級別的轉換 - 這稱爲上下文切換。這取決於CPU系列和型號,以不一樣的方式實現,但它每每複雜且相對較慢。

sysdig機制

 

sysdig是一個開源系統發掘工具,用於系統級別的勘察和排障,能夠看做system(系統)+dig(挖掘)的組合。咱們能夠把它看做一系列傳統的 unix 系統工具的組合,主要包括:

  • strace:追蹤某個進程產生和接收的系統調用。

  • tcpdump:分析網絡數據,監控原始網絡通訊。

  • lsof:  列出打開的文件。

  • top:監控系統性能工具。

  • htop :交互式的進程瀏覽器,能夠用來替換 top 命令。

  • iftop :主要用來顯示本機網絡流量狀況及各相互通訊的流量集合。

  • lua:一個小巧的腳本語言。該語言的設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。

 

sysdig工做方式分紅用戶空間和內核空間兩個部分,結構以下圖所示(附件畫圖畫的):

 

 

數據的捕獲流程分爲以下5部分

  1. 在內核有一個組件叫 sysdig-probe,也能夠把它稱爲數據探頭,它經過跟蹤 linux 內核來進行數據抓獲。

  2. 事件緩衝器(event buffer)用來把存儲器映射到用戶空間。

  3. scap 組件:用來進行捕獲控制和轉儲文件,以及數據的狀態採集。

  4. sinsp 組件:用來進行事件分析、執行鑿子(chisel),設置過濾和輸出格式化。

  5. 最後 sysdig 工具在命令行解析採集的數據。

 

從總體架構上來看,sysdig與libpcap / tcpdump / wireshark的架構很是類似,都是先捕獲大量的數據,而後使用過濾器獲取本身想要的數據。

 

但願你們注意到一個問題, sysdig-probe從內核捕獲的數據會很是大的,用戶空間裏的scapsinspsysdig組件能處理過來嗎?假如處理不過來,sysdig會採用什麼機制呢?sysdig會像strace同樣放慢程序速度嗎?

 

答案是否認的。在這種狀況下,事件緩衝區填滿,sysdig-probe開始丟棄傳入的事件。所以,將丟失一些跟蹤信息,但機器上運行的其餘進程不會減慢速度,這是sysdig架構的關鍵優點,意味着跟蹤開銷可預測。既然sysdig這麼強大,下面講解一下sysdig的基本用法。

 

sysdig 基本用法

 

我以ubuntu系統中的操做爲例,直接在shell輸入sudo sysdig 就能開始捕獲系統信息,執行後你會看到終端有持續不斷的輸出流。

 

$ sudo sysdig

 

由於系統每時每刻都有大量的系統調用產生,這樣是沒辦法看清更沒法分析輸出信息的,能夠先使用 ctrl + c 來退出命令。輸出以下圖所示:

 

先來解釋一下它的輸出格式:

 

全部的輸入都是按照行來分割的,每行都是一條記錄,由多個列組成,默認的格式是:

 

%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info

 

各個字段的含義以下

  • evt.num: 遞增的事件號

  • evt.time: 事件發生的時間

  • evt.cpu: 事件被捕獲時所在的 CPU,也就是系統調用是在哪一個 CPU 執行的。比較上面的例子中,值 0 表明機器的第一個 CPU

  • proc.name: 生成事件的進程名字,也就是哪一個進程在運行

  • thread.tid: 線程的 id,若是是單線程的程序,這也是進程的 pid

  • evt.dir: 事件的方向(direction),> 表明進入事件,< 表明退出事件

  • evt.type: 事件的名稱,好比 open、stat等,通常是系統調用

  • evt.args: 事件的參數。若是是系統調用,這些對應着系統調用的參數

 

過濾

 

完整的 sysdig 使用方法:

 

sysdig [option]...  [filter]

 

sysdig 的過濾功能很強大,不只支持的過濾項不少,並且還可以自由地進行邏輯組合。

 

過濾項

 

sysdig 的過濾器也是分紅不一樣類別的,好比:

 

  • fd: 對文件描述符(file descriptor)進行過濾,好比 fd 標號(fd.num)、fd 名字(fd.name)

  • process: 進程信息的過濾,好比進程 id(proc.id)、進程名(proc.name)

  • evt: 事件信息的過濾,好比事件編號、事件名

  • user: 用戶信息的過濾,好比用戶 id、用戶名、用戶 home 目錄、用戶的登陸 shell(user.shell)

  • syslog: 系統日誌的過濾,好比日誌的嚴重程度、日誌的內容

  • fdlist: poll event 的文件描述符的過濾

 

完整的過濾器列表可使用sysdig -l來查看,好比能夠查看創建 TCP 鏈接的事件

 

sudo sysdig evt.type=accept

 

過濾器組合

 

過濾器除了直接的相等比較以外,還有其餘操做符,包括=、!=、>=、>、<、<=、contains、in 和 exists

好比:

 

$ sysdig fd.name contains /etc

$ sysdig "evt.type in ( 'select', 'poll' )"

$ sysdig proc.name exists

 

多個過濾條件還能夠經過 and、or 和 not 進行邏輯組合,好比:

 

$ sysdig "not (fd.name contains /proc or fd.name contains /dev)"

volatility簡單描述

 到這發現已經寫了4千多字,volatility這裏簡要描述一下,詳細的分析,等我以後對內存取證有了一個總體的框架再說。

 

 Volatility是一個Python編寫的跨平臺,用於內存分析的法證工具,其目的是爲了在數據犯罪中提取易失性數據 ,也能夠用來進行Rootkit的檢測和協助清除。Volatility分析主要依賴的是profile文件,profile文件是由兩部分合成。以linux爲例,大體以下:

 

  1.  Linux的System.map文件列出了詳細的系統調用(syscall),而kernel-header源碼經過dwarfdump生成的module.dwarf文件中會包含不少內核數據結構,將以上2個文件打包爲profile文件。

  2. 再用這個profile文件解析dump下來的物理內存,就很容易找到植入Rootkit的機器活動時的進程(linux_psaux)、網絡通訊(linux_netstat)、活動文件(linux_lsof)、驅動模塊(linux_lsmod)等等

最後

關注公衆號:七夜安全博客

  • 回覆【1】:領取 Python數據分析 教程大禮包
  • 回覆【2】:領取 Python Flask 全套教程
  • 回覆【3】:領取 某學院 機器學習 教程
  • 回覆【4】:領取 爬蟲 教程
  • 回覆【5】:領取 編譯原理 教程 
  • 回覆【6】:領取 滲透測試 教程 
  • 回覆【7】:領取 人工智能數學基礎 教程
本文章屬於原創做品,歡迎你們轉載分享,禁止修改文章的內容。尊重原創,轉載請註明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/
相關文章
相關標籤/搜索