先说说上次面试被问到结果我回答不出来让我万分郁闷时常不爽的那一个问题,什么是ARP欺骗。
ARP(Address Resolition Protocol,地址解析协议),协议是在TCP/IP协议组件中,网际互联层的协议,基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表,用于存储IP地址及其经过解析的以太网或令牌环物理地址。在DOS下,ARP命令可以显示ARP信息。该命令的语法格式
arp [-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr][-N IfaceAddr]] [-d Inetaddr [IfaceAddr]] [-s InetAddr EtherAddr [IfaceAddr]]
-a [InetAddr] [-N IfaceAddr]:显示所有接口的,当前的ARP缓存表。要显示制定IP地址的ARP缓存项,则使用带有InetAddr参数的arp -a,此处InetAddr代表制定的IP地址。要显示指定接口的ARP缓存表,须使用-N IfaceAddr,此处的IfaceAddr代表分配给指定接口的IP地址。N区分大小写。
-g 与-a相同
-d InetAddr [IfaceAddr]:删除指定的IP地址项,此处的Inetaddr代表IP地址。对于指定的接口,要删除其中的某项,就用IfaceAddr参数。要删除所有项,就用*代替InetAddr。
-s InetAddr EtherAddr [IfaceAddr]:向ARP缓存添加项,可将IP地址InetAddr解析成物理地址EtherAddr的静态项。
范例:1,显示所有接口的ARP缓存表,输入“arp -a”。
2,对于指派的IP地址为10.0.0.99的接口,要显示其ARP缓存表,可输入“arp-a-N 10.0.0.99”。
3 修改指定IP和MAC的对应关系,如在局域网中,输入"arp -s 192.168.1.101 00-00-00-00-00-00".之后ping192.168.1.101,则ping不通。
下面是ARP欺骗原理:
我们知道,二层的以太网交换设备并不能识别32位的IP地址,它们是以48位以太网地址(就是我们常说的MAC地址)传输以太网数据包的。因此IP地址与MAC地址之间就必须存在一种对应关系,而ARP协议就是用来确定这种对应关系的协议。
ARP工作时,首先请求主机发送出一个含有所希望到达的IP地址的以太网广播数据包,然后目标IP的所有者会以一个含有IP和MAC地址对的数据包应答请求主机。这样请求主机就能获得要到达的IP地址对应的MAC地址,同时请求主机会将这个地址对放入自己的ARP表缓存起来,以节约不必要的ARP通信。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用(Windows系统这个时间为2分钟,而Cisco路由器的这个时间为5分钟),就会被删除。通过下面的例子我们可以很清楚地看出 ARP的工作机制。
假定有如下五个IP地址的主机或者网络设备,它们分别是:
主机A 192.168.1.2
主机B 192.168.1.3
网关C 192.168.1.1
主机D 10.1.1.2
网关E 10.1.1.1
假如主机A要与主机B通信,它首先会检查自己的ARP缓存中是否有192.168.1.3这个地址对应的MAC地址,如果没有它就会向局域网的广播地址发送ARP请求包,大致的意思是192.168.1.3的MAC地址是什么请告诉192.168.1.2,而广播地址会把这个请求包广播给局域网内的所有主机,但是只有192.168.1.3这台主机才会响应这个请求包,它会回应192.168.1.2一个ARP包,大致的意思是192.168.1.3的MAC地址是02-02-02-02-02-02。这样的话主机A就得到了主机B的MAC地址,并且它会把这个对应的关系存在自己的ARP缓存表中。之后主机A与主机B之间的通信就依靠两者缓存表里的MAC地址来通信了,直到通信停止后2分钟,这个对应关系才会从表中被删除。
再来看一个非局域网内部的通信过程。假如主机A需要和主机D进行通信,它首先会发现这个主机D的IP地址并不是自己同一个网段内的,因此需要通过网关来转发,这样的话它会检查自己的ARP缓存表里是否有网关192.168.1.1对应的MAC地址,如果没有就通过ARP请求获得,如果有就直接与网关通信,然后再由网关C通过路由将数据包送到网关E,网关E收到这个数据包后发现是送给主机D(10.1.1.2)的,它就会检查自己的ARP缓存,看看里面是否有10.1.1.2对应的MAC地址,如果没有就使用ARP协议获得,如果有就是用该MAC地址与主机D通信。
通过上面的例子我们知道,在以太局域网内数据包传输依靠的是MAC地址,IP地址与MAC对应的关系依靠ARP表,每台主机(包括网关)都有一个ARP缓存表。在正常情况下这个缓存表能够有效保证数据传输的一对一性,像主机B之类的是无法截获A与D之间的通信信息的。
但是主机在实现ARP缓存表的机制中存在一个不完善的地方,当主机收到一个ARP的应答包后,它并不会去验证自己是否发送过这个ARP请求,而是直接将应答包里的MAC地址与IP对应的关系替换掉原有的ARP缓存表里的相应信息。这就导致主机B截取主机A与主机D之间的数据通信成为可能。
首先主机B向主机A发送一个ARP应答包说192.168.1.1的MAC地址是02-02-02-02-02-02,主机A收到这个包后并没有去验证包的真实性而是直接将自己ARP列表中的192.168.1.1的MAC地址替换成02-02-02-02-02-02,同时主机B向网关C发送一个ARP响应包说192.168.1.2的MAC是02-02-02-02-02-02,同样,网关C也没有去验证这个包的真实性就把自己ARP表中的192.168.1.2的MAC地址替换成02-02-02-02-02-02。当主机A想要与主机D通信时,它直接把应该发送给网关192.168.1.1的数据包发送到02-02-02-02-02-02这个MAC地址,也就是发给了主机B,主机B在收到这个包后经过修改再转发给真正的网关C,当从主机D返回的数据包到达网关C后,网关也使用自己ARP表中的MAC,将发往192.168.1.2这个IP地址的数据发往02-02-02-02-02-02这个MAC地址也就是主机B,主机B在收到这个包后再转发给主机A完成一次完整的数据通信,这样就成功地实现了一次ARP欺骗攻击。
因此简单点说,ARP欺骗的目的就是为了实现全交换环境下的数据监听。大部分的木马或病毒使用ARP欺骗攻击也是为了达到这个目的.
欺骗成功了要想窃取别人的信息应该还得有个高层的接受程序吧,不然数据传过来也组织不起来,是不是这个道理呢?
上面的这大段话我感觉已经把ARP欺骗的原理讲得很清楚,我要能做到怎么去向别人解释清楚这个ARP欺骗。
下面我想学学怎么编程实现,数据包的接收和发送,我在网上看到的是PCAP这个驱动程序,我用的VC6.0,目前还没有成功编出来,其实我也只进行到安装好PCAP,添加环境变量,然后看了看里面的结构和函数,从程序上来看好像不是很困难,不过应该还需要一些资料和一些时间。关于网络协议的学习是很重要的,应用也是很重要的。这个应该是我现阶段的重点。
本文参考资料: 《网管员必读----网络基础》
《
ARP病毒攻防
:ARP欺骗攻击技术及其防范方法》