Sebek學習筆記

 

1、Sebek是一個數據捕獲工具。

2、Sebek是運行在內核空間的一段代碼,記錄系統用戶存取的一些或者全部數據。

    這個工具有這些功能:記錄加密會話中擊鍵,恢復使用SCP拷貝的文件,捕獲遠程系統被記錄的口令,恢復使用 Burneye保護的二進制程序的口令還有其它的一些入侵分析任務相關的作用。
    入侵者會使用加密工具來保護他們的傳輸通道,監視者如果沒有密鑰,基於網絡的數據捕獲工具將無法察看傳輸的數據,因此採用基於內核的Sebek來捕獲數據。

3、Sebek有兩個組成部分:客戶端和服務端。客戶端從蜜罐捕獲數據並且輸出到網絡讓服務端收集(參考圖1所示)。服務端有兩種方式收集數據:第一種是直接從網絡活動的數據包捕獲,第二種是從tcpdump格式保存的數據包文件。當數據收集後既可以上傳到相關數據庫,也可以馬上顯示擊鍵記錄。Sebek使用無連接、不可靠的UDP協議進行通信。


4、數據捕獲是由內核模塊來完成的,我們使用這個模塊獲得蜜罐內核空間的訪問,從而捕獲所有read()的數據。Sebek替換系統調用表的read()函數來實現這個功能,這個替換的新函數只是簡單的調用老read()函數,並且把內容拷貝到一個數據包緩存,然後加上一個頭,再把這個數據包發送到服務端。替換原來的函數就是改變系統調用表的函數指針。

5、爲了使Sebek模塊更加隱蔽,我們使用了一些如Adore等基於LKM的rootkit的技術。由於Sebek完全駐留在內核空間中,那麼我們可以通過安裝第二個cleaner模塊來隱藏Sebek模塊,這個模塊把Sebek從安裝模塊鏈表中刪除記錄。

6、Sebek客戶端如何祕密的向服務端發數據報文。
    當Sebek客戶端捕獲數據,那麼它需要在入侵者沒有察覺的情況下把數據發送到服務端。這些報完全Sebek產生,而不是使用TCP/IP協議棧來產生或發送數據包,所以系統無法看到或阻斷這些數據包。當數據包創建好的時候就直接發送給驅動設備,這就繞過了原始套接字代碼和包過濾代碼。由於嗅探器是基於libpcap 的,而libpcap使用原始套接字接口來收集數據包,所以嗅探器不能看到運行Sebek主機上由Sebek產生的數據包。

     第二個要解決的問題是需要阻止蜜罐A檢測到蜜罐B的Sebek數據包。爲了解決這個問題,Sebek安裝了自己的原始套接字實現。在Sebek數據包頭定義了預先設定的目標 UDP端口和固有的魔術數字,如果這兩個值都匹配了,那麼這個數據包就會被忽略。這個簡單的實現不會對Sebek數據包有影響,只是丟棄它們並且移到隊列裏的下一個數據包,這使得入侵者即使使用嗅探器也無法捕獲Sebek數據包。

7、Sebek的協議格式

    爲了確保所有版本的Sebek能協同工作定義了一個通用的協議。客戶端和服務端的通信通道是單向的,只能從客戶端發送數據包給服務端。這個通道使用UDP協議,每個數據包都包含一個記錄,記錄有不同長度的MTU和一個固定長度的頭。這個48字節的頭結構如下

這個頭在IP/UDP頭後面,其後跟隨蜜罐活動表現的數據(攻擊者的擊鍵、文件、密碼等)
字段名               數據類型                 描述
Magic            Unsigned 32 bit Int      前面是目標端口,Sebek使用Magic來識別那些數據包需要隱藏
Version          Unsigned 16bit Int       Sebek協議版本
Type              Unsigned 16bit Int       記錄的類型。讀數據是0,寫數據是1。目前只實現了讀。
Counter          Unsigned 32bit Int       PDU計數器,用來識別數據包什麼時候丟失。剛安裝時計數器是0
Time_sec       Unsigned 32bit Int       蜜罐從UNIX紀元開始的秒數
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實體的長度。Length字段基於讀請求返回的長度。如果從read()調用返回數據的長度大於局域網的MTU,Sebek會把
                                                      讀到的數據分成多個分片以適應局域網傳輸。每個分片都包含了完整的Sebek記錄頭。

