◆張 駿
(長沙醫(yī)學(xué)院信息工程學(xué)院 湖南 410219)
Honeypot中數(shù)據(jù)捕獲的設(shè)計(jì)與實(shí)現(xiàn)
◆張 駿
(長沙醫(yī)學(xué)院信息工程學(xué)院 湖南 410219)
本文先對Honeypot技術(shù)作了簡要介紹,重點(diǎn)對數(shù)據(jù)捕獲進(jìn)行了設(shè)計(jì)。數(shù)據(jù)捕獲是Honeypot系統(tǒng)中最關(guān)鍵的數(shù)據(jù)模塊。獲取攻擊者的信息都是來自于數(shù)據(jù)捕獲。為了數(shù)據(jù)捕獲的可靠性,本文采用sebek和libpcap雙層數(shù)據(jù)包捕獲。
Honeypot;數(shù)據(jù)捕獲;sebek;libpcap
主動防御技術(shù)是近幾年發(fā)展比較快的網(wǎng)絡(luò)安全技術(shù)。傳統(tǒng)的防御措施主要是依靠防火墻(firewall)以及入侵檢測系統(tǒng)(IDS),卻無法有效對付來自內(nèi)網(wǎng)的攻擊及IP地址欺騙攻擊等。相比于傳統(tǒng)的被動型的網(wǎng)絡(luò)安全技術(shù),主動防御技術(shù)能夠變被動為主動,主動地引誘攻擊者,并對攻擊者的信息進(jìn)行數(shù)據(jù)捕獲,并以此進(jìn)行分析研究,以便以后更有針對性地加強(qiáng)網(wǎng)絡(luò)安全。Honeypot技術(shù)正是這一新型防御機(jī)制的典型代表。
本文以主動防御系統(tǒng)中應(yīng)用比較廣泛的Honeypot為基礎(chǔ),重點(diǎn)對數(shù)據(jù)捕獲進(jìn)行了設(shè)計(jì)。數(shù)據(jù)捕獲是Honeypot中最重要的一環(huán),我們只有捕獲到了攻擊者的數(shù)據(jù),才能深入掌握對方信息,分析其意圖,并采取相關(guān)措施,否則Honeypot便毫無意義。為了數(shù)據(jù)捕獲的可靠性,我們采用sebek和libpcap雙層數(shù)據(jù)包捕獲。
Honeypot意指蜜罐,它是一種對攻擊者進(jìn)行欺騙的技術(shù),通過布置一些作為誘餌的主機(jī)和網(wǎng)絡(luò)服務(wù)誘使攻擊者對它們進(jìn)行攻擊,以此減少對實(shí)際系統(tǒng)的攻擊,并且對攻擊行為進(jìn)行監(jiān)控和分析,了解攻擊者所使用的工具和方法,從而使網(wǎng)絡(luò)管理員通過技術(shù)和管理手段來增強(qiáng)系統(tǒng)的安全防護(hù)能力。這樣安全研究人員就可以全面控制和監(jiān)視所有攻擊活動,了解攻擊者的方法,掌握其動機(jī),這其中數(shù)據(jù)捕獲就尤為重要。數(shù)據(jù)捕獲,即監(jiān)控和記錄攻擊者在 Honeypot內(nèi)的所有行為,最大限度地搜集盡可能多的數(shù)據(jù),而又不被攻擊者所察覺。
為了提高數(shù)據(jù)捕獲的可靠性,一般采用多層次的數(shù)據(jù)共享或者采用虛擬主機(jī)技術(shù)模擬數(shù)據(jù)包廣播功能。本論文設(shè)計(jì)了一種雙層數(shù)據(jù)包融合機(jī)制,將sebek技術(shù)和libpcap技術(shù)相融合,分析數(shù)據(jù)包的流程以及時延,從而獲取更加可靠和全面的數(shù)據(jù)。
2.1 Sebek數(shù)據(jù)捕獲
Sebek基于Linux內(nèi)核系統(tǒng)開發(fā)的一個專業(yè)的數(shù)據(jù)包捕獲工具,我們設(shè)計(jì)的使用無連接、不可靠的UDP協(xié)議進(jìn)行通信,Sebek數(shù)據(jù)捕獲分成兩個組成部分:客戶端和服務(wù)端??蛻舳素?fù)責(zé)捕獲數(shù)據(jù)并且適時輸出到遠(yuǎn)程網(wǎng)絡(luò)服務(wù)端。服務(wù)端負(fù)責(zé)數(shù)據(jù)收集,一般采用直接從網(wǎng)絡(luò)活動的數(shù)據(jù)包捕獲。若攻擊者數(shù)據(jù)沒有加密,則通過Wireshark工具反編譯TCP流得知會話內(nèi)容并記錄入侵者輸入的信息。如果入侵者有加密的數(shù)據(jù)流,則采用JavaScript加密庫 Crypto-JS標(biāo)準(zhǔn)機(jī)制或哈希算法解密數(shù)據(jù),然后再獲取解密了的數(shù)據(jù)包。還有一種情況可以直接從tcpdump格式保存數(shù)據(jù)包文件,數(shù)據(jù)收集后既可以上傳到相關(guān)數(shù)據(jù)庫,也可以直接顯示輸出記錄。
在Linux中,客戶端完全進(jìn)駐內(nèi)核空間,作為一個可加載內(nèi)核模塊被執(zhí)行,可以當(dāng)作運(yùn)行在內(nèi)核空間的一段代碼來對待。數(shù)據(jù)捕獲通過內(nèi)核模塊實(shí)現(xiàn)我們訪問Honeypot內(nèi)核的功能,并且捕獲所有的read()函數(shù)的活動數(shù)據(jù)。函數(shù)調(diào)用過程中Sebek通過系統(tǒng)調(diào)用表中的read()來實(shí)現(xiàn),新舊read()替換調(diào)用,并且復(fù)制數(shù)據(jù)包,把函數(shù)調(diào)用內(nèi)容存儲到到緩存中,再加上指向頭部的指針棧,形成一個數(shù)據(jù)流,并發(fā)送到服務(wù)端。
系統(tǒng)調(diào)用是在有條件的情況下才能執(zhí)行,一般當(dāng)用戶進(jìn)程訪問read()函數(shù)時會產(chǎn)生一個系統(tǒng)調(diào)用,而且Sebek修改了指向read索引的指針,因此用戶空間的read()函數(shù)調(diào)用映射到系統(tǒng)調(diào)用表引起數(shù)組的索引偏移,所以系統(tǒng)調(diào)用的執(zhí)行就會切換到kernel context,并且開始執(zhí)行Sebek的新read調(diào)用。這樣Sebek就能監(jiān)控到通過read系統(tǒng)調(diào)用訪問的所有數(shù)據(jù)。當(dāng)Sebek客戶端開始捕獲數(shù)據(jù),通常要在不被入侵者發(fā)現(xiàn)的情況下向服務(wù)器發(fā)送數(shù)據(jù)。Sebek采用無連接的不可靠的UDP協(xié)議來向服務(wù)器傳輸數(shù)據(jù),不過,在它傳輸之前修改部分內(nèi)核來防止用戶看見這些數(shù)據(jù)包。Sebek生成的數(shù)據(jù)包直接將其發(fā)送至設(shè)備驅(qū)動,用戶無法用IPTABLES阻止這些數(shù)據(jù)包或者使用網(wǎng)絡(luò)嗅探器來檢測它們,這樣保證了真正主機(jī)的安全。
2.2 Libpcap數(shù)據(jù)捕獲
本文設(shè)計(jì)的Libpcap是一個與實(shí)現(xiàn)無關(guān)的基于Unix/Linux平臺下的分組捕獲函數(shù)庫,目前只支持分組的讀取一個的網(wǎng)絡(luò)數(shù)據(jù)包捕獲函數(shù)庫,我們增加了一些代碼之后,使之可以寫數(shù)據(jù)鏈路分組。它是一個獨(dú)立于系統(tǒng)的用戶層包捕獲的API接口,為底層網(wǎng)絡(luò)監(jiān)測提供了一個可移植的框架,主要由兩部份組成:網(wǎng)絡(luò)分接頭(Network Tap)和數(shù)據(jù)過濾器(Packet Filter)。兩部份功能互為補(bǔ)充共享,其中Network Tap搜集來自網(wǎng)絡(luò)設(shè)備驅(qū)動程序中的數(shù)據(jù)包,并將搜集到的數(shù)據(jù)包自我復(fù)制一份。Packet Filter則采用BSD Packet Filter(BPF)算法對網(wǎng)卡接收到的數(shù)據(jù)鏈路層數(shù)據(jù)包進(jìn)行過濾。網(wǎng)卡驅(qū)動將接收到的數(shù)據(jù)包復(fù)制一份交給BPF過濾器,過濾器根據(jù)用戶定義的規(guī)則決定是否接收此數(shù)據(jù)包以及需要拷貝該數(shù)據(jù)包的哪些內(nèi)容,然后將過濾后的數(shù)據(jù)包交給與過濾器相關(guān)聯(lián)的上層應(yīng)用程序。
數(shù)據(jù)捕獲時,我們把網(wǎng)卡設(shè)置成混合模式,在數(shù)據(jù)鏈路層加一個旁路處理,數(shù)據(jù)包經(jīng)過七層傳輸最后達(dá)到網(wǎng)絡(luò)接口時,libpcap用已經(jīng)創(chuàng)建的Socket從鏈路層驅(qū)動程序中獲得該數(shù)據(jù)包的拷貝,再通過Tap函數(shù)將數(shù)據(jù)包發(fā)給BPF過濾器,libpcap 數(shù)據(jù)捕。
我們用C語言寫出它的源代碼如下: