由于網(wǎng)友的要求和關(guān)注,本人計劃以實現(xiàn)IDS內(nèi)容恢復(fù)和內(nèi)容檢測為目標(biāo),寫一下協(xié)議恢復(fù)的編程實現(xiàn),開發(fā)環(huán)境 linux。由于本人技術(shù)能力和時間有限,其內(nèi)容在以后逐步編寫發(fā)布,內(nèi)容有錯誤等,請大家指正。
大家對此有什么要求和看法,均可提出。
目錄
1、協(xié)議恢復(fù)接收數(shù)據(jù)部分
2、如何處理接收到的數(shù)據(jù)
3、處理保存的數(shù)據(jù)
4、內(nèi)容檢測
5、需要的知識
1、協(xié)議恢復(fù)接收數(shù)據(jù)部分
軟件環(huán)境:linux+mysql
硬件環(huán)境:網(wǎng)卡
設(shè)置網(wǎng)卡為混雜模式,這樣網(wǎng)卡就可以監(jiān)聽網(wǎng)絡(luò)上的數(shù)據(jù)。
本文對于接收網(wǎng)絡(luò)數(shù)據(jù)是通過接收mmap io輸入的原始數(shù)據(jù)包,經(jīng)過一系列的處理,產(chǎn)生用于內(nèi)容恢復(fù)、連接審計、實時監(jiān)控的輸出。本文只介紹內(nèi)容恢復(fù)(包括內(nèi)容檢測),其他部分雷同。
如下圖所示:
第一步:打開原始socket,為了接收數(shù)據(jù)。
if ((fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
perror("socket()");
return 1;
}
第二步:設(shè)置MMAP BUF大小等。
req.tp_block_size = BLOCK_SIZE;
req.tp_block_nr = BLOCK_NR;
req.tp_frame_size = FRAME_SIZE;
req.tp_frame_nr = FRAME_NR;
setsockopt(fd, SOL_PACKET, PACKET_RX_RING, (char *)&req, sizeof(req))
關(guān)于packet mmap的使用見http://pusa.uv.es/~ulisses/packet_mmap/packet_mmap.txt
所說的:
From the system calls stand point, the use of PACKET_MMAP involves
the following process:
[setup] socket() -------> creation of the capture socket
setsockopt() ---> allocation of the circular buffer (ring)
mmap() ---------> maping of the allocated buffer to the
user process
[capture] poll() ---------> to wait for incoming packets
[shutdown] close() --------> destruction of the capture socket and
deallocation of all associated
resources.
http://pusa.uv.es/~ulisses/packet_mmap/tmp/RFCDocumentation%20PACKET_MMAP%20memory%20allocation_new.txt
3、處理保存的數(shù)據(jù) 我們保存的數(shù)據(jù)可以是以IP,PORT,時間等關(guān)鍵字來保存,對于TCP協(xié)議來說,一個文件就是一個完整的TCP連接了,那么現(xiàn)在就可以讀取文件來恢復(fù)數(shù)據(jù)了。 一般我們可以按照PORT來劃分協(xié)議,比如21端口是FTP,23端口是TELNET,80端口是HTTP等,但有寫協(xié)議可能以其他端口出現(xiàn),例如HTTP,可以是8000,8080等等,可以根據(jù)數(shù)據(jù)內(nèi)容來判斷協(xié)議。 假如是HTTP協(xié)議,HTTP:根據(jù)客戶端“GET、HEAD、POST”和服務(wù)端“200 OK”來判斷是否是一個完整的請求,同時獲取URL;
根據(jù)“Host:”來獲取域名;
根據(jù)“Content-Type:”來判斷文件類型;
根據(jù)“Content-Encoding: gzip”來判斷GZIP;
根據(jù)“Transfer-Encoding: chunked”來判斷是否以chunked方式編碼傳輸。
例如SMTP協(xié)議,先根據(jù)“EHLO”或“HELO”獲取用戶名,如果有認(rèn)證,就根據(jù)“AUTH PLAIN”或“AUTH LOGIN”信息來獲取用戶名,它們都是以BASE64編碼(AUTH FOOBAR、AUTH CRA-MD5、AUTH DIGEST-MD5等);
根據(jù)“MAIL FROM:”,“SEND FROM:”,“SOML FROM:”來獲取發(fā)件人;
根據(jù)“RCPT TO:”來獲取收件人,這里收件人會是多個;
郵件的主體在“DATA”后面,郵件的主題從郵件里獲取“Subject:”;
根據(jù)“Content-type: multipart/mixed;”來判斷是否有附件,注意有的附件是以“begin”開始,“end”結(jié)束的。
根據(jù)服務(wù)端返回“250”來判斷郵件結(jié)束,后面如果還有DATA,那就繼續(xù)分析一個新的郵件。
這里對協(xié)議分析,我就簡單介紹一下,其他協(xié)議也一樣。根據(jù)自己的情況來增加所需要的協(xié)議。
4、內(nèi)容檢測 內(nèi)容檢測是在內(nèi)容恢復(fù)的基礎(chǔ)上進(jìn)行的,我們上面已經(jīng)對數(shù)據(jù)進(jìn)行協(xié)議恢復(fù),那么就可以根據(jù)我們設(shè)置的關(guān)鍵字進(jìn)行檢測了,對于一些數(shù)據(jù)是進(jìn)行編碼的,那么我們就需要解碼后進(jìn)行檢測,例如SMTP,POP3等很多是mime編碼后的數(shù)據(jù),例如HTTP數(shù)據(jù)有的是GZIP編碼,有的加了CHUNKED等等。 我這里只是提一下,大家可以根據(jù)自己的想法,發(fā)揮想象能力,做出更好的內(nèi)容來。
5、需要的知識
A、基礎(chǔ)知識,包括C,linux操作,socket等。
B、packet mmap io知識
C、算法 ,如AVL,hash,qsort,bm等,好的算法,提高處理效率。
D、編碼知識,如BASE64,QP,GZIP,HZ,BIG5等。
E、協(xié)議知識,大量RFC等協(xié)議實現(xiàn)。
F、其他經(jīng)典程序,如snort,tcpdump等都有此類似功能。


