一個Python開源項目-哈勃沙箱源碼剖析(下)
前言
在上一篇中,我們講解了哈勃沙箱的技術點,詳細分析了靜態檢測和動態檢測的流程。本篇接著對動態檢測的關鍵技術點進行分析,包括strace,sysdig,volatility。volatility的介紹不會太深入,內存取證這部分的研究還需要繼續。
strace機制
上一篇講到了strace和ltrace都是基於ptrace機制,但是對ptrace機制和strace/ltrace是如何利用ptrace監控系統調用,沒有進行詳細的講解。
那什麽是ptrace機制呢?
ptrace機制是操作系統提供了一種標準的服務來讓程序員實現對底層硬件和服務的控制。
當一個程序需要作系統調用的時候,它將相關參數放進系統調用相關的寄存器,然後
ptrace會在什麽時候出現呢?
在執行系統調用之前,內核會先檢查當前進程是否處於被“跟蹤”(traced)的狀態。如果是的話,內核暫停當前進程並將控制權交給跟蹤進程,使跟蹤進程得以察看或者修改被跟蹤進程的寄存器。
strace監控系統調用
下面就以strace為例,如下圖所示,在第2步和第3步是關鍵。
strace使用ptrace機制來檢測目標進程並“監聽”該進程的系統調用,strace可以在每次調用系統調用時中斷跟蹤的進程,捕獲調用,解碼它,然後繼續執行跟蹤的進程
大家可能知道,每次調用系統調用(例如,打開,讀取,寫入,關閉)時,都需要從用戶級別到內核級別的轉換 - 這稱為上下文切換。這取決於CPU系列和型號,以不同的方式實現,但它往往復雜且相對較慢。
sysdig機制
sysdig是一個開源系統發掘工具,用於系統級別的勘察和排障,可以看作system(系統)+dig(挖掘)的組合。我們可以把它看作一系列傳統的 unix 系統工具的組合,主要包括:
-
strace:追蹤某個進程產生和接收的系統調用。
-
tcpdump:分析網絡數據,監控原始網絡通信。
-
lsof: 列出打開的文件。
-
top:監控系統性能工具。
-
htop :交互式的進程瀏覽器,可以用來替換 top 命令。
-
iftop :主要用來顯示本機網絡流量情況及各相互通信的流量集合。
-
lua:一個小巧的腳本語言。該語言的設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。
sysdig工作方式分成用戶空間和內核空間兩個部分,結構如下圖所示(附件畫圖畫的):
數據的捕獲流程分為如下5部分:
-
在內核有一個組件叫 sysdig-probe,也可以把它稱為數據探頭,它通過跟蹤 linux 內核來進行數據抓獲。
-
事件緩沖器(event buffer)用來把存儲器映射到用戶空間。
-
scap 組件:用來進行捕獲控制和轉儲文件,以及數據的狀態采集。
-
sinsp 組件:用來進行事件分析、執行鑿子(chisel),設置過濾和輸出格式化。
-
最後 sysdig 工具在命令行解析采集的數據。
從整體架構上來看,sysdig與libpcap / tcpdump / wireshark的架構非常相似,都是先捕獲大量的數據,然後使用過濾器獲取自己想要的數據。
希望大家註意到一個問題, sysdig-probe從內核捕獲的數據會非常大的,用戶空間裏的scap,sinsp,sysdig組件能處理過來嗎?假如處理不過來,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為例,大致如下:
-
Linux的System.map文件列出了詳細的系統調用(syscall),而kernel-header源碼通過dwarfdump生成的module.dwarf文件中會包含很多內核數據結構,將以上2個文件打包為profile文件。
-
再用這個profile文件解析dump下來的物理內存,就很容易找到植入Rootkit的機器活動時的進程(linux_psaux)、網絡通信(linux_netstat)、活動文件(linux_lsof)、驅動模塊(linux_lsmod)等等
最後
關註公眾號:七夜安全博客
- 回復【1】:領取 Python數據分析 教程大禮包
- 回復【2】:領取 Python Flask 全套教程
- 回復【3】:領取 某學院 機器學習 教程
- 回復【4】:領取 爬蟲 教程
- 回復【5】:領取 編譯原理 教程
- 回復【6】:領取 滲透測試 教程
- 回復【7】:領取 人工智能數學基礎 教程
一個Python開源項目-哈勃沙箱源碼剖析(下)