蜜網中基於Linux平臺的蜜罐技術的研究

來源:中國論文下載中心    [ 08-05-01 15:39:00 ]    作者:王穎傑    編輯:studa0714


摘 要 傳統蜜罐有着不少的優點,比如收集數據的保真度,不依賴於任何複雜的檢測技術等。然而隨着應用的廣泛,傳統蜜罐的缺點也開始顯現了出來。取而代之的是由一組高交互用來獲取廣泛威脅信息的蜜罐組成的蜜網。本文針對蜜網中蜜罐所面臨的挑戰:捕獲工具隱藏、加密會話數據的捕獲、數據傳輸隱蔽通道,給出了詳細的解決方案。 

    關鍵詞 蜜罐;Linux;模塊隱藏;加密會話捕獲;隱蔽通道

 


1 引言

    蜜罐是一種安全資源,其價值在於被掃描、***和攻陷[1]。它以犧牲真實的沒有打補丁的操作系統(一般以Linux爲平臺)爲代價欺騙***者以達到採集******方法和保護真實主機目標。

    傳統蜜罐有着不少的優點,比如收集數據的保真度,蜜罐不依賴於任何複雜的檢測技術等[2],因此減少了漏報率和誤報率。使用蜜罐技術能夠收集到新的***工具和***方法,而不像目前的大部分***檢測系統只能根據特徵匹配的方法檢測到已知的***。但是隨着應用的廣泛,傳統蜜罐的缺點也開始暴露了出來,綜合起來主要有3個方面:

    1)蜜罐技術只能對針對蜜罐的***行爲進行監視和分析,其視圖不像***檢測系統能夠通過旁路偵聽等技術對整個網絡進行監控。

    2)蜜罐技術不能直接防護有漏洞的信息系統並有可能被***者利用帶來一定的安全風險。

    3)***者的活動在加密通道上進行( IPSecSSHSSL,等等)增多,數據捕獲後需要花費時間破譯,這給分析***行爲增加了困難。

    針對以上問題出現了蜜網技術[3]。蜜網技術實質上是一類研究型的高交互蜜罐技術,與傳統蜜罐技術的差異在於,蜜網構成了一個***誘捕網絡體系架構,在這個架構中,可以包含一個或多個蜜罐,同時保證了網絡的高度可控性,以及提供多種工具以方便對***信息的採集和分析。圖1給出了蜜網的結構及其蜜罐在蜜網中的位置。其中最爲關鍵的部件爲稱爲HoneyWall的蜜網網關,包括三個網絡接口,網卡1接入外網,網卡2連接蜜網,而網卡3作爲一個祕密通道,連接到一個監控網絡。HoneyWall是一個工作在鏈路層的橋接設備,作爲蜜網與其他網絡的惟一連接點,所有流入流出蜜網的網絡流量都將通過HoneyWall,並受其控制和審計,同時不會對網絡數據包進行 TTL 遞減和網絡路由,也不會提供本身的 MAC 地址,因此對***而言,HoneyWall 是完全不可見的,因此***不會識別出其所***的網絡是蜜網。

 

 

2  蜜網中蜜罐所面臨的挑戰

    蜜網是一個體繫結構,成功地部署一個蜜網環境,這裏有兩個嚴格的需求,這也是針對傳統蜜罐的缺點而提出來的。這兩個需求是:數據控制和數據捕獲[3]

    數據控制就是限制***者活動的機制,它可以降低安全風險。這是圖1中蜜網網關所要做的一部分工作。

    數據捕獲就是監控和記錄所有***者在蜜網內部的活動,包括記錄加密會話中擊鍵,恢復使用SCP拷貝的文件,捕獲遠程系統被記錄的口令,恢復使用保護的二進制程序的口令等[4]。這些捕獲的數據將會被用於分析,從中學習***界成員們使用的工具、策略以及他們的動機。這正是蜜罐所要做的工作。

    這其中的難點就是:

    1)使***無法偵測到數據捕獲這個進程的同時蒐集儘可能多的數據。

    2)***們越來越多的使用加密工具來保護他們的傳輸通道。如果目標機器沒有安裝加密服務,那麼他們也會自己安裝上如SSH、加密的GUI客戶端或者SSL等服務。如果沒有密鑰,基於網絡的數據捕獲工具將無法察看傳輸的數據。

    3)要將收集到的數據通過一個祕密通道彙總到蜜牆中的數據收集服務器。

