羅利明 伍淳華 袁開國
北京郵電大學(xué)信息安全中心 北京 100876
本文在吸收前人研究的成果上,設(shè)計了一個Windows下的基于NDIS(Network Driver Interface Specification)的Web郵件發(fā)送和接收監(jiān)控系統(tǒng)。鑒于監(jiān)控通過Web進(jìn)行郵件接收的研究目前較少,本文重點針對Web郵件接收內(nèi)容的特點,提出了對Web接收郵件內(nèi)容監(jiān)控的解決方案。針對Web服務(wù)器在發(fā)送或接收一封 Web郵件時,一封郵件會分多次 TCP傳輸?shù)碾y題,本文提出通過他們內(nèi)在的標(biāo)識 ID將多次傳輸?shù)腡CP連接組合成同一封郵件。實驗結(jié)果表明了該系統(tǒng)的有效性。
圖1 系統(tǒng)基本模型圖
圖1是基于NDIS的Web郵件獲取的系統(tǒng)框架圖。由圖可知,最底層NIC是本機的網(wǎng)卡,數(shù)據(jù)包經(jīng)過網(wǎng)卡時由裝在網(wǎng)卡上的NDIS過濾驅(qū)動截取到,然后傳給應(yīng)用層進(jìn)行TCP數(shù)據(jù)包的重組。在NDIS過濾驅(qū)動中可以設(shè)置要過濾的端口,本文設(shè)計的系統(tǒng)過濾了除源端口或目的端口為80的TCP包。接著進(jìn)行HTTP協(xié)議的還原和Web郵件的提取。Web郵件模板庫是事先保存的識別各類郵箱的郵件服務(wù)器、發(fā)送者、接收者、內(nèi)容、附件等關(guān)鍵字的知識庫,在進(jìn)行郵件信息提取的時候通過匹配 Web郵件模板庫中的信息,提取出郵件信息。Web郵件的發(fā)送或接收在有多條TCP連接時,還需要將多條TCP連接的信息組合成一封郵件。
由于網(wǎng)絡(luò)狀況問題,在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包不一定會按照順序到達(dá),本文根據(jù)TCP包的序列號和確認(rèn)號將亂序的包進(jìn)行重組。本文使用二維鏈表將獲得的包緩存起來,可以將此鏈表的結(jié)構(gòu)看成是一個二維數(shù)組。每一個縱列是一個四元組(源 IP地址,目的 IP地址,源端口,目的端口)標(biāo)識,如果新來的包已存有四元組標(biāo)識,根據(jù)該包序列號的按序插入到該縱列中的橫向隊列里面去,若沒有該標(biāo)識,則新建一個四元組,隊列長度的大小是動態(tài)變化的。數(shù)組包重組的流程圖如圖2所示。
圖2 TCP數(shù)據(jù)包重組
1.3.1 HTTP請求的還原
Web郵件的發(fā)送主要是通過瀏覽器發(fā)送HTTP請求給服務(wù)器,因此通過還原HTTP請求數(shù)據(jù),就能獲取郵件信息。HTTP請求數(shù)據(jù)是經(jīng)過編碼的,在請求頭中給出了信息編碼的格式,中文編碼類型主要為UTF-8,表示為Content-Type:charset= UTF-8。
請求行數(shù)據(jù)的長度在請求頭中由消息頭 Content-Length給出,請求行數(shù)據(jù)的起始位置在請求頭末尾處兩個回車換行( )后的位置,復(fù)制 Content-Length長的數(shù)據(jù)就得到了HTTP請求的數(shù)據(jù)。
HTTP請求的還原,是通過對請求行數(shù)據(jù)進(jìn)行UTF-8的解碼,解碼后的數(shù)據(jù)就是原始發(fā)送郵件的內(nèi)容。
1.3.2 HTTP回應(yīng)的還原
Web接收郵件的內(nèi)容,主要是服務(wù)器返回的響應(yīng)報文,對HTTP回應(yīng)報文進(jìn)行還原后就能分析出郵件的內(nèi)容。HTTP響應(yīng)報文是編碼壓縮的,這在HTTP回應(yīng)頭中標(biāo)識了報文的編碼類型,消息頭一般為Content-Encoding: gzip,這說明內(nèi)容是 gzip編碼的,將該內(nèi)容以十六進(jìn)制方式查看可以看到gizp壓縮的起始標(biāo)志是1F8B。
HTTP回應(yīng)報文的還原主要是對以gzip編碼的內(nèi)容進(jìn)行解壓縮,再對解壓縮后的內(nèi)容進(jìn)行UTF-8解碼。本文使用zlib庫來解壓gzip數(shù)據(jù)。對報文進(jìn)行解壓縮時需要知道壓縮內(nèi)容的長度,HTTP回應(yīng)頭提供了兩種表示長度的方法。
圖3是回應(yīng)頭為Transfer-Encoding: chunked時獲取響應(yīng)報文數(shù)據(jù)的流程圖。
圖3 Transfer-Encoding: chunked獲取報文流程圖
由于不同的 Web郵箱服務(wù)器提供者提供了不同的郵件格式,同時Web郵件也在不停的更新,這對匹配不同類型的郵件提供了難度。本文將這些郵件匹配的標(biāo)識關(guān)鍵字建立模板庫,并保存在數(shù)據(jù)庫中。
經(jīng)過大量的觀察和實驗,發(fā)現(xiàn)每類郵箱在發(fā)送和接收郵件時有固定的標(biāo)識來分辨郵件每一部分,因此可以總結(jié)出各類郵箱的關(guān)鍵字。以163郵箱為例,表1列出了163郵箱的郵箱服務(wù)器、發(fā)送者、接收者、主題、內(nèi)容、附件關(guān)鍵字的信息。
表1 163收和發(fā)各字段關(guān)鍵字
本文在實驗中總結(jié)了163、QQ、sina、sohu、126、hotmail、yahoo常用的7種郵箱標(biāo)識,以此建立了Web郵件模板庫。在程序初始化時讀取到程序中,在提取郵件信息的時候進(jìn)行匹配。
在組合成郵件數(shù)據(jù)的時候,我們要把源IP、目的IP、源端口、目的端口標(biāo)識的TCP流和與之相反的TCP流組合在一起,因為這代表了一個HTTP連接的請求和響應(yīng)的完整過程。發(fā)送和接收Web郵件內(nèi)容的提取算法如圖4所示。
圖4 發(fā)送和接收的Web郵件提取算法
還原了HTTP數(shù)據(jù)后,開始進(jìn)行郵件的分析,對HTTP請求報文的主體和響應(yīng)報文的主題分別分析,就可以獲取發(fā)送郵件和接收郵件的信息。
以163郵箱發(fā)送郵件為例,首先判斷請求報文的主體判斷是否有“webmail.mail.163.com”。我們使用的查找函數(shù)為char *KeyFind(char *sourceData, int sourceLen, char *keyData,int keyLen),sourceData是將要查找的數(shù)據(jù),sourceLen是sourceData的長度,keyData是要查找的關(guān)鍵字,keyLen是keyData的長度,如果查找成功,則返回查找的位置,否則返回空。如果數(shù)據(jù)中有郵件服務(wù)器標(biāo)識,則將數(shù)據(jù)進(jìn)行UTF-8解碼,然后根據(jù)163郵件模板庫中的知識提取郵件信息,提取出信息后寫入數(shù)據(jù)庫中。
對于接收郵件內(nèi)容的提取,是通過分析HTTP響應(yīng)報文來完成的。首先判斷HTTP響應(yīng)數(shù)據(jù)中是否有Content-Encoding:gzip標(biāo)識,如果有則進(jìn)行g(shù)zip壓縮,gzip壓縮成功后進(jìn)行郵件信息的提取。如果沒有則結(jié)束分析。gzip解壓縮成功后,就可以通過Web模板庫中的知識匹配郵件信息,如果匹配成功,則進(jìn)行UTF-8解碼,提取郵件信息并寫入數(shù)據(jù)庫。
如果一封郵件的發(fā)送和接收是在一個TCP連接中,則很容易通過上述的郵件提取算法獲取郵件的全部信息。但是對于發(fā)送帶附件的郵件,郵件服務(wù)器會將郵件和附件分多次傳輸,比如sina、163、QQ郵箱等。對于接收郵件也存在同樣的問題,比如163郵箱的內(nèi)容和主題等字段是分兩次傳輸?shù)摹?/p>
本文提出通過尋找郵件的內(nèi)在標(biāo)識 ID來解決同一封郵件分多次TCP傳輸?shù)膯栴}。而這個內(nèi)在的標(biāo)識ID,本文通過實驗測試發(fā)現(xiàn),對于各類郵箱都可以找到。
本文設(shè)置了一個結(jié)構(gòu)體,結(jié)構(gòu)體的結(jié)構(gòu)如下:
結(jié)構(gòu)體中的有 ID、ID獲取的時間、郵件內(nèi)容、郵件主題、發(fā)送者、接收者、附件名、附件內(nèi)容等標(biāo)識一封郵件的信息。同時設(shè)置一個該結(jié)構(gòu)體數(shù)組,本文設(shè)置的數(shù)組值為10,表示可以匹配10封多TCP連接的郵件,這個值也可以根據(jù)需要設(shè)成其他的值。
圖5為多條TCP連接的郵件內(nèi)容獲取的算法。
圖5 多條TCP連接郵件內(nèi)容獲取算法
從以上算法圖可知,如果有標(biāo)識郵件ID的郵件信息,先將該ID和郵件信息保存在結(jié)構(gòu)體g_mailIDDataStruct數(shù)組中,并判斷郵件信息是否完整,如果不完整,等待該ID的其他郵件信息獲取,如果郵件信息獲取完整,則將該郵件寫入數(shù)據(jù)庫。如果g_mailIDDataStruct結(jié)構(gòu)體數(shù)組值已達(dá)到最大,而又有新來的ID,則找出數(shù)組中各ID的時間距離當(dāng)前最大的時間,可以認(rèn)為該ID標(biāo)識的郵件匹配失敗,將新來的ID賦給該數(shù)組值。
對于郵件的附件內(nèi)容的獲取,如果是 txt文檔,則直接獲取內(nèi)容,如果是Word和pdf則可以使用PDFBox等工具先將內(nèi)容轉(zhuǎn)化成文檔流。如果是壓縮文件,可以先進(jìn)行相應(yīng)的解壓縮,然后根據(jù)文件類型并進(jìn)行相應(yīng)的處理。
對于一些涉及安全、保密等機構(gòu),在監(jiān)測到郵件內(nèi)容后,可以事先設(shè)置郵件的敏感關(guān)鍵字,在郵件寫入數(shù)據(jù)庫后根據(jù)敏感關(guān)鍵字匹配,如果符合設(shè)置的條件,則可以用鮮明的顏色標(biāo)識出來,或者給管理者發(fā)信息,使得能夠?qū)崟r的監(jiān)測郵件的動態(tài)。從而能夠及時發(fā)現(xiàn)泄密、違法等郵件。
本實驗的測試環(huán)境為百兆網(wǎng)速的局域網(wǎng),測試的PC機的處理器為英特爾 Pentium(奔騰)雙核 E6500@2.93GHz,內(nèi)存為4GB,硬盤為西數(shù)320GB,測試的操作系統(tǒng)有Windows XP,Win7(32位)和Win7(64位)。通過將NDIS驅(qū)動裝在個人PC機上進(jìn)行了163、新浪、QQ、126等郵箱收發(fā)的測試,每個郵箱的發(fā)送和接收郵件達(dá)100封,測試內(nèi)容包括郵件內(nèi)容和郵件附件。表2是實驗的結(jié)果統(tǒng)計圖。
表2 發(fā)送和接收郵件統(tǒng)計結(jié)果
通過實驗統(tǒng)計結(jié)果表明,不論是發(fā)送還是接收郵件,郵件內(nèi)容和附件的準(zhǔn)確獲取率達(dá) 98%以上。其他的 2%是由于局域網(wǎng)網(wǎng)絡(luò)狀況不好,從而導(dǎo)致的網(wǎng)絡(luò)丟包和包損壞所引起的。因為系統(tǒng)中設(shè)置了一個超時時間1分鐘,如果在1分鐘內(nèi)郵件仍沒有發(fā)出去或接收完全,則舍棄該封郵件有關(guān)的TCP數(shù)據(jù)包,不再分析該郵件內(nèi)容。這樣做的原因是,如果長時間的下載大文件或進(jìn)行視頻傳輸,數(shù)據(jù)量會非常大,及時舍棄這些數(shù)據(jù)可以保證系統(tǒng)更好的運行。
經(jīng)過大量測試表明,本系統(tǒng)能夠在網(wǎng)絡(luò)正常情況下準(zhǔn)確獲取在網(wǎng)絡(luò)中傳輸?shù)拿魑木W(wǎng)絡(luò)郵件。
針對目前應(yīng)用比較廣泛的Web郵件服務(wù),本文從原理到實踐詳細(xì)地闡述了獲取Web郵件發(fā)送和接收內(nèi)容和附件的方法。本文重點講述了Web接收郵件的監(jiān)控和多TCP連接郵件內(nèi)容的組合,并通過建立Web郵件模板庫來匹配各類郵件信息。目前Web郵件實現(xiàn)的難點是組合具有多個TCP連接的同一封郵件,本文提出了用標(biāo)記同一封郵件的ID來組合他們。但是本方式同時存在一定劣勢,比如本文使用的方式為驅(qū)動方式,必須要求客戶機安裝驅(qū)動,實際應(yīng)用可以用其它方式替代。本文講述的系統(tǒng)模型可以在個人 PC機上實現(xiàn),也可以在裝有網(wǎng)卡的其他符合Windows網(wǎng)絡(luò)協(xié)議機器上實現(xiàn)。隨著Internet的不斷發(fā)展,Web郵件內(nèi)容和附件的獲取在現(xiàn)在或是將來都有很重大的意義。
[1] 中國互聯(lián)網(wǎng)絡(luò)信息中心(CNNIC). 第29次互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計報告[EB/OL]. http://www.cnnic.cn/research/bgxz/tjbg/201201/P020120118512855484817.pdf.
[2] 朱鴻旭,劉嘉勇. Linux平臺下基于特征庫的Webmail監(jiān)控系統(tǒng)[J].信息網(wǎng)絡(luò)安全.2010.
[3] Rui Lu,Jia Mi,Bo Huang. Design and Implementation of Email Aduiting System[C].IEEE 2010.
[4] 朱隨江,王澤東,劉宇,劉寶旭.基于模板的 WebMail審計系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機應(yīng)用與軟件.2011.
[5] 譚文,楊瀟,邵堅磊.寒江獨釣:Windows內(nèi)核安全編程[M].電子工業(yè)出版社.2009.
[6] Windows Driver Development Kit.
[7] Andrew S. Tanenbaum著,潘愛民譯.計算機網(wǎng)絡(luò)[M].清華大學(xué)出版社.2004.
[8] 譚敏生,湯亮.基于 HTTP的網(wǎng)絡(luò)數(shù)據(jù)包還原技術(shù)研究[J].計算機技術(shù)與發(fā)展.2007.
[9] www.zlib.net.