基于Winpcap的sniffer检测原理与实现

时间:2022-06-03 07:36:48

基于Winpcap的sniffer检测原理与实现

摘要:以太局域网的监听检测软件可以监视网络的状态,并利用这些信息来分析网络性能等。由于监听工具能有效的截获网络上的数据,所以它也对网络信息安全造成极大威胁。还必须采用各种反监听的检测措施以保护网络信息安全。

关键词:网络安全;Winpcap;ARP检测

中图分类号:TP393文献标识码:A文章编号:1009-3044(2009)34-9685-03

The Principle and Realization of sniffer Detection Based on Winpcap

LIU Jian-liang, SONG Li

(Information Engineering College of China University of Geosciences (Beijing), Beijing 100083, China)

Abstract: The program of Ethernet Network's Interception and Detection is mostly a very good network' tool for managers. It can keep watch on network's condition, and use these information to analyze the network's performance. Because the wiretap tool can intercept and seize the data on the network effectively, it results the network and information's security problems. We must still adopt the anti detection measure to protect network and information's security problems.

Key words: network security; winpcap; ARP detection

在局域网内,安全总是值得关注的。当明文在网络上传输时,很容易被任何网络用户窃听。从网络上窃听数据被称之为嗅探(sniffing)。通过sniffing网络,用户可以看到一些机密文件及一些个人的隐私。很多因特网提供的免费软件都有这样的功能。尽管sniffer非常简单,但到目前为止仍然还没有很好的方法来检测这种恶意的攻击。

1 sniffer检测原理

以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3标准的以太网采用的是持续CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截的我们所要的信息,这是sniffing的原理。

网卡具有如下的几种工作模式:

1) 广播模式(Broad Cast Model):它的物理地址(MAC) 地址是0Xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。

2) 多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧, 而不论它是不是组内成员。

3) 直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己Mac地址的帧。

4) 混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。

网卡的缺省工作模式包含广播模式和直接模式, 即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。

snifferS在收到发送到网络上的包的后才能工作。为了达到这一点,所有的sniffer必须把自己的网卡设置成“混杂模式”。然后网卡才会接收所有收到的数据包并转发到系统内核。ARP请求包用来查询IP地址到MAC地址的解析。我们利用这种包来验证是不是网络上有些网卡被设置成混杂模式了。

正如前面所陈述的,网卡设置成普通模式和混杂模式对包的过滤是不同的。当网卡被设成混杂模式后,本来被过滤的包会允许到达系统内核。利用这种机制,我们建立一种新的机制来检测混杂模式节点:如果构造一个目的地址不是广播地址的ARP包,把它发送到网络的每个节点,如果发现有些节点有响应,那么这些节点工作在混杂模式。通过发送这样的包,正常模式的网卡不会作出响应,而混杂模式的网卡会作出响应。

2 程序实现

在具体的实现过程中,使用VC6.0为开发平台,借助Winpcap抓包工具,实现了数据包的发送与捕获。程序的整体流程如图1所示。

Arp包的构造:

程序中arp包的数据结构:

struct arp_header1

{ unsigned char eh_dst[6];

unsigned char eh_src[6];

unsigned short eh_type;

unsigned short arp_hdr;

unsigned short arp_pro;

unsigned char arp_hln;

unsigned char arp_pln;

unsigned short arp_opt;

unsigned char arp_sha[6];

unsigned long arp_spa;

unsigned char arp_tha[6];

unsigned long arp_tpa;

}arp_header;

构造的数据包为:

//目的地址

arp_header.eh_dst[0]=0xFF;

arp_header.eh_dst[1]=0xFF;

arp_header.eh_dst[2]=0xFF;

arp_header.eh_dst[3]=0xFF;

arp_header.eh_dst[4]=0xFF;

arp_header.eh_dst[5]=0xFE;

//源地址

arp_header.eh_src[0]=0x00;

arp_header.eh_src[1]=0x0B;

arp_header.eh_src[2]=0x2F;

arp_header.eh_src[3]=0x0E;

arp_header.eh_src[4]=0xDA;

arp_header.eh_src[5]=0x93;

arp_header.eh_type=htons(0x0806); //类型为0x0806表示这是ARP包

arp_header.arp_hdr=htons(0x0001); //硬件地址类型以太网地址

arp_header.arp_pro=htons(0x0800); //协议地址类型为IP协议

