• 沒有找到結果。

第三章、 誘捕網系統

第七節、 Sebek(Honeypot)

Sebek 是一個資料截取的工具。所有資料截取工具的目的都是用其截取的資料,

準確地讓我們知道在 honeypot 上的事件。用它來確定 attacker 是什麼時候對系統 做攻擊的,他們的攻擊手段以及攻擊成功後所做的事。

但有些惡意的行為是經過加密的,這樣的行為使用一般的 traffic filter 的方 式是不能夠辨認出這些內容並加以記錄的。

我們知道,雖然訊息要加密,但在系統中某些地方不是被加密的,在這些地 方可以截取到沒有經過加密的資料。一般攻擊者會加入一個木馬的 shell,用來 記錄未經加密的輸入命令。

第一版的 sebek 設計成直接從 kernel 搜集按鍵的資料,參考了 Adore

Rootkit,用替換 sys_read 的 system call 來截取按鍵資料,然後把這些資訊記錄到 一個隱藏的文件並通過網路模擬成其它如 NetBIOS 的 UDP protocol 把它發送出 去,這樣就能滿足我們 monitor 入侵者按鍵的需求了。但它易於被發現且效率不 高是一個缺點。

到了第二版的 sebek,它不旦可以記錄按鍵,還記錄了所有通過 sys_read 的 資料。收集到這些資料,我們就可以 monitor honeypot 的所有動作。比如有一個 檔案被 copy 到 honeypot 裡,sebek 就能夠發現並記錄它,產生一同一個的拷貝。

第二個重要的改變是 sebek 變得更難檢測出來,改進了日誌資料的傳輸,使得用 sniffer 檢測不到 sebek 的數據傳輸。

在 Web 誘捕系統中建構 Honey pot 有很大的好處:1. 方便與現有架構做整 合,位於同一 Honey Wall 內的機器均為 Honey pot。2. 蒐集的 Log 傳輸更具隱蔽 性,由於 Sebek 本身有防治 Sniffer 監聽的機制,誘捕系統的資料傳輸均透過 Sebek 則更加安全。

7.1 Sebek 結構

Sebek 的組成部分成二個:client 和 server。Client 端從 honeypot 截取資料並且輸 出到網路讓 server 收集。Client 端有兩種方式收集資料:第一種是直接從網路活 動的資料封包截取,第二種是從 tcpdump 格式保存的資料封包檔。當資料收集後 可以上傳到相關的資料庫,也可以馬上顯示按鍵錄,且 sebek 使用 UDP protocol

51

進行通信。

圖 13、Sebek 結構

上圖為典型的 sebek 部署。Client 模組安裝在 honeypot 裡,攻擊者行為被截取後 發送到網路,並且由 honeywall gateway 收集。

Client 端完全在 honeypot 的 kernel space,根據 Linux 版本的情況以 LKM 的方式 執行。Client 端可以記錄用戶通過 read() system call 的所有資料,執行 sebek 的 honeypot 以難以檢測的方式把這些資料輸出到 server 所在的網路,後 server 收集 所有 honeypot 發送的資料。

7.2 Sebek 原理簡介

Client Data Capture:

52

圖 14、Sebek 原理說明

上圖為 Linux kernel 2.4 的做法,在 kernel 2.6、Win32 環境也是採用相同方法:

將原本的 System call Table 所指向的 system service routine address 改為自己寫好 的 module routine address,藉此側錄( in New_read )有通過 system read 的內容,

最後會回到原本的 service routine(Original Read),在 Sebek 3 會側錄 read、write、

socket、open 等 services。

Client Module Hiding:

Linux 版本是利用 rootkit 隱藏的技巧,將 Sebek 掛載的 module 從紀錄的 module linked list 中移除,所以重新開機後 Sebek 將無法執行。而 Win32 版本則是由於 有 Hook 在系統的 Native API 中,所以隱藏手法與 Linux 有差異,將安裝時所用 的 Driver 移除即可,也因此不會因為重新開機而無法正常使用 Sebek。

53

Client Packet Export:

圖 15、Client Packet Export

為了避免誘捕主機遭到入侵後,入侵者可能藉由攔截與分析網路封包(sniffer),

進而偵測出 Sebek 的存在,所以此處採用秘密通訊的手法,將側錄到的 Log 資料 轉為封包後,直接把封包傳至 Network Driver 發送至接收端主機;而不是以一般 的傳輸流程:透過 Socket API 傳送封包。

同樣地,為了避免入侵者直接從 Network Driver 中提取資訊作分析,Sebek 會將 Linux 中的/proc/net/dev 內紀錄傳輸封包數量,扣掉 honey pot 使用的封包數,以 免被偵測;Win32 則是直接 Hook 至 NDIS(Network Driver Interface Specification),

過濾到相關封包資訊。

在 Sebek version 3 中,重新設計了它傳輸的 protocol,與之前的版本並不相容,

