羅利明 伍淳華 袁開國
北京郵電大學信息安全中心 北京 100876
本文在吸收前人研究的成果上,設計了一個Windows下的基于NDIS(Network Driver Interface Specification)的Web郵件發送和接收監控系統。鑒于監控通過Web進行郵件接收的研究目前較少,本文重點針對Web郵件接收內容的特點,提出了對Web接收郵件內容監控的解決方案。針對Web服務器在發送或接收一封 Web郵件時,一封郵件會分多次 TCP傳輸的難題,本文提出通過他們內在的標識 ID將多次傳輸的TCP連接組合成同一封郵件。實驗結果表明了該系統的有效性。

圖1 系統基本模型圖
圖1是基于NDIS的Web郵件獲取的系統框架圖。由圖可知,最底層NIC是本機的網卡,數據包經過網卡時由裝在網卡上的NDIS過濾驅動截取到,然后傳給應用層進行TCP數據包的重組。在NDIS過濾驅動中可以設置要過濾的端口,本文設計的系統過濾了除源端口或目的端口為80的TCP包。接著進行HTTP協議的還原和Web郵件的提取。Web郵件模板庫是事先保存的識別各類郵箱的郵件服務器、發送者、接收者、內容、附件等關鍵字的知識庫,在進行郵件信息提取的時候通過匹配 Web郵件模板庫中的信息,提取出郵件信息。Web郵件的發送或接收在有多條TCP連接時,還需要將多條TCP連接的信息組合成一封郵件。
由于網絡狀況問題,在網絡中傳輸的數據包不一定會按照順序到達,本文根據TCP包的序列號和確認號將亂序的包進行重組。本文使用二維鏈表將獲得的包緩存起來,可以將此鏈表的結構看成是一個二維數組。每一個縱列是一個四元組(源 IP地址,目的 IP地址,源端口,目的端口)標識,如果新來的包已存有四元組標識,根據該包序列號的按序插入到該縱列中的橫向隊列里面去,若沒有該標識,則新建一個四元組,隊列長度的大小是動態變化的。數組包重組的流程圖如圖2所示。

圖2 TCP數據包重組
1.3.1 HTTP請求的還原
Web郵件的發送主要是通過瀏覽器發送HTTP請求給服務器,因此通過還原HTTP請求數據,就能獲取郵件信息。HTTP請求數據是經過編碼的,在請求頭中給出了信息編碼的格式,中文編碼類型主要為UTF-8,表示為Content-Type:charset= UTF-8。
請求行數據的長度在請求頭中由消息頭 Content-Length給出,請求行數據的起始位置在請求頭末尾處兩個回車換行( )后的位置,復制 Content-Length長的數據就得到了HTTP請求的數據。
HTTP請求的還原,是通過對請求行數據進行UTF-8的解碼,解碼后的數據就是原始發送郵件的內容。
1.3.2 HTTP回應的還原
Web接收郵件的內容,主要是服務器返回的響應報文,對HTTP回應報文進行還原后就能分析出郵件的內容。HTTP響應報文是編碼壓縮的,這在HTTP回應頭中標識了報文的編碼類型,消息頭一般為Content-Encoding: gzip,這說明內容是 gzip編碼的,將該內容以十六進制方式查看可以看到gizp壓縮的起始標志是1F8B。
HTTP回應報文的還原主要是對以gzip編碼的內容進行解壓縮,再對解壓縮后的內容進行UTF-8解碼。本文使用zlib庫來解壓gzip數據。對報文進行解壓縮時需要知道壓縮內容的長度,HTTP回應頭提供了兩種表示長度的方法。
圖3是回應頭為Transfer-Encoding: chunked時獲取響應報文數據的流程圖。

圖3 Transfer-Encoding: chunked獲取報文流程圖
由于不同的 Web郵箱服務器提供者提供了不同的郵件格式,同時Web郵件也在不停的更新,這對匹配不同類型的郵件提供了難度。本文將這些郵件匹配的標識關鍵字建立模板庫,并保存在數據庫中。
經過大量的觀察和實驗,發現每類郵箱在發送和接收郵件時有固定的標識來分辨郵件每一部分,因此可以總結出各類郵箱的關鍵字。以163郵箱為例,表1列出了163郵箱的郵箱服務器、發送者、接收者、主題、內容、附件關鍵字的信息。

表1 163收和發各字段關鍵字
本文在實驗中總結了163、QQ、sina、sohu、126、hotmail、yahoo常用的7種郵箱標識,以此建立了Web郵件模板庫。在程序初始化時讀取到程序中,在提取郵件信息的時候進行匹配。
在組合成郵件數據的時候,我們要把源IP、目的IP、源端口、目的端口標識的TCP流和與之相反的TCP流組合在一起,因為這代表了一個HTTP連接的請求和響應的完整過程。發送和接收Web郵件內容的提取算法如圖4所示。

