基于交换网络的ARPspoofingsniffer

来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:45:27
基于交换网络的ARP spoofing sniffer  加入日期:2006-1-26  点击:115
基于交换网络的ARP spoofing sniffer
bkbll(bkbll@cnhonker.net)
[注]在阅读这篇文章之前,我假设你已经知道TCP/IP协议,ARP协议,知道什么是sniffer等基本网络知识。
在一般的局域网里面,经常会有两种接入方式,一种是HUB接入(这里的HUB是指普通HUB),一种是交换机直接接入(这里的交换机是比较高级的交换机,老式交换机不在此列)。采用HUB方式接入的网络,数据传送的时候,是采用广播的方式发送,这个时候,只要一台主机将自己的网卡设置成混杂模式(promiscuous mode),就可以嗅探到整个网络的数据。 此篇文章不打算讨论这种网络环境的嗅探(sniffer)和反嗅探(anti sniffer)方法,主要是想就交换机方式直接接入的网络环境如何sniffer以及如何anti sniffer做一个比较粗浅的分析。
我们知道,一台计算机想要接入到网络中,必须要有两个地址。一个是网卡的地址,我们称之为MAC地址,它是固化在网卡中的。在以太网中,我们通过MAC地址来进行数据传送和数据交换。在以太网环境中,数据会分帧传送,每一个数据帧都会包含自己的MAC和目的MAC地址信息; 另外一个地址是平时所说的IP地址,定义在网络层,每一台网络计算机都会有一个或者多个IP地址,这是一个虚拟的数据,并且可以随时更改。
IP地址和MAC地址是同时使用的,在数据传送过程中,一个完整的TCP/IP包需要由以太网进行数据封装,数据分帧,最后再通过物理层传输到目标计算机。在以太网封装上层的TCP/IP包的时候,它需要知道源MAC地址和目的MAC地址,但是我们只能给出一个对方的IP地址,这个时候就需要一个协议来支持IP到MAC的转换,这就是ARP,Address Resolution Protocol. 
在局域网中,ARP是通过广播的方式来发送的,比如,我的机器IP是192.168.7.110(A),需要知道192.168.7.119(B)机器的MAC地址,那从A机器就会广播一个ARP包,这个包里带有B机器的IP,如果B机器收到了此ARP包,那么他就会同样返回一个ARP包,里面带有响应的MAC地址。A收到这个ARP包后,得到B的MAC地址,这个时候以太网就可以开始封装TCP/IP包了,可以开始正常的数据传送了。比如:
d:\>arp -a

Interface: 192.168.7.110 on Interface 0x1000003
Internet Address Physical Address Type
192.168.7.1 00-90-0b-01-a0-61 dynamic

d:\>ping 192.168.7.119

Pinging 192.168.7.119 with 32 bytes of data:

Reply from 192.168.7.119: bytes=32 time<10ms TTL=128

Ping statistics for 192.168.7.119:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
Control-C
^C
d:\>arp -a

Interface: 192.168.7.110 on Interface 0x1000003
Internet Address Physical Address Type
192.168.7.1 00-90-0b-01-a0-61 dynamic
192.168.7.119 00-d0-59-26-df-1a dynamic