8、Sebek的配置

    在linux系統下要修改腳本文件skb_install.sh,這個腳本有八個配置參數,一般局域網上所有蜜罐都要使用相同的值。windows下的配置需要雙擊Configuration Wizard.exe。

    接口:指定記錄哪個接口,默認是eth0。不需要配置IP地址。
    目標IP:這個字段定義了所有產生的Sebek數據包使用的目標IP地址。由於Sebek服務端收集數據包的時候不看目標IP地址,所以這裏無需配置成Sebek服務端的IP,而且也不推薦,否則入侵者看到這些數據包的時候有機會知道哪個主機是Honeynet裏提供數據控制功能的。
    目標MAC地址:這個字段指定蜜罐使用目標以太MAC地址,目標MAC可以設置成缺省網關的。把它設置成FF:FF:FF:FF:FF:FF將引起所有的包廣播到局域網上每個主機,這是測試的小技巧。
    Magic值:這個值結合目標端口,用來確定蜜罐上哪個包需要隱藏。強烈推薦局域網上所有安裝的Sebek都使用相同的Magic值和目標端口。
    目標UDP端口: 這個字段定義Sebek數據包的目標UDP端口。這個值結合Magic值,用來確定蜜罐上哪個包需要隱藏。
    源UDP端口:這個字段定義了Sebek數據包的源UDP端口。
    只記錄擊鍵:這個標記可以設定成1或0。設置成1,那麼Sebek只收集擊鍵,否則將收集所有讀到的數據。如果你想恢復SCP文件,必須設置成0。
    測試:如果設置了測試選項,那麼首先內核模塊不會隱藏,第二,模塊將產生的額外調試信息,並且會發送到syslog。

    當在一個局域網裏配置蜜罐的時候,它們必須使用相同的magic值和目標端口值,這樣就能防止才一個蜜罐看到其它的Sebek數據包。配置IP和MAC地址的時候,請記住MAC地址是最重要的。如果你配置了錯誤的目標IP地址,但是MAC地址配置正確了,並且UDP端口也是正確的,那麼Sebek記錄就能發送到服務端。此外,當服務端運行在Honeywall網關的時候,網卡接口沒有設置IP地址,所以必須把目標MAC地址設置成缺省網關或Honeywall的MAC地址。如果你要記錄遠程主機(不在同一個局域網內),那麼目標IP必須設置成主機的IP,MAC地址要設置成局域網缺省網關的MAC地址。

9、如何恢復從客戶端來的Sebek數據

    服務端提取網絡上Sebek客戶端數據有兩個來源,一個是捕獲所有網絡數據的tcpdump日誌文件,另外一個是直接從網卡捕獲活動的數據傳輸。
    服務端有三個組成部分。第一個部分叫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,並且把輸出用管道傳給自己設計的程序來分析。

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
  格式:[時間戳 IP地址 進程ID 命令 用戶ID ] 文本

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數據。

    Sebek現在提供了一個基於Web的分析接口,這個接口給用戶提供監視擊鍵活動、搜索指定活動、獲得SCP傳送的文件的能力,並且使得數據更易瀏覽。這個接口用PHP實現,並且檢查數據只能是在數據庫內,而不能是其它如捕獲的數據包或系統日誌。它設計成支持調查取證的工作流程,可以像ethereal分析捕獲數據包一樣分析Sebek數據。這個接口有三個主要選項:查看擊鍵、搜索、瀏覽。
    擊鍵摘要提供所有擊鍵活動的彙總。
    搜索運行用戶查詢指定信息的能力。
    瀏覽或表格提供了所有除擊鍵以外所有的活動。

10、Sebek數據庫

    Sebek數據庫只使用一個簡單的表,除了insert_time字段用於表示記錄什麼時候插入數據庫,大部分字段和Sebek記錄字段格式一模一樣。
CREATE TABLE read_data (
id          INT         UNSIGNED AUTO_INCREMENT,
ip_addr     INT         UNSIGNED NOT NULL,
insert_time TIMESTAMP   default 'now()',
time        DATETIME    NOT NULL,
command     CHAR(20)    NOT NULL,
counter     INT         UNSIGNED NOT NULL,
filed       INT         UNSIGNED NOT NULL,
pid         INT         UNSIGNED NOT NULL,
uid         INT         UNSIGNED NOT NULL,
length      INT         UNSIGNED NOT NULL,
data        BLOB,
PRIMARY KEY ( id ),
INDEX time_idx( time ),
INDEX ip_idx ( ip_addr),
INDEX ip_time_idx(ip_addr, time),
INDEX ip_pid_idx ( ip_addr, pid)
);

參考:

Sebek蜜罐介紹: http://www.51cto.com/art/200510/7023.htm
瞭解你的敵人:Sebedhttp://wenku.baidu.com/view/5707c7d284254b35eefd3409.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章