刁紅艷
(無錫南洋職業技術學院,江蘇 無錫 214081)
互聯網的共享性使得全球的計算機網絡處于“半透明化”狀態。這種“半透明化”讓網絡隨時都有可能受到不明攻擊。網絡防火墻技術在軟件和硬件上給網絡提供了一定程度上的安全保障。隨著網絡技術和移動互聯網的蓬勃發展,入侵檢測技術是繼防火墻技術后又一個非常重要和實用的技術。入侵檢測系統可以彌補防火墻技術上“無法檢測加密的Web流量”、“防范能力有限”等的缺點,為網絡系統的安全提供了實時的入侵或訪問檢測,立即采取適合的防范方案,例如記錄訪問或入侵證據、跟蹤入侵或訪問的痕跡、及時斷開或恢復網絡的連接等。入侵檢測技術可以讓系統在受到外來不安全因素攻擊時及時得到檢測和監控,能向系統發出預警信號,并能有效地把入侵攻擊帶來的損失盡可能地降到最低[1-2]。在網絡入侵檢測系統中,非常重要的部分是有效監聽網絡上傳送的數據包,高效地捕獲數據包,進一步分析所捕獲的數據,進行可靠的網絡安全管理。入侵檢測系統還能把入侵信息進行收集、整理,并加入到系統知識庫中,以防止系統再次受到類似的攻擊。在本論文中,利用Winpcap程序在Windows環境下用C++編寫了一個抓包程序,對滿足TCP、UDP、IP、ICMP四種協議的數據包進行數據捕獲,并將相關信息存入到指定文檔中進行顯示,以供分析研究。
Winpcap是Windows平臺的下一個免費的、公共的網絡訪問系統[3]。這個公共的網絡訪問系統提供了四個基本功能:一是捕獲原始的數據包;二是過濾掉特殊的數據包。也就是按照自定義的規則,將發往應用程序的某些特殊的數據包(可能包含不安全因素的數據包)過濾掉;三是發送原始的數據包;四是收集網絡通信過程中的統計的各種傳送數據的信息。其中的第一個功能——捕獲的原始數據包,包含了那些在共享網絡上各主機發送或者接收到的數據包,以及主機與主機相互之間傳送的若干數據包。
Winpcap這個公共的免費的網絡訪問系統的與眾不同的特征是獨立于主機的協議(比如因特網的TCP/IP協議)而發送或接收原始的數據包。不過,Winpcap僅僅只是監聽在共享網絡上相互之間傳送的數據包,它并不能過濾掉或者控制住其他應用程序進行的數據包的接收和發送。
這個網絡訪問系統提供給用戶兩個不同層次的編程接口。其中的一個接口是基于Libpcap的wpcap.dll接口,另一個接口是位于底層的packet.dll接口。位于底層的包捕獲驅動程序實際上是一個基于協議的網絡驅動程序。通過對NIDS系統中函數的常規調用,給Windows系統提供了一種能力,即捕獲和發送原始的數據包。接口Packet.dll是對BPF模型驅動程序進行訪問的API接口,它有一套符合libpcap接口的函數庫[4]。
在數據包捕獲程序的實施過程里,當主機為雙網卡或者多張網卡時,捕獲程序可以分別獲得多張網卡各自的結構信息和地址信息,可以對多張網卡分別進行操作。返回的alldevs隊列首部為邏輯網卡,其他操作可以不進行。
為了獲得設備列表,并把設備列表打印到顯示端,可以用如下程序來實現。
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{fprintf(stderr,"Error in pcap_findalldevs: %s ", errbuf);exit(1);}
for(d=alldevs; d; d=d->next)
{fprintf(stderr,"%d. %s", ++i, d->name)if (d->description)fprintf(stderr," (%s) ",d->description);elsefprintf(stderr," (No description available) ");}
在主程序中,選取了網卡接口號后,系統就跳轉到選擇的相應設備,此時便開始監聽過程。跳轉到已選設備并打開適配器,在第一個if語句中,分別需要判斷的是設備名、要捕捉的數據報部分、混雜模式、讀取超時時間、遠程機器驗證及錯誤緩沖池的相關參數,其中的65536端口就是要捕捉的數據包的部分。這樣,不同的數據鏈路層上的每個數據包的數據信息就能保證全部被捕獲到了。如果判斷失敗,就釋放設備列表,并提示Winpcap功能不支持,不進入監聽狀態。代碼如下所示。
for(d=alldevs, i=0; i< inum-1 ;d=d->next,i++);if ((adhandle= pcap_open(d->name, 65536,PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL,errbuf )) == NULL)
{fprintf(stderr," Unable to open the adapter. %s is not supported by Winpcap ");pcap_freealldevs(alldevs);fclose(fp);retu rn -1;}
在獲得相關數據包信息前,首先檢查數據鏈路層,為了簡單,在此只考慮以太網。若檢查不成功則釋放設備類表,不進入監聽狀態。代碼如下:
if(pcap_datalink(adhandle) != DLT_EN10MB)
{fprintf(stderr," This program works only on Ethernet networks. ");pcap_freeallde vs(alldevs);fclose(fp);return -1;}
運行了上面這個程序以后,可以獲得接口的掩碼,若接口沒有地址,可以假設一個C類的掩碼,該功能代碼如下。
if(d->addresses != NULL)
netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;else netmask=0xffffff;
編譯上述程序并設置其相應的過濾器,判斷成功后進入監聽狀態,若判斷不成功給出響應的告警提示并釋放設備列表。
判斷成功后進入監聽環節,開始捕捉數據包。判斷超時時間,并將時間戳轉換成可識別的格式,并開始記錄IP數據包報頭信息。代碼如下:
while((res = pcap_next_ex( adhandle,&header, &pkt_data)) >= 0){if(res == 0)continue;num++;local_tv_sec = header->ts.tv_sec;ltime=localtime(&local_tv_sec);trftime(timestr, sizeof timestr, "%H:%M:%S",ltime);fprintf(fp," %d.%s,%.6d,len:%d ",num,timestr, header->ts.tv_usec, header->len);DecodeEthPkt(header, pkt_data);}
判斷數據包類型后,可調用相應的子程序來對數據包內容分析,并最終輸出到圖1的文檔1.txt中。
在編譯程序前,首先要確認該機器上安裝了Winpcap程序,并有WpdPack包存在,修改Microsoft Visual C++的相關配置:
第一步,打開Project中的settings,在Link的Object中加入 wpcap.lib,Packet.lib和 wsock32.lib。
第二步,打開Tools中 的Directories,在Include files和Library files中添加路徑到WpdPack包中對應的INCLUDE和LIB文件。
選擇設備后,系統就開始進入監聽狀態,Ctrl+C或者關閉該窗口,此時監聽過程結束。
監聽過程中監聽到的數據包信息都記錄到了如圖1所示1.txt中。數據包按照監聽到的先后順序進行編號,每個數據包中的內容包括:捕獲到數據包的時間、數據包長度、源以太網地址、目標以太網地址、版本號IP頭長度、服務類型、總長、ID號碼、協議類型、源端口號、目標端口號等數據包信息等數據包信息[5-6]。

