网卡混杂模式的检测2008-11-0510:52检测工具:网卡混杂模式扫描器安装之前,先要安装wincap3.0以上版本promiscanversion3.0.9.1Product.Code:05P30E-melatoninTeamICUProduct.key:9F9E-1017-4F58-862E1.简介在局域网中,嗅探行为已经成为网络安全的一个巨大威胁。通过网络嗅探,一些恶意用户能够很容易地窃取到绝密的文档和任何人的隐私。要实现上述目的非常容易,恶意用户只要从网络上下载嗅探器并安全到自己的计算机就可以了。然而,却没有一个很好的方法来检测网络上的嗅探器程序。本文将讨论使用地址解析协议(AddressResolutionProtocol)报文来有效地检测办公网络和校园网上的嗅探器程序。2.网络嗅探的原理局域网通常使用以太网进行连接。在以太网线缆上使用IP(IPV4)协议传输的传递的信息是明文传输的,除非使用了加密程序进行了加密。当一个人把信息发送到网络上,他会希望只有特定的用户才能收到这些信息。但是,非常不幸,以太网的工作机制为非验证用户提供了窃取这些数据的机会。以太网在进行信息传输时,会把分组送到各个网络节点,目的地址匹配的节点会接收这些分组,其它的网络节点只做简单的丢弃操作。而接收还是丢弃这些分组由以太网卡控制。在接收分组时,网卡会过滤出目的地址是自己的分组接收,而不是照单全收。在本文以后的部分我们将把网卡的这种过滤称为硬件过滤(HardwareFilter)。但是这只是在正常情况下,嗅探器使用另一种工作方式,它把自己的网卡设置为接收所有的网络分组,而不管分组的目的地址是否是自己。这种网卡模式叫作混杂模式(PromiscuousMode)。3.检测混杂模式的基本概念在网络中,嗅探器接收所有的分组,而不发送任何非法分组。它不会妨碍网络数据的流动,因此很难对其进行检测。不过,处于混杂模式(promiscuousmode)网卡的状态很显然和处于普通模式下不同。在混杂模式下,应该被硬件过滤掉的分组文会进入到系统的内核。是否回应这种分组完全依赖与内核。下面我们举一个现实世界中的例子,说明我们检测处于混杂模式网络节点的方法。设想一下,在一个会议室中正在举行一个会议。某个人把耳朵放在会议室就可以进行窃听(嗅探^_^)。当她(还是个女的,原文如此:P)进行窃听(嗅探)时,会屏住呼吸,安静地聆听会议室内所有的发言。然而,如果此时会议室内有人忽然叫窃听者的名字:“XX太太”,她就可能答应“唉”。这听起来有点好笑,但是完全可以用于网络嗅探行为的检测。网络进行网络嗅探的节点会接收网络的所有报文,因此其内核可能对某些本该被硬件过滤的分组作出错误回应。根据这个原理,我们可以通过检查节点对ARP报文的响应来检测网络的嗅探行为。4.基础1).硬件过滤器首先,我们从处于混杂模式(promiscuousmode)下和普通模式下有何不同开始。以太网的地址是6个字节,制造商为每块网卡分配的地址在全世界是唯一的,因此理论上没有相同地址的网卡。在以太网上的所有通讯都是基于这种硬件地址。不过,网卡可以被设置为不同的过滤模式以接收不同种类的分组。下面就是以太网卡的过滤模式:unicast网卡接收所有目的地址是自己的分组broadcast接收所有广播分组,以太网广播分组的目的地址是FFFFFFFFFFFF。这种广播分组能够到达网络上的所有节点。multicast接收目的地址为指定多投点递交(multicast)组地址的分组。网卡只接收其地址已经预先在多投点列表中注册的分组。allmulticast接收所有多投点递交广播分组。promiscuous根本不检查目的地址,接收网络上所有的分组。图-1描述了硬件过滤器处于在正常情况下和在混杂模式下的区别。通常,网卡的硬件过滤器被设置为接收目为单投点递交(unicast)、广播(broadcast)和多投点递交(multicast)地址1的分组。过滤器只接收目的地址为自己的地址、广播地址(FFFFFFFFFFFF)和多投点地址1(01005E000001)的分组。2).ARP机制使用以太网连接的IP网络需要依靠以太网进行传输。只使用IP地址,报文是无法发送的。因此,在以太网上需要一种机制来提供IP地址和硬件地址之间的转换。这种机制就是地址解析协议(AddressResolutionProtocol)。ARP属于网络层,和IP处于OSI模型的同一层。在IP网络上地址解析是不断进行的,所以ARP报文比较适合用来检测处于混杂模式(promiscuousmode)的网络节点。在下面的例子中,我们将讲述使用ARP报文是怎样解析IP地址的:例如:网络上一台IP地址为192.168.1.1的PC(X)以太网地址是00-00-00-00-00-01,这台PC(X)需要向网络上另外一台IP地址为192.168.1.10的PC(Y)发送消息。在发送之前,X首先发出一个ARP请求包查询192.168.1.10对应的以太网地址。查询包的目的地址被设置为FF-FF-FF-FF-FF-FF(广播),从而本地网络上的所有节点都可以收到这个包。收到之后,每个节点会检查这个ARP包查询的IP地址和本机的IP地址是否匹配。如果不同,就忽略这个ARP包;如果匹配(Y)就向X发出应答。X收到应答之后就缓存Y的IP/硬件地址。然后,X就可以向Y发送实际的数据。5.检测处于混杂模式的节点上面讲到,报文的过滤状态是处于混杂模式状态和正常的网络节点的区别。当网卡被设置为混杂模式,本该被过滤掉的报文就会进入系统的内核。通过这种机制,我们可以检测到网络上处于混杂模式的节点:我们构造一个ARP查询包,其目的地址不是广播地址,然后向网络上的各个节点发送这个ARP查询包,最后通过各个节点的回应来判断是否处于混杂模式。下面我们讨论一下整个ARP请求/响应的操作过程。首先,产生一个ARP查询包来解析192.168.1.10的硬件地址。为了使网络上的所有节点都能够收到这个查询包,把这个包的目的地址设置为广播地址。理论上,只有IP地址为192.168.1.10的网卡才能对这个查询包进行响应。进一步设想,如果我们把这个查询包的目的地址(以太网地址)设置为另外的地址,而不是原来的广播地址又将如何?例如:我们把查询包的目的地址设置为00-00-00-00-00-01会发生什么?处于正常模式下网络节点的以太网卡会认为这个查询包是发往其它主机的,其硬件过滤器会拒绝接收这个包;然而,如果这个网络节点(192.168.1.10)的以太网卡处于混杂模式(promiscuousmode)下,那么即使以太网地址不匹配,其硬件过滤器也不进行任何过滤,从而使这个查询包能够进入到系统的内核。因为这个节点的IP地址和查询包的要查询IP地址相同,其内核就会认为ARP查询包到达,应该作出应答。但是,另我们吃惊的是,这个处于混杂模式节点的内核不会应答ARPR查询包。这种出人意料的结果说明这个包被系统内核过滤掉了。在这里我们把这叫作软件过滤器。再进一步,我们可以通过区别硬件过滤器和软件过滤器的不同特征来检测处于混杂模式的网络节点。硬件过滤器一般会阻塞所有无效的分组(这些分组显然不会进入系统内核),因此能够通过硬件过滤器一般也能够通过软件过滤器,这种情况我们不多做讨论。现在我们需要构造应该被被硬件过滤器阻塞,但是却能够通过软件过滤器的报文。如果把这种报文送到各个网络节点,那么处于普通模式下的网络节点将不做应答;而处于混杂模式的节点会进行应答。6.软件过滤器软件过滤器依赖于操作系统的内核,因此有必要理解系统内核软件过滤器是如何工作的。Linux是开放源玛系统,因此我们能够获得其软件过滤机制。但是对于Micro$oftWindows我们只有凭经验猜测了:(。1).Linux在Linux的以太网驱动模块中,分组是以硬件地址分类的。广播包FFFFFFFFFFFF多投点分组所有的分组都有一个组标志位集合,不包括广播分组。TO_US分组目的地址和本机网卡相同的分组。OTHERHOST分组所有目的地址和本机网卡不同的分组。现在,我们假设具有组标志位的所有分组都是广播分组。IP网络对应的以太网多投点分组的目的地址是01-00-5e-xx-xx-xx,而且,通过校验组标志位本来就不能对多投点分组进行分类。这个假设并不错误,因为01-00-5e-xx-xx-xx是一个基于IP的多投点地址,但是网卡硬件地址还用于其它高层协议。下面,我们看一下ARP模块的代码。if(in_dev==NULLarp-ar_hln!=dev-addr_len''dev-flags&IFF_NOARPskb-pkt_type==PACKET_OTHERHOSTskb-pkt_type==PACKET_LOOPBACKarp-ar_pln!=4)gotoout;Linux内核的ARP模块拒绝所有OTHERHOST类型的分组。接着,ARP模块将处理广播、多投点和TO_US类型的分组。表1综合了硬件过滤器和软件过滤器对各种ARP分组的过滤处理,1说明:hw(hardware)、sw(software)、res.(response)、gr(group)。下面,后我们将对这六硬件地址的分组进行详细描述:TO_US网卡在正常模式下,所有地址为TO_US的分组都能够通过精简过滤器和软件过滤器。因此,不管网卡是否处于混杂模式(promiscuousmode)下,ARP模块都会对其进行响应。OTHERHOST当网卡处于正常模式下,会拒绝所有地址为OTHERHOST的分组。即使网卡处于混杂模式(promiscuousmode),这种分组也无法通过软件过滤器,因此这种ARP请求不会收到响应。BROARDCAST在正常模式下,BROARDCAST分组能够也能够通过硬件和软件过滤器,因此不能用于网络节点混杂模式的检测。MULTICAST在正常模式下,如果分组的硬件地址没有在多投点地址列表中注册,网卡将拒绝接收;但是,如果网卡处于混杂模式,这种分组将畅通无阻地穿过硬件过滤器和软件过滤器。因此,可以使用这种类型的分组来检测处于混杂模式的网络节点。groupbit这种类型的分组既不属于BRODCAST类型也不属于MULTICAST类型,但是其硬件地址的组位(以太网地址的首字节低序第一位)置位即:01-00-00-00-00-00。在正常模式下,网卡会拒绝接收此类分组;但是在混杂模式下,这种类型的分组能够通过硬件过滤器。而在Linux内核中,这种类型的分组被归类为多投点分组进行处理,能够穿过软件过滤器。因此,这种类型的分组也能够用于混杂模式检测。2).Micro$oftWindowsWindows系统不是开放源码系统,因此不能从源代码分析其软件过滤行为。只好由实验来测试。在实验中,我们使用了以下的硬件地址:FF-FF-FF-FF-FF-FF广播地址所有的网络节点都会接收这种分组。通常的ARP查询包使用这个地址。FF-FF-FF-FF-FF-FE伪广播地址FF-FF-FF-FF-FF-FE是一种伪广播地址,它的最后一位丢失。这个地址被用来检查软件过滤器是否检查所有的地址位,是否应答。FF-FF-00-00-00-00-0016位伪广播地址FF-FF-00-00-00-00-00只有前16位和真正的广播地址相同。如果过滤器函数只测试广播地址的第一个字,这个地址就可以归入广播地址。FF-00-00-00-00-008位伪广播地址这个地址只有前8位和广播地址相同,如果过滤器函数只检查广播地址的首字节,它也可以归入广播地址类。01-00-00-00-00-00多投点标记置位地址这个地址只有多投点标记位(以太网地址的首字节低序位)被置位,用来检查过滤器函数是否也象Linux一样把它作为多投点地址处理。01-00-5E-00-00-00多投点地址0多投点地址0并不常用,因此我们使用这个地址作为没有在网卡多投点地址列表中注册的多投点地址。正常情况下,硬件过滤器应该拒绝接收这种分组。但是,如果软件过滤