下圖是 Sebek version 3 中傳輸 protocol 的 header 詳細資料。

54

圖 16、Sebek Protool version 3 Packet header

新的 protocol header 包含了一些新的欄位,如上圖以黑色表示的欄位,parent process ID(PPID),以及 inode。另外在 type 欄位中支援下列新的 system calls:read (0),write (1),socket (2),open(3)。

欄位名 資料類型 描述

Magic Unsigned 32 bit Int 前面是目標埠,Sebek 使 用 Magic 來識別那些資 料包需要隱藏

Version Unsigned 16bit Int Sebek 協議版本,當前版 本是"1"

Type Unsigned 16bit Int 記錄的類型。讀數據是 0,寫數據是 1。目前只 實現了讀。

Counter Unsigned 32bit Int PDU 計數器,用來識別 資料包什麼時候丟失。剛 安裝時計數器是 0

Time_sec Unsigned 32bit Int 蜜罐從 UNIX 紀元開始 的秒數

55

Time_usec Unsigned 32bit Int 剩餘的微秒數 PID Unsigned 32bit Int 進程 ID UID Unsigned 32bit Int 用戶 ID

FD Unsigned 32bit Int 檔描述符

Com 12 Character Array 記錄命令名字的前 12 個 字元

Length Unsigned 32bit Int 8 位元 PDU 實體的長度

發送到用戶端 Sebek 資料包的結構

當 Sebek 截獲 read()系統調用,它不但記錄讀的內容,而且注意到相關資訊。記 錄頭 PID、UID、FD 和 Com 欄位的資訊來自內核處理進程產生的請求。Time_sec 欄位基於系統時間,當然這是容易被篡改的。

Length 欄位基於讀請求返回的長度。如果從 read()調用返回資料的長度大於局域 網的 MTU,Sebek 會把讀到的資料分成多個分片以適應局域網傳輸。每個分片 和目標埠會產生 281,000,000,000 種組合。如果你有程式能夠每秒檢查 500,000 種組合,那麼它需要花費 6.5 天的時間 來測試。

7.3 Sebek 的限制

在蜜罐上使用的 Sebek 不能被入侵者檢測到,但是用於檢查基於內核模組技 術 rootkit 的檢測工具可能會檢測到 Sebek,所以入侵者檢測到使用這種系統的可 能性也是挺大的。

在 Linux 用戶端,這種風險來自內核模組支援的/dev/kmem 特性,它的功能

56 個 tar 包包含了 sbk_install.sh 腳本,這個腳本包含了 Sebek 安裝命令和配置參數,

你只需簡單的修改選項,然後就可以在蜜罐執行安裝腳本,這樣 skb_install.sh 就 按照指定的配置安裝內核模組。 這個腳本有八個配置參數,一般局域網上所有 蜜罐都要使用相同的值。

介面:指定記錄哪個介面,預設是 eth0。不需要配置 IP 位址。

目標 IP:這個欄位定義了所有產生的 Sebek 資料包使用的目標 IP 位址。由於 Sebek 服務端收集資料包的時候不看目標 IP 位址,所以這裡無需配置成 Sebek 服務端

57

的 IP,而且也不推薦,否則入侵者看到這些資料包的時候有機會知道哪個主機 是 Honeynet 裡提供資料控制功能的。

目標 MAC 位址:這個欄位指定蜜罐使用目標乙太 MAC 位址,目標 MAC 可以 設置成缺省閘道的。把它設置成 FF:FF:FF:FF:FF:FF 將引起所有的包廣播到局域 網上每個主機,這是測試的小技巧。 額外調試資訊,並且會發送到 syslog。

當在一個局域網裡配置蜜罐的時候,它們必須使用相同的 magic 值和目標埠值,

sbk_install.sh 將安裝 Sebek 用戶端,並且它將開始捕獲並發送資料。

58

服務端有三個組成部分。第一個部分叫 sbk_extract,它既可以像嗅探器一樣 直接從網卡捕獲資料,也可以從 tcpdump 檔收集。使用這個工具你 可以用這兩 種方法來恢復 Sebek 資料。用 sbk_extract 提取資料有兩種方法:第一種是把它發 送給一個叫 sbk_ks_log.pl 的腳本,這個 Perl 腳本把攻擊者的擊鍵列印到標準輸 出上;第二種是發送給一個叫 sbk_upload.pl,這個 Perl 腳本把 Sebek 資料裝載到 mysql 資料 庫。

sbk_extract 是一個從輸入資料(網卡或抓包檔)提取 Sebek 記錄的程式。

sbk_extract 有三個選項:

-f 指定從 pcap 檔提取資料 -I 定義監聽的網卡

-p 指定 UDP 目標埠

把 Sebek 記錄導入資料庫

運行 sbk_extract,並且把輸出用管道傳給 sbk_upload.pl,如:

sbk_extract | sbk_upload.pl

監視命令列擊鍵