圖1 輸出結果圖Fig.1 Output result diagram
網絡一旦被入侵,系統的保密性、數據完整性和網絡可用性就可能會受到破壞。帶著不同企圖的網絡入侵者,對系統安全性的破壞程度也就不同。不過,無論系統的哪一個特性被破壞,都會對計算機系統和整個網絡的安全構成嚴重威脅,可能會造成不同程度的各種損失,對人類正常的工作、生活與學習產生各種程度不良的影響。作為對于研究入侵檢測系統的程序設計,本論文里的這些程序實現了基本的數據包捕獲的功能,并能夠在Windows環境下運行[7-8]。對于輸出結果的處理采取了記錄到指定文檔中的方式,更加方便讀取和研究,以便記錄入侵痕跡,制定防范措施,用以防止網絡再次受到類似的入侵。計算機網絡系統的安全是一個國際化的大問題。而且,隨著移動互聯網技術以及移動終端的推陳出新,網絡入侵的形式可能會越來越多,規模會越來越大,今后的入侵檢測技術也必須要得到技術上的大提升才能應對各種復雜、多變的入侵形式。當下和今后,入侵檢測技術會在“分布式入侵檢測、智能化入侵檢測和能全面提高安全防御方案”三個方向發展起來。我們要做的就是通過各種入侵檢測技術的研究,能盡量減少網絡系統受到各種攻擊的可能[9-10],從而維護網絡環境的和平與發展。這條路任重而道遠。