潘卿
(南京林業大學,江蘇 南京210037)
隨著計算機技術、通信技術和互聯網技術的飛速發展,網絡購物、網上消費、電子商務等早已風靡全球,網絡信息已經成為社會發展和個人生活的重要組成部分。然而由于計算機網絡組成形式多樣性、終端分布廣和網絡的開放性、互聯性等特征致使這些網絡信息容易受到來自世界各地的各種人為攻擊例如信息泄漏、信息竊取、數據篡改、數據刪添、計算機病毒等,涉及到個人的主要包括銀行賬號、密碼、個人隱私等敏感信息,網絡安全的形式越來越嚴峻。據某知名殺毒軟件公司統計,平均每天檢測到的感染木馬的計算機數量為上千臺,平均每天新增加的惡意程序特征就高達780 個,惡意軟件最廣泛是通過互聯網特別是惡意網站進行傳播。
為了給個人計算機加強網絡安全,避免惡意網站的侵襲,需要截斷惡意網站與用戶之間的正常通信,同時向用戶推送告警頁面。這樣既不會讓病毒、惡意軟件有機可乘,又讓用戶注意到已經在訪問惡意網站,加強自我管理。
通過對網絡嗅探器對網絡上傳輸的數據包特別是HTTP 請求的捕獲與分析,當發現HTTP 請求報文Host 字段與惡意網站列表中的網站名匹配時,獲取組建推送告警報文所需要的MAC地址、IP 源地址、目的地址、TCP 端口、SEQ 序號和ACK 序號等通信信息[1],直接生成用戶要訪問的網站的回應數據包,并將告警信息成功推送至用戶,從而阻止惡意網站內容傳輸至用戶瀏覽器,截斷如木馬、病毒等惡意軟件的傳播途徑,以達到保護用戶安全的目的。
本系統可根據收集的惡意網站名單,對惡意網站列表進行實時更新,并且系統管理員可自行選擇推送頁面,系統使用簡單靈活,因此對訪問惡意網站告警系統的應用具有重要意義。
本系統主要包括網絡嗅探器和網頁推送器兩部分,其中嗅探器和網頁推送器是本系統實現的關鍵。網絡嗅探器(Sniffer 系統),放置于網絡節點處,對網絡中的數據幀進行捕獲的一種被動監聽手段,是一種常用的收集有用數據的方法,本系統網絡嗅探器主要用于捕捉用戶發出的TCP 數據包[2]。網頁推送器用于將告警頁面以HTTP 請求應答包的形式發送至用戶主機,該應答報文必須滿足TCP/IP 通信協議,同時由于本系統一般架設于局域網內部,推送報文的源MAC 地址、目的MAC 地址必須與請求報文對應,以實現將應答報文正確傳輸至用戶計算機。
由于本系統包含網頁推送器程序,且當系統運行在局域網內時,MAC 地址是以太網通信的基礎,因此要求本系統的嗅探器不僅能夠獲取請求報文中高層協議如IP 協議、TCP 協議等信息,還必須能抓取請求報文中的MAC 地址等報文底層數據。
從常見的嗅探器實現機制[3]中可以了解,WinPcap 直接從網卡驅動NIC 中獲取報文,該報文包含了請求報文包括MAC 地址在內的所有信息,而套接字包捕獲則僅獲取報文IP 層以上的數據,對于MAC 地址信息無法獲取。
為了實現網頁推送器能夠正確填充MAC 地址,本系統嗅探器同樣采用的WinPcap 實現,通過使用WinPcap 設計開發嗅探器[4]。網頁推送器用于將告警頁面以HTTP 請求應答包的形式發送至用戶主機,因此必須滿足TCP/IP 通信協議。同時為了實現將網頁推送至客戶端瀏覽器,對本系統設計時提出了一些關鍵要求。
本文在Windows 平臺下采用MFC 實現了一個嗅探器程序,開發工具使用Visual C++,該設計可以捕獲到所有經過本地網卡的所有的HTTP 數據包,并可從查找符合惡意網站列表的報文。
在捕獲數據包前,首先需要獲取網卡設備列表,如圖1 所示,當用戶單擊某一網卡時,在列表控件中填充該網卡諸如名稱、描述、IP 地址、子網掩碼等詳細信息。當選中了某一網卡后按“確定”按鈕完成網卡的選擇,通過CMainFrame 的pcap_if_t*dev 成員變量保存該網卡。為了實現對惡意網站的管理,本系統設計了網站列表維護對話框,通過該對話框可實現惡意網站的增加、修改和刪除等操作。
當完成網卡選擇、推送文件選擇和惡意網站列表維護后,用戶單擊“文件”菜單的“開始”菜單項,系統通過建立ReceivePacket 線程開始進行WinPcap 捕獲設置,包括打開網卡、設置過濾器等,最后循環調用pcap_loop 設置的packet_handler回調函數。