圖4 發送和接收的Web郵件提取算法
還原了HTTP數據后,開始進行郵件的分析,對HTTP請求報文的主體和響應報文的主題分別分析,就可以獲取發送郵件和接收郵件的信息。
以163郵箱發送郵件為例,首先判斷請求報文的主體判斷是否有“webmail.mail.163.com”。我們使用的查找函數為char *KeyFind(char *sourceData, int sourceLen, char *keyData,int keyLen),sourceData是將要查找的數據,sourceLen是sourceData的長度,keyData是要查找的關鍵字,keyLen是keyData的長度,如果查找成功,則返回查找的位置,否則返回空。如果數據中有郵件服務器標識,則將數據進行UTF-8解碼,然后根據163郵件模板庫中的知識提取郵件信息,提取出信息后寫入數據庫中。
對于接收郵件內容的提取,是通過分析HTTP響應報文來完成的。首先判斷HTTP響應數據中是否有Content-Encoding:gzip標識,如果有則進行gzip壓縮,gzip壓縮成功后進行郵件信息的提取。如果沒有則結束分析。gzip解壓縮成功后,就可以通過Web模板庫中的知識匹配郵件信息,如果匹配成功,則進行UTF-8解碼,提取郵件信息并寫入數據庫。
如果一封郵件的發送和接收是在一個TCP連接中,則很容易通過上述的郵件提取算法獲取郵件的全部信息。但是對于發送帶附件的郵件,郵件服務器會將郵件和附件分多次傳輸,比如sina、163、QQ郵箱等。對于接收郵件也存在同樣的問題,比如163郵箱的內容和主題等字段是分兩次傳輸的。
本文提出通過尋找郵件的內在標識 ID來解決同一封郵件分多次TCP傳輸的問題。而這個內在的標識ID,本文通過實驗測試發現,對于各類郵箱都可以找到。
本文設置了一個結構體,結構體的結構如下:

結構體中的有 ID、ID獲取的時間、郵件內容、郵件主題、發送者、接收者、附件名、附件內容等標識一封郵件的信息。同時設置一個該結構體數組,本文設置的數組值為10,表示可以匹配10封多TCP連接的郵件,這個值也可以根據需要設成其他的值。
圖5為多條TCP連接的郵件內容獲取的算法。

圖5 多條TCP連接郵件內容獲取算法
從以上算法圖可知,如果有標識郵件ID的郵件信息,先將該ID和郵件信息保存在結構體g_mailIDDataStruct數組中,并判斷郵件信息是否完整,如果不完整,等待該ID的其他郵件信息獲取,如果郵件信息獲取完整,則將該郵件寫入數據庫。如果g_mailIDDataStruct結構體數組值已達到最大,而又有新來的ID,則找出數組中各ID的時間距離當前最大的時間,可以認為該ID標識的郵件匹配失敗,將新來的ID賦給該數組值。
對于郵件的附件內容的獲取,如果是 txt文檔,則直接獲取內容,如果是Word和pdf則可以使用PDFBox等工具先將內容轉化成文檔流。如果是壓縮文件,可以先進行相應的解壓縮,然后根據文件類型并進行相應的處理。
對于一些涉及安全、保密等機構,在監測到郵件內容后,可以事先設置郵件的敏感關鍵字,在郵件寫入數據庫后根據敏感關鍵字匹配,如果符合設置的條件,則可以用鮮明的顏色標識出來,或者給管理者發信息,使得能夠實時的監測郵件的動態。從而能夠及時發現泄密、違法等郵件。
本實驗的測試環境為百兆網速的局域網,測試的PC機的處理器為英特爾 Pentium(奔騰)雙核 E6500@2.93GHz,內存為4GB,硬盤為西數320GB,測試的操作系統有Windows XP,Win7(32位)和Win7(64位)。通過將NDIS驅動裝在個人PC機上進行了163、新浪、QQ、126等郵箱收發的測試,每個郵箱的發送和接收郵件達100封,測試內容包括郵件內容和郵件附件。表2是實驗的結果統計圖。

表2 發送和接收郵件統計結果
通過實驗統計結果表明,不論是發送還是接收郵件,郵件內容和附件的準確獲取率達 98%以上。其他的 2%是由于局域網網絡狀況不好,從而導致的網絡丟包和包損壞所引起的。因為系統中設置了一個超時時間1分鐘,如果在1分鐘內郵件仍沒有發出去或接收完全,則舍棄該封郵件有關的TCP數據包,不再分析該郵件內容。這樣做的原因是,如果長時間的下載大文件或進行視頻傳輸,數據量會非常大,及時舍棄這些數據可以保證系統更好的運行。
經過大量測試表明,本系統能夠在網絡正常情況下準確獲取在網絡中傳輸的明文網絡郵件。
針對目前應用比較廣泛的Web郵件服務,本文從原理到實踐詳細地闡述了獲取Web郵件發送和接收內容和附件的方法。本文重點講述了Web接收郵件的監控和多TCP連接郵件內容的組合,并通過建立Web郵件模板庫來匹配各類郵件信息。目前Web郵件實現的難點是組合具有多個TCP連接的同一封郵件,本文提出了用標記同一封郵件的ID來組合他們。但是本方式同時存在一定劣勢,比如本文使用的方式為驅動方式,必須要求客戶機安裝驅動,實際應用可以用其它方式替代。本文講述的系統模型可以在個人 PC機上實現,也可以在裝有網卡的其他符合Windows網絡協議機器上實現。隨著Internet的不斷發展,Web郵件內容和附件的獲取在現在或是將來都有很重大的意義。
[1] 中國互聯網絡信息中心(CNNIC). 第29次互聯網絡發展狀況統計報告[EB/OL]. http://www.cnnic.cn/research/bgxz/tjbg/201201/P020120118512855484817.pdf.
[2] 朱鴻旭,劉嘉勇. Linux平臺下基于特征庫的Webmail監控系統[J].信息網絡安全.2010.
[3] Rui Lu,Jia Mi,Bo Huang. Design and Implementation of Email Aduiting System[C].IEEE 2010.
[4] 朱隨江,王澤東,劉宇,劉寶旭.基于模板的 WebMail審計系統的設計與實現[J].計算機應用與軟件.2011.
[5] 譚文,楊瀟,邵堅磊.寒江獨釣:Windows內核安全編程[M].電子工業出版社.2009.
[6] Windows Driver Development Kit.
[7] Andrew S. Tanenbaum著,潘愛民譯.計算機網絡[M].清華大學出版社.2004.
[8] 譚敏生,湯亮.基于 HTTP的網絡數據包還原技術研究[J].計算機技術與發展.2007.
[9] www.zlib.net.