摘  要  介绍了ARP协议工作原理,分析了ARP协议的弱点,阐述了基于ARP进行网络***的主要方式,并给出了应对措施。提出构造ARP应答包进行ARP欺骗的具体方法。
    关键词  ARP协 议;ARP欺骗;ICMP重定位;静态ARP表;地址解析;libnet
 

1  引言

    网络上的计算机之间是通过IP地址通信的,但是IP地址是位于网络层的逻辑地址,计算机之间要想真的进行数据交换必须知道它的物理地址,ARP就是将逻辑地址转换成物理地址的一个协议。因此ARP的协议的安全就显的非常重要。现在对ARP***最常用的一种方式就是ARP欺骗,在这种***方式下,***方可以通过伪造ARP请求与应答更新目标主机的ARP缓存从而骗过目标机。使目标机的数据包发给***者。***者就可以对截获的数据包的内容进行分析破解目标机的信息。

2   ARP协议

    计算机之间主要是通过IP地址通信,IP地址是一个逻辑地址,通过IP地址就可以找到目标网络,但是在一个网络内部的计算机之间进行最终的数据交换时就必须经过物理MAC地址才能识别具体的一台主机,这时我们就需要ARP协议把需要通信的目标主机的IP地址解析为与之对应的硬件物理地址。

2.1  ARP协议的基本工作原理

    一台连入互连网的计算机拥有两个地址。一个是IP地址,它是一个网络层使用的协议并且独立于网络底层。每一台在互联网上的计算机都必须有一个惟一IP地址。IP地址是一个可以通过软件设置的逻辑地址。另一个地址是网卡地址MAC地址。MAC地址是一个固定在网卡中的全球独一无二的地址。通过MAC地址,以太网就能独立于上层协议收发数据。当两台主机进行通信时,IP数据被封装成以太帧格式的一个个的数据包,这些数据包通过数据链路层进行传送,ARP消息就被封装在以太帧的数据部分。每一台基于TCP/IP协议的主机都有一个ARP缓存表。里面包括硬件类型,硬件地址长度,操作号,源IP地址与MAC地址,目的IP地址与MAC地址。如果一台主机甲要与另一台主机乙进行数据通信,且它们位于一个网段时,它们之间的具体通信过程如下:甲查看自己的ARP缓存表,寻找乙机器的相关信息,如果找到的话,就使用表中与乙的IP地址对应的MAC地址来通信;若查找失败,就会向局域网中发送一个以太网的广播帧,往帧中填充甲主机的IP地址和MAC地址,乙主机的IP地址等字段形成一个ARP请求。此时此网段内的所有机器都会收到此请求,但只有乙主机收到后发现此请求中有自己的IP地址从而作出响应。它先刷新自己的ARP缓存,以便提高以后的通信效率,而后生成一个ARP应答帧将自己的MAC地址填充进去发送给甲主机。甲收到后将乙的ARP信息写入自己的ARP缓存中。若不在同一网段,此过程分为两个阶段,第一阶段甲会广播一个ARP请求来得到本地网关的MAC地址,然后将数据发送到网关。再判断网关与乙是否在同一网段。如果是就进入第二阶段查找IP/MAC,转发数据否则继续广播ARP请求。(如图1)当一台机器更换了新网卡后,就会通知网内其它主机,使之更新各自的ARP表项使IP地址和新的MAC地址保持一致。因此每台机器在启动时都会发一个以太网广播帧通知其它主机及时更新ARP缓存。
第一阶段                                    第二阶段
图1  不同网段的ARP***

2.2  ARP协议的弱点

   由于ARP缓存表是动态刷新的。根据RFC826规定当主机接收到ARP应答时,主机的ARP表会立刻刷新而无需判断是否事先发过ARP请求。若主机长时间没有收到ARP应答(一般是20分钟)它会自动刷新ARP缓存表,这样可以删掉那些过期的,已经不存在的表项。确保ARP缓存表的正确性。但是这样很容易使主机的ARP缓存表被***者修改。使主机的ARP表项改成***者需要的表项。

3  ARP***

    ARP***主要是就基于ARP缓存表的的弱点,***者非法篡改目标机ARP缓存表,使目标主机无法正常工作的行为。ARP***主要有拒绝服务***和ARP欺骗。

3.1 拒绝服务***

    ***者可以很容易的将目标主机中IP地址对应的MAC地址改成根本不存在的地址,这样计算机就会往这个根本不存在的地址发送数据包,导致目标机无法接收到数据包,中断了主机与外界网络的通信。