arp_header.arp_hln=6; //硬件地址长度为6

arp_header.arp_pln=4; //协议地址长度为4

arp_header.arp_opt=htons(0x0001); //标识为ARP请求

在本程序中,利用Winpcap来捕获数据包。WinPcap是一个在Windows操作系统下的公开的用于直接访问网络的系统。它是由libpcap发展而来,它是一个包含了一套与libpcap兼容的捕获数据包的函数库,它有以下功能:

1) 捕获原始数据包,包括发送到正在运行的主机上的数据包和在其它主机在共享媒介上交换的数据包;

2) 过滤器在将数据包发送给应用程序之前按照用户的规定对捕获的数据包进行过滤;

3) 向网络发送原始数据包;

4) 对网络通信进行统计。

程序分为两部分,一部分用来发送数据包,一部分用来捕获数据包,分析捕获的数据包是否是ARP数据包的回复。

发送数据包需要完成对数据包的构造,用函数pcap_sendpacket()发送。捕获、分析数据包时,我们需要确定是否是发送给本机的ARP回复,如果是,判断该回复主机是否已经记录。如没,写入。

网络接口设备的打开,设置过滤器,捕获数据包等内容同数据包捕获线程的内容类似,在这里不在进行分析,当数据包如上所述构造以后,发送数据包,其部分代码为:

unsigned char *packet=(unsigned char *)(&arp_header);//发送包构造完成,强制转换为字符

if (pcap_sendpacket(adhandle,packet, 1000/* size */) != 0)//发包

{ …

return 0;

}

捕获数据包,因为过滤器已经设置为只捕获ARP数据包,所以对捕获的数据包,直接分析其是否是ARP回复,如果是,判断其目的IP地址是否是构造发送ARP数据包时的源IP地址,判断其源IP地址是否是构造发送ARP数据包时的目的地址。如果都满足,说名此主机处于混杂模式。实现此功能的部分代码为:

判断源地址是否为发送包的IP地址范围:

for(k=0;kipstr.GetLength();k++)

{

if(source_ip[k]!=this2->ipstr[k])

{

webflg = false;

break;

}

}

判断目的地址是否为本机IP地址:

if(webflg==true)

{

for(k=0;kip.GetLength();k++)

if(dest_ip[k]!=this2->ip[k])

{

webflg = false;

break;

}

}

判断是否为ARP应答且IP地址符合:

if(webflg==true&ð->arp_opt==htons(0x0002)){

this2->Webtype = true;

bool ipflag=false,k;

//判断该地址是否已经记录

for(k=0;kip_number;k++){

if(strcmp(source_ip,this2->ip_char[k])==0)

{

ipflag = true;

break;

}

}

if(ipflag ==false){

strcpy(this2->ip_char[this2->ip_number],source_ip);//记录该IP地址

this2->ip_number++;

}

}

混杂模式检测运行效果如图2所示。

3 总结

利用ARP请求包是因为这种包适用于所有的IP以太网。设置成混杂模式的网卡会接收所有的数据包,包括那些原本不是发给那台PC的包。所有的数据包会被允许到达系统的内核,系统内核对那些本来不是发给它的包错误地做出响应。根据以上的机制,我们能伪造ARP请求包,并把它发送给网络上所有的节点。在正常情况下,这些包应该被网卡阻塞,但如果某些节点有响应包,那么这些节点的网卡被设置成混杂模式了。这些设置成混杂模式的节点在运行sniffer软件。所以sniffer软件是可以成功的检测到的。

参考文献:

[1] Stevens W R. TCP/IP详解卷1:协议[M].范建华,胥光辉,张涛,等,译.北京:机械工业出版社,2000.

[2] Daiji Sannai.Detection of Promiscuous Nodes Using Arp Packets./promiscuous_detection_01.pdf.

[3] Davis.The Winpcap Team.winpcap中文技术文档[EB/OL].California: CACE Technologies,2007..cn/WinPcap/html/.

[4] 周金玲,范冰冰,秦洁.基于WinPcap的网络协议实验的仿真实现[J].计算机应用与软件,2007,24(9):218-221.

[5] David J.Kruglinski.Visual C++ 6.0 技术内幕[M].希望图书创作室,译.北京:北京希望电子出版社,2003.

上一篇:基于遗传算法的分类方法讨论 下一篇:基于校园网的防火墙技术应用研究