圖1 網絡設備嗅探選擇界面
在packet_handler 中,首先分析該TCP 報文的flag 標志,只有為用戶瀏覽器請求報文結束標志PSH+ACK 有效時再進行下一步解析判斷。根據TCP 報文結構定義,將數據指針定位于TCP 數據區,也即HTTP 報文頭位置。然后在HTTP 報文中查找是否為請求報文,即是否包含GET 字段內容。繼續在HTTP 請求報文中定位Host 字段。根據惡意網站列表數據查找是否匹配,如果匹配則調用sendpkt 進行告警頁面推送。
網頁推送的報文在組包時,不僅要符合TCP 的數據結構,而且必須符合TCP 的數據傳輸要求[5],下列為本系統實現推送的關鍵步驟。
3.2.1 惡意網站匹配報文的抓取:從HTTP 請求分析中可以發現,Host 屬性包含了用戶訪問的網站域名,因此需在WinPcap中對抓到的報文檢查Host 屬性是否與惡意網站列表匹配。
3.2.2 TCP 序列號和確認:TCP 序列號和確認號是實現可靠傳輸的基礎,因此推送的報文必須符合序列號、確認號的要求,也即推送報文的SEQ 為請求報文的ACK,推送報文的ACK 為請求報文的SEQ 加上請求報文TCP 數據長度。
3.2.3 校驗和計算:校驗和包括IP 頭部校驗和TCP 數據包校驗,IP 報文的校驗和根據源IP、目的IP 信息,而TCP 數據包校驗既包含TCP 頭部數據、TCP 數據,還包括一個源IP、目的IP和協議信息在內的偽IP 頭部數據。
3.2.4 響應時間:推送的報文必須先于惡意網站生成的應答報文到達用戶,這樣由于TCP 協議的規約,后續到達的應答報文將被視為重傳失敗而被用戶主機丟棄。
3.2.5 報文發送:推送器必須能直接發送包含以太網MAC數據在內的報文,而socket 編程無法實現對目的MAC、源MAC的修改,WinPacp 中則提供了pcap_sendpacket 直接發送數據報文的接口函數。
當嗅探器捕捉到用戶瀏覽器向惡意網站提交的HTTP 請求后,由sendpkt 函數進行發送。sendpkt 函數原型為:void sendpkt(PUSH_INFO_PTR push_info, const uint_8 *pkt_data_in); 其中,push_info 為系統推送信息PUSH_INFO 結構體指針,pkt_data_in為嗅探器捕獲的數據包。在sendpkt 中需要根據捕獲的報文內容完成推送報文的MAC 地址復制、IP 地址復制、TCP 端口復制、序列號和確認號填充、IP 校驗和計算以及TCP 校驗和計算。最后調用pcap_sendpacket 完成推送報文的發送。嗅探結果如圖2 所示。
為了實現網頁推送器成功推送至用戶瀏覽器,不僅要滿足TCP 數據結構,還必須滿足TCP 通信的數據傳輸要求,且響應時間必須先于惡意網站響應時間。因此本系統在設計時采用了如下一些加速措施。一是提前填充確定的數據至推送報文:如以太網頭部類型、IP 頭部、TCP 頭部等,并預先格式化好HTTP應答信息。二是提前讀取推送文件:將用戶選擇的推送頁面文件提前讀取后存放在推送報文中,減少推送時間。三是將計算TCP 校驗和所需的TCP 報文長度(TCP 頭部+TCP 數據總長度+偽IP 頭部)預先計算好后放于PUSH_INFO 結構體。

圖2 數據包的簡單信息
本文的主要研究內容是利用WinPcap 開發網絡嗅探器和推送器實現惡意網站的告警,具體設計中通過捕捉用戶發出的IP數據包能將捕捉到的數據包中的目標地址取出與惡意網站列表中的地址進行比對,如發現目標地址與列表中的地址相同,即調用告警頁面推送程序;也可以人工對惡意網站列表進行手動管理。本系統可以作為基礎的惡意網站過濾系統維護普通計算機用戶的網絡安全,也可以用于學校機房、校園網等應用場合,具有廣泛的應用前景。在使用中,本系統不免存在一些不足之處,需要在下一步的完善中不斷進步,例如:
4.1 本系統沒有對推送報文進行TCP 分包傳輸處理,因此對推送文件的大小作了不大于1400 字節的限制,讓其包含在1個TCP 報文中。
4.2 本論文中的嗅探器只適用于基于廣播包的網絡,不能夠對子網內其他的機器進行監聽,若想要對子網進行監聽,必須處于與此交換機同級的包交換節點中。
4.3 系統未實現一個獨立的網頁推送器。在未來,可以嘗試使用過命令行參數傳遞、進程間共享內存通信等方式獨立設計網頁推送器。