3.2  ARP欺骗

3.2.1 中间人***
    这种***是网络监听的一种方式。***者进入两台通信的计算机之间,通过某种手段窃取一台机器给另一台机器发送的数据包,然后将数据包修改再转发给另一台机器,***者对这两台计算机来说是透明的。具体过程如下。
    假设三台计算机A、B、C。机器C修改A的ARP缓存表,将表中B的IP地址对应的MAC地址改成C的MAC地址。当A给B发送数据时,就使用了B的IP地址与C的MAC地址。使给B发送的数据全部发给了C。同理修改目标机B的ARP缓存表使A的IP地址对应的MAC地址改成C的MAC地址。最终A与B之间通信的数据就全部经过C,之后C又把数据发给A和B。
3.2.2 克隆***
    克隆***是另外一种ARP欺骗的方式。现在我们已经可以通过硬件或软件工具来修改网络接口的MAC地址,Linux用户甚至只需要用ifconfig命令修改一个参数就能修改。***者通过拒绝服务***使目标主机与外界失去联系,然后***者将自己的IP和MAC地址改成目标机的IP和MAC地址,这样***者的主机就成为和目标机一样的副本。

4  ARP欺骗的防范措施

4.1  MAC地址绑定

    MAC地址与交换机绑定。一台高质量的交换机往往有一个功能就是不允许修改与交换机某个端口绑定的MAC地址。当确实需要修改时,只能被网络管理者修改。

4.2  静态缓存表

    将ARP缓存表设置成静态,不允许其自动刷新。网络管理员负责对网络上的每台机器进行登记,记录每台机器的IP/MAC。这样在发送一个与ARP静态缓存不一致的请求时目标机将不予理睬。但这种方法不适合于大型的网络,它需要定期维护ARP表,给管理员造成很大的负担。

4.3  RARP

    RARP即地址反转协议。RARP协议用于知道一个MAC地址确定它的IP地址。在一个网络内部,主机向网内的所有计算机发送一个RARP请求,这时若一个MAC地址收到多个IP地址,就说明拥有该MAC地址的机器受到克隆***。

4.4  ARPWATCH

    ARPWATCH 是一款用于查看IP地址与其对应的物理地址之间变化的软件。在用户启动时,ARP就收集本地网络上所有机器的ARP包并生成一个数据库文件来存储MAC/IP。
    当开始运行时就会开始监听网络,将捕获的数据包与数据库中的内容进行比较,如果不一样的话就会发出一份EMAL警告,同时记录现场用来帮助追踪追击者的来源。因此当有一个ARP欺骗发生时,当***者试图修改ARP表时ARPWATCH就会发现,并记录下来并发E-mail通网络管理员使其采取相应措施。

5  利用Libnet开发包构造ARP欺骗应答数据包

5.1  ARP报文格式

    ARP的报文格式如图2所示。
硬件地址类型
协议地址类型
硬件地址长度
逻辑地址长度
操作
发送端硬件地址
发送端硬件地址
发送端IP地址
发送端IP地址
目标硬件地址
目标硬件地址
目标IP地址
图2  ARP的报文格式
    图2中每行对应ARP消息32位。前两个16位字段的值用于指定协议地址和硬件地址的类型。例如,当ARP在以太网上时,硬件地址类型字段的值为1,当ARP用在IP地址上时,协议地址字段的值就为0X0800。硬件地址长度和逻辑地址长度,用于指定硬件地址和协议地址中的字节数。操作字段用于指定该消息是请求(值为1)消息还是应答(值为2)消息。

5.2  使用Libnet构造ARP应答数据包

    Libnet是一个专业网络数据包构造和开发包。它是一个高层次的API函数库,允许开发者构造和发送网络数据包。Libnet提供了一个对底层网络数据包进行构造,修改和发送的高级接口。Libnet主要提供了在IP层和链路层构造网络数据包的功能和一些非常有用的辅助功能。
构造ARP数据包的步骤如下:
    (1)利用函数libnet_init()进行初始化操作。因为ARP协议是在网络层,所以必须先构造ARP协议块,也就是用函数libnet_build_arp()来构造ARP协议块。
    (2)利用函数libnet_autobuld_Ethernet() 或 libnet_build_Ethernet() 来构造以太网协议块。
    (3)利用libnet_write()发送数据包。
构造ARP数据包的流程如图3所示。
图3  ARP数据包的流程
 
