当前位置:Linux教程 - Linux - 使用ARP分组检测处于混杂模式的网络节点

使用ARP分组检测处于混杂模式的网络节点



        





    nixe0n


    本文只有for Windows的实现:(

    Version 1.0

    原著:Daiji Sanai
    英文版翻译:Kelvin King-Pang Tsang
    中文版翻译:nixe0n(译自英文版)

    摘要
    1.简介
    2.网络嗅探的原理
    3.检测混杂模式的基本概念
    4.基础



    1).硬件过滤器
    2).ARP机制


    5.检测处于混杂模式的节点
    6.软件过滤器


    1).Linux
    2).Micro$oft Windows


    7.混杂模式检测
    8.检查所有网络节点
    9.异常情况


    1).旧网卡
    2).3COM网卡
    3).Windows Y2K分组捕获驱动模块




    摘要


    在一个局域网中,安全问题应该引起注意。当纯文本数据在网络上传输时,任何网络用户都会很容易地窃取这些信息。在网络上窃取数据就叫作嗅探(sniffing)。通过嗅探网络,一个用户能够获得绝密文档的访问权限,窥探到任何人的隐私。在Internet上有很多自由散发的嗅探器软件可以实现上述目的。尽管进行网络嗅探非常容易,然而却没有很好的方法来检测这种恶意行为。本文将阐述PromiScan(一个能够有效地检测网络嗅探器的软件)使用的检测机制。嗅探器为了能够截获网络上所有的分组,必须把网络接口卡(Network Interface Card,NIC)设置为混杂模式(promiscuous mode)。接着,网卡就能够接受网络上所有的分组,并将其送到系统内核。地址解析协议(Address Resolution Protocol,ARP)请求报文用来查询硬件地址到IP地址的解析。我们将使用这类分组来校验网卡是否被设置为混杂模式(promiscuous mode)。之所以会使用ARP请求分组是因为它适用于所有基于以太网的IPV4协议。在混杂模式(promiscuous mode)下,网卡不会阻塞目的地址不是自己的分组,而是照单全收,并将其传送给系统内核。然后,系统内核会返回包含错误信息的报文。基于这种机制,我们可以假造一些ARP请求报文发送到网络上的各个节点,没有处于混杂模式的网卡会阻塞这些报文,但是如果某些节点有回应,就表示这些节点的网卡处于混杂模式下。这些处于混杂模式的节点就可能运行嗅探器程序。这样就可以成功地检测到网络运行的嗅探器程序。



    1.简介


    在局域网中,嗅探行为已经成为网络安全的一个巨大威胁。通过网络嗅探,一些恶意用户能够很容易地窃取到绝密的文档和任何人的隐私。要实现上述目的非常容易,恶意用户只要从网络上下载嗅探器并安全到自己的计算机就可以了。然而,却没有一个很好的方法来检测网络上的嗅探器程序。本文将讨论使用地址解析协议(Address Resolution Protocol)报文来有效地检测办公网络和校园网上的嗅探器程序。


    3.网络嗅探的原理


    局域网通常使用以太网进行连接。在以太网线缆上使用IP(IPV4)协议传输的传递的信息是明文传输的,除非使用了加密程序进行了加密。当一个人把信息发送到网络上,他会希望只有特定的用户才能收到这些信息。但是,非常不幸,以太网的工作机制为非验证用户提供了窃取这些数据的机会。以太网在进行信息传输时,会把分组送到各个网络节点,目的地址匹配的节点会接收这些分组,其它的网络节点只做简单的丢弃操作。而接收还是丢弃这些分组由以太网卡控制。在接收分组时,网卡会过滤出目的地址是自己的分组接收,而不是照单全收。在本文以后的部分我们将把网卡的这种过滤称为硬件过滤(Hardware Filter)。但是这只是在正常情况下,嗅探器使用另一种工作方式,它把自己的网卡设置为接收所有的网络分组,而不管分组的目的地址是否是自己。这种网卡模式叫作混杂模式(Promiscuous Mode)。


    3.检测混杂模式的基本概念


    在网络中,嗅探器接收所有的分组,而不发送任何非法分组。它不会妨碍网络数据的流动,因此很难对其进行检测。不过,处于混杂模式(promiscuous mode)网卡的状态很显然和处于普通模式下不同。在混杂模式下,应该被硬件过滤掉的分组文会进入到系统的内核。是否回应这种分组完全依赖与内核。

    下面我们举一个现实世界中的例子,说明我们检测处于混杂模式网络节点的方法。设想一下,在一个会议室中正在举行一个会议。某个人把耳朵放在会议室就可以进行窃听(嗅探^_^)。当她(还是个女的,原文如此:P)进行窃听(嗅探)时,会屏住呼吸,安静地聆听会议室内所有的发言。然而,如果此时会议室内有人忽然叫窃听者的名字:“XX太太”,她就可能答应“唉”。这听起来有点好笑,但是完全可以用于网络嗅探行为的检测。网络进行网络嗅探的节点会接收网络的所有报文,因此其内核可能对某些本该被硬件过滤的分组作出错误回应。根据这个原理,我们可以通过检查节点对ARP报文的响应来检测网络的嗅探行为。



    4.基础


    1).硬件过滤器

    首先,我们从处于混杂模式(promiscuous mode)下和普通模式下有何不同开始。以太网的地址是6个字节,制造商为每块网卡分配的地址在全世界是唯一的,因此理论上没有相同地址的网卡。在以太网上的所有通讯都是基于这种硬件地址。不过,网卡可以被设置为不同的过滤模式以接收不同种类的分组。下面就是以太网卡的过滤模式:



    unicast

    网卡接收所有目的地址是自己的分组


    broadcast

    接收所有广播分组,以太网广播分组的目的地址是FFFFFFFFFFFF。这种广播分组能够到达网络上的所有节点。


    multicast

    接收目的地址为指定多投点递交(multicast)组地址的分组。网卡只接收其地址已经预先在多投点列表中注册的分组。


    all multicast

    接收所有多投点递交广播分组。


    promiscuous

    根本不检查目的地址,接收网络上所有的分组。



    图-1描述了硬件过滤器处于在正常情况下和在混杂模式下的区别。通常,网卡的硬件过滤器被设置为接收目为单投点递交(unicast)、广播(broadcast)和多投点递交(multicast)地址1的分组。过滤器只接收目的地址为自己的地址、广播地址(FF FF FF FF FF FF)和多投点地址1(01 00 5E 00 00 01)的分组。



    2).ARP机制

    使用以太网连接的IP网络需要依靠以太网进行传输。只使用IP地址,报文是无法发送的。因此,在以太网上需要一种机制来提供IP地址和硬件地址之间的转换。这种机制就是地址解析协议(Address Resolution Protocol)。ARP属于网络层,和IP处于OSI模型的同一层。在IP网络上地址解析是不断进行的,所以ARP报文比较适合用来检测处于混杂模式(promiscuous mode)的网络节点。

    在下面的例子中,我们将讲述使用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)的以太网卡处于混杂模式(promiscuous mode)下,那么即使以太网地址不匹配,其硬件过滤器也不进行任何过滤,从而使这个查询包能够进入到系统的内核。因为这个节点的IP地址和查询包的要查询IP地址相同,其内核就会认为ARP查询包到达,应该作出应答。但是,另我们吃惊的是,这个处于混杂模式节点的内核不会应答ARPR查询包。这种出人意料的结果说明这个包被系统内核过滤掉了。在这里我们把这叫作软件过滤器。



    再进一步,我们可以通过区别硬件过滤器和软件过滤器的不同特征来检测处于混杂模式的网络节点。硬件过滤器一般会阻塞所有无效的分组(这些分组显然不会进入系统内核),因此能够通过硬件过滤器一般也能够通过软件过滤器,这种情况我们不多做讨论。现在我们需要构造应该被被硬件过滤器阻塞,但是却能够通过软件过滤器的报文。如果把这种报文送到各个网络节点,那么处于普通模式下的网络节点将不做应答;而处于混杂模式的节点会进行应答。



    6.软件过滤器


    软件过滤器依赖于操作系统的内核,因此有必要理解系统内核软件过滤器是如何工作的。Linux是开放源玛系统,因此我们能够获得其软件过滤机制。但是对于Micro$oft Windows我们只有凭经验猜测了:(。

    1).Linux

    在Linux的以太网驱动模块中,分组是以硬件地址分类的。


    广播包

    FF FF FF FF FF FF


    多投点分组

    所有的分组都有一个组标志位集合,不包括广播分组。


    TO_US分组

    目的地址和本机网卡相同的分组。


    OTHERHOST分组

    所有目的地址和本机网卡不同的分组。



    现在,我们假设具有组标志位的所有分组都是广播分组。IP网络对应的以太网多投点分组的目的地址是01-00-5e-xx-xx-xx,而且,通过校验组标志位本来就不能对多投点分组进行分类。这个假设并不错误,因为01-00-5e-xx-xx-xx是一个基于IP的多投点地址,但是网卡硬件地址还用于其它高层协议。

    下面,我们看一下ARP模块的代码。


    if (in_dev == NULL ||
    arp->ar_hln != dev->addr_len
    dev->flags & IFF_NOARP ||
    skb->pkt_type == PACKET_OTHERHOST ||
    skb->pkt_type == PACKET_LOOPBACK ||
    arp->ar_pln != 4)
    goto out;


    Linux内核的ARP模块拒绝所有OTHERHOST类型的分组。接着,ARP模块将处理广播、多投点和TO_US类型的分组。表1综合了硬件过滤器和软件过滤器对各种ARP分组的过滤处理,1说明:hw(hardware)、sw(software)、res.(response)、gr(group)。



    下面,后我们将对这六硬件地址的分组进行详细描述:



    TO_US
    网卡在正常模式下,所有地址为TO_US的分组都能够通过精简过滤器和软件过滤器。因此,不管网卡是否处于混杂模式(promiscuous mode)下,ARP模块都会对其进行响应。


    OTHERHOST
    当网卡处于正常模式下,会拒绝所有地址为OTHERHOST的分组。即使网卡处于混杂模式(promiscuous mode),这种分组也无法通过软件过滤器,因此这种ARP请求不会收到响应。


    BROARDCAST
    在正常模式下,BROARDCAST分组能够也能够通过硬件和软件过滤器,因此不能用于网络节点混杂模式的检测。


    MULTICAST
    在正常模式下,如果分组的硬件地址没有在多投点地址列表中注册,网卡将拒绝接收;但是,如果网卡处于混杂模式,这种分组将畅通无阻地穿过硬件过滤器和软件过滤器。因此,可以使用这种类型的分组来检测处于混杂模式的网络节点。


    group bit
    这种类型的分组既不属于BRODCAST类型也不属于MULTICAST类型,但是其硬件地址的组位(以太网地址的首字节低序第一位)置位即:01-00-00-00-00-00。在正常模式下,网卡会拒绝接收此类分组;但是在混杂模式下,这种类型的分组能够通过硬件过滤器。而在Linux内核中,这种类型的分组被归类为多投点分组进行处理,能够穿过软件过滤器。因此,这种类型的分组也能够用于混杂模式检测。


    2).Micro$oft Windows

    Windows系统不是开放源码系统,因此不能从源代码分析其软件过滤行为。只好由实验来测试。在实验中,我们使用了以下的硬件地址:



    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-00 16位伪广播地址

    FF-FF-00-00-00-00-00只有前16位和真正的广播地址相同。如果过滤器函数只测试广播地址的第一个字,这个地址就可以归入广播地址。


    FF-00-00-00-00-00 8位伪广播地址

    这个地址只有前8位和广播地址相同,如果过滤器函数只检查广播地址的首字节,它也可以归入广播地址类。


    01-00-00-00-00-00 多投点标记置位地址

    这个地址只有多投点标记位(以太网地址的首字节低序位)被置位,用来检查过滤器函数是否也象Linux一样把它作为多投点地址处理。


    01-00-5E-00-00-00 多投点地址0

    多投点地址0并不常用,因此我们使用这个地址作为没有在网卡多投点地址列表中注册的多投点地址。正常情况下,硬件过滤器应该拒绝接收这种分组。但是,如果软件过滤器不能检查所有的地址位,这类分组就可能被归类到多投点地址。因此,如果网卡处于混杂模式(promiscuous mode),内核就会进行应答。


    01-00-5E-00-00-01 多投点地址1

    局域网上的所有网络节点都应该接收多投点地址1类型的分组。换句话说,默认情况下硬件过滤器允许这类分组通过。但是可以由于网卡不支持多投点模式而不应答。因此,这类分组可以用于检查主机是否支持多投点地址。


    即使结果:


    对于这7种类型地址的测试结果如表2所示。测试是针对Windows85/98/ME/2000和Linux。不出所料,网卡处于正常模式下,内核会对所有地址为广播地址和多投点地址1的分组进行回应。

    然而,当网卡处于混杂模式下时,每种操作系统的测试结果不尽相同。Windows95/98/ME会响应31、16、8位伪广播地址的分组。因此,我们可以认为Window9x系列操作系统的软件过滤器只通过检测一位来判断分组地址是否是广播地址。

    Windows2000对地址为31、16位伪广播地址的分组进行响应。因此,我们可以认为WindowsY2K检查地址的8位来判断分组地址是否为广播地址。

    Linux内核对所有七种地址的分组都会进行响应。






    7.混杂模式检测


    我们可以把这个测试结果用于局域网处于混杂模式节点的检测。下面是具体检测过程:


    1).我们需要检测IP地址A的主机是否处于混杂模式。我们首先需要构造如下格式的ARP分组和以太网帧:


    ARP分组:


    目的以太网地址 00 00 00 00 00 00(说明1)
    发送方以太网地址 00 11 22 33 44 55(说明2)
    高层协议类型 08 00(IP)
    硬件类型 00 01(以太网)
    硬件地址长度 06(以太网地址长度)
    IP地址长度 04
    发送方的IP地址 本机IP地址
    目标的IP地址 被检测主机的IP地址
    ARP操作码 00 01(ARP请求01、ARP应答02)


    以太网帧:


    协议类型 08 06(ARP)
    发送方的硬件地址 本机以太网卡地址
    目标硬件地址 FF FF FF FF FF FE


    说明1:这时ARP要查询的以太网地址,全部填0或者1都可以。

    说明2:用自己的以太网地址代替。



    2).分组构造完成后,我们可以把它发送到网络上。


    3).现在我们需要等待目标主机的反应。如果目标主机处于正常状态,这个分组就会被阻塞;但是如果处于混杂模式(promiscuous mode)下,我们就会收到应答。



    8.检查所有网络节点


    只要顺序使用第七节叙述的检测方法,我们就可能检测出所有处于混杂模式下的网络节点。但是,某些情况下,会使这种检测方法失效。



    9.异常情况


    上面讲到有一些情况不能使用这种方式进行混杂模式检测。这些异常情况包括:

    1).旧网卡

    有些旧网卡不支持多投点列表,例如:3COM EtherlinkIII。分组不经过硬件过滤器的检查就进入软件过滤器,

    2).3COM网卡

    安装在LInux主机的3COM 3c905网卡,默认情况下被设置为接收所有的多投点分组。因此,我们无法区别混杂模式和多投点模式。造成这种异常的原因是这种网卡的Linux驱动模块不支持多投点列表,网卡就会接收所有多投点分组。注意:Linux安装程序使用3c59x.o作为这种网卡的驱动模块。如果把驱动模块改为3c905x.o可以解决这个问题。

    3).Windows Y2K分组捕获驱动模块

    当WindowsY2K分组捕获驱动模块是动态加载的,也会产生异常情况。WinPcap2.1(2.01不同)和SMS是用于WindowsY2K的两种动态加载分组捕获驱动模块。当它们安装到WindowsY2K系统中,会有一些特别的反应。即使网卡不处于混杂模式下,也会对地址为16为伪广播地址的分组进行响应(使用这两种驱动模块的嗅探器也将无法准确操作)。也就是说,即使嗅探器没有运行也照样可以检测到。可能是Micro$oft为了方便混杂模式的检测有意为之。





    发布人:netbull 来自:LinuxAid