3  解決方案

3.1 捕獲工具隱藏

3.1.1 隱藏模塊

    捕獲數據的工具是以模塊化的機制[5]Linux系統啓動後動態地加載到內核成爲內核的一部分進行工作的。當捕獲程序的模塊被加載到內核時,一個記載已加載模塊信息的安裝模塊鏈表裏面就記錄下已加載模塊的信息,用戶可以通過內存裏動態生成的proc文件系統[6]下的module文件來查看到。當特權用戶root調用/sbin/insmod命令加載模塊時會有一個系統調用sys_create_module()[7],這個函數在Linux2.4的源代碼中位於kernel/module.c。它會將含有新加載的模塊信息的數據結構struct module插入到名爲moudle_list的模塊鏈表中去。

281    sys_create_module(const char *name_usersize_ t size)

282   {

        ……

309    mod->next = module_list

310    mod->name = (char *)(mod + 1)

311    mod->size = size

312    memcpy((char*)(mod+1)namenamelen+1)

313 

314    put_mod_name(name)

315

316    module_list = mod; 

       ……

325   }

    可以看出當一個模塊加載時,它被插入到一個單向鏈表的表頭。***們在攻入蜜罐系統後,可以根據以上存在的漏洞,找出他們認爲是可疑的蜜罐捕獲模塊並從內核卸載模塊,這樣蜜罐也就失去了它的功能。

    爲了達到隱藏模塊的目的就必須在加載模塊後,將指向該模塊的鏈表指針刪除,這樣通過遍歷表查找時就再也無法找到該模塊了,實現的代碼如下:

……

struct module *mod_current

mod_current = &__this_module

While (mod_current.next)

 if (strcmp(mod_current.nextstr))    /*str爲模塊的名稱*/

   { mod_current.next = mod_current.next->next  /*刪除了數據捕獲模塊*/

    break

}

else mod_current=mod_current.next; 

 }

……

3.1.2 進程隱藏

    進程是一個隨執行過程不斷變化的實體。在Linux系統運行任何一個命令或程序系統時都會建立起至少一個進程來執行。這樣蜜罐捕獲程序必定會在系統中運行多個進程,利用類似於ps這樣查詢進程信息的命令便可以得到所有的進程信息,這樣很容易就會暴露蜜罐的存在。由於在Linux中不存在直接查詢進程信息的系統調用,類似於ps這樣查詢進程信息的命令是通過查詢proc文件系統來實現的。proc文件系統是一個虛擬的文件系統,它通過文件系統的接口實現,用於輸出系統運行狀態。它以文件系統的形式,爲操作系統本身和應用進程之間的通信提供了一個界面,使應用程序能夠安全、方便地獲得系統當前的運行狀況以及內核的內部數據信息,並可以修改某些系統的配置信息。由於proc以文件系統的接口實現,因此可以象訪問普通文件一樣訪問它,但它只存在於內存之中,因此可以用隱藏文件的方法來隱藏proc文件系統中的文件,以達到隱藏進程的目的。

    首先必須瞭解查詢文件信息的原理。Linux系統中用來查詢文件信息的系統調用是sys_getdents(),當查詢文件或者目錄的相關信息時,Linux系統用sys_getedents()函數來執行相應的查詢操作,並把得到的信息傳遞給用戶空間運行的程序,所以如果修改該系統調用,去掉結果中與proc文件系統中的特定文件的相關信息,那麼所有利用該系統調用的程序將看不見該文件,這樣就實現了進程的隱藏。

    判斷文件是否屬於proc文件系統是根據它只存在於內存之中,不存在於任何實際設備之上這一特點,所以Linux內核分配給它一個特定的主設備號0