運行 sbk_extract,並且把輸出用管道傳給 sbk_ks_ log.pl,如:

sbk_extract | sbk_ks_ log.pl 定制分析

運行 sbk_extract,並且把輸出用管道傳給自己設計的程式來分析。

59

7.7 監視命令列擊鍵活動

sbk_ks_log.pl 可以讓你在服務端命令列查看運行 Sebek 用戶端主機的擊鍵活動,

它沒有其它選項,需要讀 sbk_extract 的輸出,比如:

sbk_extract –i eth0 –p 1101 | sbk_ks_log.pl

在這個例子裡,sbk_extract 監聽 eth0,收集 UDP 埠 1101 上的資料,然後把這些 記錄傳遞給 sbk_ks_log.pl 來提取擊鍵活動。sbk_ks_log.pl 的輸出如下面所示:

[2003-07-23 20:03:45 10.0.0.13 6673 bash 500]whoami [2003-07-23 20:03:48 10.0.0.13 6673 bash 500]who [2003-07-23 20:03:50 10.0.0.13 6673 bash 500]su [2003-07-23 20:03:57 10.0.0.13 6886 bash 0]cd /var/log [2003-07-23 20:03:57 10.0.0.13 6886 bash 0]ls

[2003-07-23 20:04:01 10.0.0.13 6886 bash 0]mkdir ...

[2003-07-23 20:04:20 10.0.0.13 6886 bash 0]tcsh [2003-07-23 20:04:20 10.0.0.13 6921 tcsh 0]0 [2003-07-23 20:04:20 10.0.0.13 6920 tcsh 0]vt [2003-07-23 20:04:20 10.0.0.13 6920 tcsh 0]en [2003-07-23 20:04:20 10.0.0.13 6920 tcsh 0]en [2003-07-23 20:04:27 10.0.0.13 6920 tcsh 0]cd /tmp [2003-07-23 20:04:28 10.0.0.13 6920 tcsh 0]ls

[2003-07-23 20:04:42 10.0.0.13 6920 tcsh 0]cd /usr/lib [2003-07-23 20:04:42 10.0.0.13 6920 tcsh 0]ls

sbk_ks_log.pl 的輸出和使用者在終端看到的一樣,不過我們只能看到輸入的命 令,那些命令的輸出資訊是看不到的。控制字元會被轉義,比如回格鍵會替換成 [BS]。sbk_ks_log.pl 的每行輸出按照如下格式:

[ 時間戳記 IP 位址 進程 ID 命令 使用者 ID ] 文本

 時間戳記顯示擊鍵動作的時間。

60

 IP 地址是蜜罐的地址。

 進程 ID 是運行的進程 ID。

 命令是運行命令的前 10 個字元。

 使用者 ID 是這個進程擁有者的使用者 ID。

7.8 把 Sebek 資料導入資料庫

sbk_upload.pl 是一個把記錄導入到 mysql 資料庫的 perl 腳本,這個腳本有以下幾 個選項:

-u 資料庫使用者

-s 資料庫伺服器,預設是 localhost -d 資料庫庫名

-p 資料庫口令 -P 資料庫使用的埠

執行例子:

sbk_extract –i eth0 –p 1101 | sbk_upload.pl -u Sebek –p secret –d Sebek

上面的例子 sbk_extract 監聽 eth0 上 UDP 埠是 1101 的 Sebek 資料包,提取出來 的資料發送給 sbk_upload.pl,它把這些數 據插入到用戶名是“Sebek”、口令是

“secret”、資料庫名字叫“Sebek”的本地主機資料庫。附錄 A 定義了資料表結構,

當資料記錄插入到 mysql 資料庫後,就可以用 Web 介面來方便的查看這些 Sebek 資料。

7.9 Web 介面

sbk_upload.pl 是一個把記錄導入到 mysql 資料庫的 perl 腳本,這個腳本有以下幾 個選項:

61

-u 資料庫使用者

-s 資料庫伺服器,預設是 localhost -d 資料庫庫名

-p 資料庫口令 -P 資料庫使用的埠

執行例子:

sbk_extract –i eth0 –p 1101 | sbk_upload.pl -u Sebek –p secret –d Sebek

上面的例子 sbk_extract 監聽 eth0 上 UDP 埠是 1101 的 Sebek 資料包,提取出來 的資料發送給 sbk_upload.pl,它把這些數 據插入到用戶名是“Sebek”、口令是

“secret”、資料庫名字叫“Sebek”的本地主機資料庫。附錄 A 定義了資料表結構,

當資料記錄插入到 mysql 資料庫後,就可以用 Web 介面來方便的查看這些 Sebek 資料。

7.10 總結

Sebek 是一個基於內核的資料捕獲工具,它設計用來隱蔽的捕獲蜜罐上的所

Sebek 是一個基於內核的資料捕獲工具,它設計用來隱蔽的捕獲蜜罐上的所