可以清楚的看到,在未和192.168.7.119通讯之前,本机是没有该IP对应MAC地址的,但一旦通讯后,我们就知道了对方的MAC地址,windows会将对方MAC地址存在自己的ARP cache里面。
为了节省网络资源以及通讯时间,多数操作系统会保留一张ARP缓存表,里面记录曾经访问的IP和MAC地址影射记录,一旦局域网中有一个新的ARP广播,对应一个IP到MAC的记录,这个ARP缓存表就会被刷新,MAC地址会更换成新的广播包里定义的MAC地址,这个时候就存在一个问题,在更新的时候,系统并没有去检查是否真的是由该机器广播出来的,局域网中的恶意用户就会利用欺骗的方式来更改网络途径,将真正的MAC地址替换成自己的MAC地址,这种方法称之为:ARP spoofing。
交换机在处理数据的时候,它会根据自己机器内部的一个MAC到端口的数据表来查询符合要求的MAC地址数据包该发往哪个端口。这张表从交换机开机的时候就存在,在每个端口第一次数据传送的时候就会记录对应的端口的MAC地址. 通过发送我们伪造的MAC地址数据包到交换机,就可以欺骗交换机刷新自己的MAC地址到端口的数据表,假设A主机连接在2口,假设我在4口,要sniffer A主机的数据,那么我就需要伪造一个ARP数据包,告诉交换机A主机MAC地址是在4口,那么交换机就会将本来发送到A主机的数据会转送到4口上,这个时候我就可以监听到了A主机的数据传送了,这个就是基于交换网络的arp欺骗sniffer过程。
通过arp 欺骗,一般sniffer有几个方法:
1. 就是上面介绍的欺骗MAC进行数据窃听,但由于A收不到数据,这样它会重新发布ARP包,这样导致sniffer很容易暴露,而且效果不好,A会丢包,同样你的sniffer 一样不会抓到全部的数据。
2. 发起"中间人"窃听。攻击者可以在两台通讯主机之间插入一个中转回路,这样,攻击者既可以sniffer到两机的数据,同样还可以不影响两机的通讯。我们假设X是攻击者的机器,A和B是目标机器。
X如果想发起攻击,首先在向A主机发送一个ARP包,让A认为B机器IP对应的MAC地址是X主机的,同时再向B机器发送一个ARP包,让B机器认为A机器IP对应的MAC地址是X主机的,如下图:

3. MAC flood攻击
通过快速(比如超过1000线程) 发送大量伪造MAC地址数据包,会造成交换机的MAC-端口表塞满,但为了正常数据不被丢弃,大多数交换机会采取类似HUB一样方式:广播的方式发送数据。这个时候,再在网络中任何一台机器设置网卡为混杂模式,就可以sniffer到任何想要监听的数据了。
*注: 以上方法我并没有正式测试过,理论上可行,实际上还有待验证。
上面介绍了几种常见的基于switch网络的arp spoofing sniffer方法,那么对于一个管理员来说,如何防范这种方式的数据嗅探呢?
严格来说,没有一种通用的方法来解决arp欺骗造成的问题,最大的可能就是采用静态的ARP缓存表,由于静态的ARP表不可以刷新,那么伪造的ARP包将会被直接丢弃。但这样造成的问题就是,整个网络中的所有机器,都必须要建立一个静态的MAC表,在大型网络中,会增加交换机的负担,造成效率下降。如果机器更换,那么就要手工去更改MAC地址表,很显然,在大型网络中这种方式是不适用的。
在这里需要注意的是,windows下即使你建立了静态的MAC到IP的影射表,但是在收到了强制更新的ARP包后,依然会刷新机器的影射表,一样会被sniffer到。
高级交换机还提供了MAC绑定功能,指定交换机某个端口和某个MAC绑定,这种方法可以很有效的防止MAC克隆(clone)方式的窃听,但是对于上述的arp 欺骗攻击效果不大。
最可靠的方法就是采用第三方软件来解决,Arpwatch是一个运行在Unix平台下的免费工具,他可以检测到网络中所有MAC地址的变化,一旦网络中的MAC地址有变化,它就会发送一封email到指定地点。

后记:这篇小文写的很简短,其实在交换网络中还有其他几种攻击方法,比如MAC clone等,而且交换网络中的sniffer方法还不止这一种,我这里只是介绍最常见,容易发生和编程实现的sniffer方法,希望对大家有所帮助。本人水平有限,如有错误,请不吝指责.

参考文摘:
1. An Introduction to ARP Spoofing(Sean Whalen)
2. Sniffing (network wiretap, sniffer) FAQ