及一個特定的次設備號1[7],除此之外在外存上沒有與之對應的i節點,所以系統也分配給它一個特殊的節點號PROC_ROOT_INO(值爲1),而設備上的1號索引節點是保留不用的。這樣可以得出判斷一個文件是否屬於proc文件系統的方法。 

    (1) 得到該文件對應的inode結構d_inode

    (2) if (d_inode->i_ino == PROC_ROOT_INO && !MAJOR(d_inode->i_dev) &&

MINOR(d_inode-> i _dev)  == 1)  {該文件屬於proc文件系統}

    再來看一下查詢文件系信息系統調用的原型:

    int sys_getdents(unsigned int fdstruct dirent *dirpunsigned int count)

其中fd爲指向目錄文件的文件描述符,該函數根據fd所指向的目錄文件讀取相應dirent結構,並放入dirp中,其中countdirp中返回的數據量,正確時該函數返回值爲填充到dirp的字節數。

    通過上面的分析,給出隱藏特定進程的僞碼錶示: 

Hiding_Proc(unsigned int fdstruct dirent *dirpunsigned int count)

 { /*調用原來的系統調用*/

sys_getdents(fd&dirpcount)

得到fd所對應的節點;    

if(該文件屬於proc文件系統&&該文件名需要隱藏

{dirp中去掉該文件相關信息

}

3.2  捕獲加密會話數據

    爲了觀察***者使用加密的會話,就必須找到破解加密會話的方法,不過許多組織已經證明這是非常困難的。強攻不行就只能智取,加密的信息如果要使用就肯定會在某些地方不是被加密的,繞過加密進程就可以捕獲未加密的數據。這是解密工作的基本機制,然後獲得訪問未保護的數據。使用二進制***程序是對付加密的一種辦法。當***者攻破蜜罐,他可能會使用如SSH的加密工具來登陸被攻陷的主機,登陸的時候肯定要輸入命令,這時***shell程序會記錄他們的動作。不過二進制***程序隱蔽性不高,而且***者可能會安裝他們自己的二進制程序。

    從操作系統內核訪問數據將是一個很好的捕獲方法。不管***者使用什麼二進制程序,都可以從內核捕獲數據並且可以記錄它們的行爲。而且,由於用戶空間和內核空間是分開的,所以在技術上還可以實現對所有包括root在內的用戶隱藏自己的動作。圖2中左邊的數據捕獲機制說明了其工作的原理。

    數據捕獲是由內核模塊來完成的,所以要使用這個模塊獲得蜜罐機操作系統內核空間的訪問,從而捕獲所有read()write()的數據。捕獲模塊通過替換系統調用表的read()write()函數來實現這個功能,這個替換的新函數只是簡單的調用老read()write()函數,並且把內容拷貝到一個數據包緩存。見圖2中的步驟

 

 

加密會話數據捕獲及隱蔽傳輸通道原理


    替換原來的函數就是改變系統調用表的函數指針。當用戶空間的進程調用標準的read()write()函數的時候會產生一個系統調用,這個調用映射到系統調用表數組的索引偏移。因爲捕獲模塊把readwrite索引的函數指針修改指向到它自己的函數實現,所以當執行到內核的read實現時就會執行捕獲模塊修改後的readwrite調用,捕獲模塊通過這個系統調用看到所有訪問的數據。這個技術同樣可以用來修改想要監視的任意系統調用。

3.3  數據傳輸隱蔽通道的建立

    當蜜罐捕獲到數據後,那麼它需要在***者沒有察覺的情況下把數據發送到蜜網網關服務端。蜜罐通常都是佈置在局域網內,如果捕獲模塊只是簡單使用UDP流來給服務端發送數據,***者只需監聽網絡上的數據傳輸就可以判斷是否有蜜罐系統的存在了。不過捕獲模塊還是可以使用UDP來給服務端發送數據,只不過它需要修改內核使用戶無法看到這些數據包,包括其它主機發送的該類型使用相同配置的數據包。當捕獲模塊把這些數據發送到網絡的時候,操作系統也無法阻止這些數據包的傳輸。

    如果一個局域網上每個蜜罐安裝了按照以上方法改進後的數據捕獲模塊,***者將不能發現任何捕獲模塊的數據,然而服務端能夠完全訪問這些由蜜罐客戶端捕獲的數據。每個read()write()調用請求都會產生一個或多個日誌數據包,每個數據包都包含了一點關於這個調用內容的信息和這個調用訪問的數據。每個包還包含了一個記錄,這個記錄包含一些產生調用的進程描述、調用產生的時間和記錄數據的大小。這些包完全由捕獲模塊產生,而不是使用TCP/IP協議棧來產生或發送數據包,所以系統無法看到或阻斷這些數據包。當數據包創建好的時候就直接發送給驅動設備,這就繞過了原始套接字代碼和包過濾代碼。由於嗅探器通常都是基於libpcap的,而libpcap使用原始套接字接口來收集數據包,所以嗅探器不能看到運行在蜜罐主機上由捕獲模塊產生的數據包。

    2中右邊的發送機制給出了產生的數據包怎樣繞過協議棧並且直接發送到網絡設備驅動的方法,見步驟。這使得***者檢測蜜罐捕獲數據的活動非常困難,因爲捕獲蜜罐產生自己的數據包且直接通過設備驅動發送它們,所以用戶無法使用IPTABLES來阻斷數據包,也無法用網絡嗅探器來監視它們,這也防止了蜜罐上的***者通過檢查局域網數據傳輸來檢測是否有捕獲工具。

    同時還有一個要解決的問題,就是要阻止蜜罐A檢測到蜜罐B的捕獲到的數據包。使用以太交換不能解決這個問題,因爲數據包不是通過ARP獲取目標IP地址對應的目標MAC地址,所以它對ARP欺騙有自然免疫能力。但是在有些情況下,A可以看到B的數據包,這樣***者就可以在蜜罐A運行嗅探器來看到局域網上來自蜜罐B的捕獲到的數據包。爲了解決這個問題,捕獲模塊的包產生機制應該實現自己獨特的原始套接字實現,從而實現安靜地忽略來自局域網中的其他蜜罐發送出數據包。在發送的數據包頭定義了預先設定的目標UDP端口和固有的特定數字,如果這兩個值都匹配了,那麼這個數據包就會被忽略。這樣蜜罐A在收到蜜罐B的數據包時就會丟棄它們並且移到隊列裏的下一個數據包,這使得***者用嗅探器也無法捕獲數據包。

4  結論

    針對傳統的蜜罐的侷限性和缺點,出現了蜜網技術,它實質上也是一種蜜罐技術,與傳統蜜罐不同的是,蜜網是由許多用來與***者進行交互的蜜罐組成的網絡。本文針對蜜網中蜜罐所面臨的問題:隱藏自身、加密會話數據捕獲以及和蜜網網關建立隱蔽數據傳輸通道,給出了詳細的解決方案。但同時也存在着一些不足,比如本文中所提到的隱藏蜜罐數據捕獲模塊和進程的方法,雖然達到了保護自身的目的,但也帶來了一些負面問題:捕獲模塊被加載就再也無法卸載,root用戶再也無法找到它,一旦捕獲模塊中出現bug,由於無法管理,可能會引起內核的不穩定甚至系統崩潰等,這將會影響到蜜罐的正常工作,從而影響整個蜜網的性能。這些問題都有待進一步的研究。

參考文獻

[1] L.Spitzner“Honeypot-Definitions and Value of Honeypots” 2003http//www.tracking-hackers.com/papers/ honeypots.html

[2] L.Spitzner”HoneypotsCatching the Insider Threat”Proceedings of the 19th Annual Computer Security Applications ConferenceLas VegasNevadaUSADecember 08–122003

[3]Know Your Enemy: Honeynets - 12 November2003http//www.honeynet.org/papers/honeynet/index.html

[4]Know Your Enemy: GenII Honeynets - 03 November2003http//www.honeynet.org/papers/honeynet/index.html

[5][] Jonathan CorbetAlessandro RubiniGreg Kroah- HartmanLinux Device Drivers3rd  EditionO`REILLY2006.01

[6] [] Kurt Wall 等著、張輝譯.GNU/Linux編程指南(第二版).清華大學出版社,2005.08

[7] 毛德操、胡希明 著.Linux內核源代碼情景分析.浙江大學出版社,2002.04

 

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