初始化libnet_init()
构造ARP协议块
Libnet_build_arp()或
Libnet_autobuild_arp()
构造以太网协议块
Libnet_build_ethernet()或libnet_autobuild_ethernet()
 
发送数据包libnet_write()
销毁libnet_destroy()
    制作ARP应答欺骗包。其中目的IP是210.40.7.183,源IP是210.40.7.186,目的MAC是主机210.40.7.183的MAC地址00-1B-B9-7B-70-4C。而源MAC地址我们填充为210.40.7.181的MAC地址00-1B-B9-79-E0-4C。当我们发给主机210.40.7.186时它会认为这个包是210.40.7.183发的但其实是210.40.7.181发送的,这时210.40.7.181就可以监听210.40.7.183与210.40.7.186之间的通信。其主要实现过程用C语言描述如下:
#include <win32/libnet.h> 
/*在 windows平台下必须包含此文件,文件libnet.h是Libnet开发包的头文件*/
main()
{
int packet_size;
libnet_ptag_t  protocol_tag;
char *destination_ip_str ="210.40.7.183"; /*目的IP地址字符串变量*/
char *source_ip_str = "210.40.7.186"; /*源IP地址字符串变量*/
u_char hardware_source[6] = { 0x00,0x1B,0xB9,0X79,0xE0,
0x4C }/*源MAC地址*/
u_char hardware_destination[6] = {0x00,0x1B,0xB9,0x7B,0x70,0x4C }/*目的MAC地址*/
destination_ip = libnet_name2addr4(l,destination_ip_str,LIBNET_RESOLVE); /* 把目的IP地址字符串形式转化成网络顺序字节形式的数据 */
source_ip = libnet_name2addr4(l,source_ip_str,LIBNET_RESOLVE); /* 把源IP地址字符串形式转化成网络顺序字节形式的数据 */
/*定义所需变量,主要有:packet_size,存放数据包长度的变量。libnet_t,libnet句柄。libnet_ptag_t protocol_tag,协议块标记。device,设备名字。error_information,错误信息。等*/
l = libnet_init(LIBNET_LINK_ADV,device,error_information) /*初始化libnet,包括三个参数:libnet类型,网络设备,错误信息。*/
protocol_tag = libnet_build_arp(ARPHRD_ETHER,…….. (u_int8_t*) &destination_ip……) /*根据ARP协议格式构造ARP协议块,其中参数主要包括硬件地址类型,协议地址类型等*/
protocol_tag = libnet_autobuild_ethernet(hardware_destination,ETHERTYPE_ARP,1);/*构造一个以太网协议块,参数包括目的硬件地址,以太网上层协议类型,*libnet句柄*/
packet_size = libnet_write(l);  /* 发送已经构造的ARP数据包,注意此数据包应该包括两部分,一部分是ARP协议块,另外一部分是以太网协议块*/
libnet_destroy(l); }  /* 销毁libnet */
    运行此程序会发送一个ARP应答。我们用ARP卫士验证是否发生了ARP欺骗。当运行此程序时,ARP卫士会出现图4所示。可以看到这与我们构造的ARP应答包一致。ARP卫士还会提示:这是发送的一个非法的ARP应答包,没有被规则允许,包的源IP为210.40.7.186,源MAC为00-1B-79-E0-4C,这个源MAC地址对应的IP是210.40.7.181,出现这种情况说明210.40.7.181正在进行欺骗,试图使210.40.7.186指向210.40.7.181。

图4

6  总结

    ARP***是一种非常专业化的网络***方式,它会给网络管理员增加很大的负担,破坏主机数据,窃取主机信息。本文从ARP协议的功能,原理入手,分析出了ARP协议的弱点以及由于这些弱点产生的***方式并且提出了有针对性的解决方案。最后根据ARP报文格式构造了ARP欺骗包。

参考文献

[1] Sean Whalen.《An Introduction to ARP Spoofing》April,2001
[2] Internet Protocols CSC / ECE 573.《The Address Resolution Protocol》Fall,2005 N。 C。 State University
[3] [美]DOUGLAS E,Comer著.《计算机网络与Internet-网络应用》(第三版). 清华大学出版社
[4] 刘文涛著.《网络安全开发包详解》. 电子工业出版社 2005
    基金资助:美国GeneChiu基金资助(GFC2006-001)
    收稿日期:4月14日  修改日期:5月29日
    作者简介:吴勇(1981-),男,硕士研究生;主要研究方向:模型检测、协议分析;李祥(1942-),男,教授。