ARP协议概述
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。 在局域网中, 网络中实际传输的是“帧”, 帧里面是有目标主机的MAC地址的。 在以太网中, 一个主机要和另一个主机进行直接通信, 必须要知道目标主机的MAC地址。 但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。 所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。 ARP协议的基本功能就是通过目标设备的IP地址, 查询目标设备的MAC地址, 以保证通信的顺利进行。
ARP工作时, 送出一个含有所希望的IP地址的以太网广播数据包。 目的地主机, 或另一个代表该主机的系统, 以一个含有IP和以太网地址对的数据包作为应答。 发送者将这个地址对高速缓存起来, 以节约不必要的ARP通信。
如果有一个不被信任的节点对本地网络具有写访问许可权, 那么也会有某种风险。 这样一台机器可以发布虚假的ARP报文并将所有通信都转向它自己, 然后它就可以扮演某些机器, 或者顺便对数据流进行简单的修改。 ARP机制常常是自动起作用的。 在特别安全的网络上, ARP映射可以用固件, 并且具有自动抑制协议达到防止干扰的目的。
图1 以太网上的ARP报文格式
图1是一个用作IP到以太网地址转换的ARP报文的例子。 在图中每一行为32位, 也就是4个八位组表示。
硬件类型字段指明了发送方想知道的硬件接口类型, 以太网的值为1。 协议类型字段指明了发送方提供的高层协议类型, IP为0806(16进制)。 硬件地址长度和协议长度指明了硬件地址和高层协议地址的长度, 这样ARP报文就可以在任意硬件和任意协议的网络中使用。 操作字段用来表示这个报文的目的, ARP请求为1, ARP响应为2, RARP请求为3, RARP响应为4。
当发出ARP请求时, 发送方填好发送方首部和发送方IP地址, 还要填写目标IP地址。 当目标机器收到这个ARP广播包时, 就会在响应报文中填上自己的48位主机地址。
我们先看一下windows 2000下的arp命令(如果开始arp表中的内容为空的话,需要先对某台主机进行一个连接,例如ping一下目标主机来产生一个arp项):
用"arp --a"命令可以显示主机地址与IP地址的对应表, 也就是机器中所保存的arp缓存信息。 这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。 高速缓存中每一项的生存时间一般为20分钟, 起始时间从被创建时开始算起。
在执行上面一条ping命令的同时, 进行监听:
我们将会听到很多包, 我们取与我们arp协议相关的2个包:
ARP欺骗
我们先复习一下上面所讲的ARP协议的原理。 在实现TCP/IP协议的网络环境下, 一个ip包走到哪里, 要怎么走是靠路由表定义, 但是, 当ip包到达该网络后, 哪台机器响应这个ip包却是靠该ip包中所包含的硬件mac地址来识别。 也就是说, 只有机器的硬件mac地址和该ip包中的硬件mac地址相同的机器才会应答这个ip包, 因为在网络中, 每一台主机都会有发送ip包的时候, 所以, 在每台主机的内存中, 都有一个 arp--> 硬件mac 的转换表。 通常是动态的转换表(该arp表可以手工添加静态条目)。 也就是说, 该对应表会被主机在一定的时间间隔后刷新。 这个时间间隔就是ARP高速缓存的超时时间。
通常主机在发送一个ip包之前, 它要到该转换表中寻找和ip包对应的硬件mac地址, 如果没有找到, 该主机就发送一个ARP广播包, 于是, 主机刷新自己的ARP缓存。 然后发出该ip包。
了解这些常识后, 现在就可以谈在以太网络中如何实现ARP欺骗了, 可以看看这样一个例子。
同一网段的ARP欺骗
同一网段的ARP欺骗
图2 同一网段的arp欺骗
如图2所示, 三台主机
A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA
B: ip地址 192.168.0.2 硬件地址 BB:BB:BB:BB:BB:BB
C: ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC
一个位于主机B的入侵者想非法进入主机A, 可是这台主机上安装有_blank">防火墙。 通过收集资料他知道这台主机A的_blank">防火墙只对主机C有信任关系(开放23端口(telnet))。 而他必须要使用telnet来进入主机A, 这个时候他应该如何处理呢?
我们这样考虑, 入侵者必须让主机A相信主机B就是主机C, 如果主机A和主机C之间的信任关系是建立在ip地址之上的。 如果单单把主机B的ip地址改的和主机C的一样, 那是不能工作的, 至少不能可靠地工作。 如果你告诉以太网卡设备驱动程序, 自己IP是192.168.0.3, 那么这只是一种纯粹的竞争关系, 并不能达到目标。 我们可以先研究C这台机器如果我们能让这台机器暂时当掉, 竞争关系就可以解除,这个还是有可能实现的。 在机器C当掉的同时, 将机器B的ip地址改为192.168.0.3,这样就可以成功的通过23端口telnet到机器A上面, 而成功的绕过_blank">防火墙的限制。
上面的这种想法在下面的情况下是没有作用的, 如果主机A和主机C之间的信任关系是建立在硬件地址的基础上。 这个时候还需要用ARP欺骗的手段让主机A把自己的ARP缓存中的关于192.168.0.3映射的硬件地址改为主机B的硬件地址。
我们可以人为的制造一个arp_reply的响应包,发送给想要欺骗的主机,这是可以实现的,因为协议并没有规定必须在接收到arp_echo后才可以发送响应包.这样的工具很多,我们也可以直接用snifferpro抓一个arp响应包,然后进行修改。
你可以人为地制造这个包。 可以指定ARP包中的源IP、目标IP、源MAC地址、目标MAC地址。
这样你就可以通过虚假的ARP响应包来修改主机A上的动态ARP缓存达到欺骗的目的。
下面是具体的步骤:
1. 他先研究192.0.0.3这台主机, 发现这台主机的漏洞。
2. 根据发现的漏洞使主机C当掉, 暂时停止工作。
3. 这段时间里, 入侵者把自己的ip改成192.0.0.3
4. 他用工具发一个源ip地址为192.168.0.3源MAC地址为BB:BB:BB:BB:BB:BB的包给主机A, 要求主机A更新自己的arp转换表。
5. 主机更新了arp表中关于主机C的ip-->mac对应关系。
6. _blank">防火墙失效了, 入侵的ip变成合法的mac地址, 可以telnet 了。
上面就是一个ARP的欺骗过程, 这是在同网段发生的情况, 但是, 提醒注意的是, 在B和C处于不同网段的时候, 上面的方法是不起作用的。
不同网段的ARP欺骗
不同网段的ARP欺骗
图3 不同网段之间的ARP欺骗
如图3所示A、C位于同一网段而主机B位于另一网段, 三台机器的ip地址和硬件地址如下:
A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA
B: ip地址 192.168.1.2 硬件地址 BB:BB:BB:BB:BB:BB
C: ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC
在现在的情况下, 位于192.168.1网段的主机B如何冒充主机C欺骗主机A呢?显然用上面的办法的话, 即使欺骗成功, 那么由主机B和主机A之间也无法建立telnet会话, 因为路由器不会把主机A发给主机B的包向外转发, 路由器会发现地址在192.168.0.这个网段之内。
现在就涉及到另外一种欺骗方式―ICMP重定向。 把ARP欺骗和ICMP重定向结合在一起就可以基本实现跨网段欺骗的目的。
什么是ICMP重定向呢?
ICMP重定向报文是ICMP控制报文中的一种。 在特定的情况下, 当路由器检测到一台机器使用非优化路由的时候, 它会向该主机发送一个ICMP重定向报文, 请求主机改变路由。 路由器也会把初始数据报向它的目的地转发。 我们可以利用ICMP重定向报文达到欺骗的目的。
下面是结合ARP欺骗和ICMP重定向进行攻击的步骤:
1. 为了使自己发出的非法ip包能在网络上能够存活长久一点, 开始修改ip包的生存时间ttl为下面的过程中可能带来的问题做准备。 把ttl改成255. (ttl定义一个ip包如果在网络上到不了主机后, 在网络上能存活的时间, 改长一点在本例中有利于做充足的广播)
2. 下载一个可以自由制作各种包的工具(例如hping2)
3. 然后和上面一样, 寻找主机C的漏洞按照这个漏洞当掉主机C。
4. 在该网络的主机找不到原来的192.0.0.3后, 将更新自己的ARP对应表。 于是他发送一个原ip地址为192.168.0.3硬件地址为BB:BB:BB:BB:BB:BB的ARP响应包。
5. 好了, 现在每台主机都知道了, 一个新的MAC地址对应192.0.0.3,一个ARP欺骗完成了, 但是, 每台主机都只会在局域网中找这个地址而根本就不会把发送给192.0.0.3的ip包丢给路由。 于是他还得构造一个ICMP的重定向广播。
6. 自己定制一个ICMP重定向包告诉网络中的主机:"到192.0.0.3的路由最短路径不是局域网, 而是路由, 请主机重定向你们的路由路径, 把所有到192.0.0.3的ip包丢给路由。 "
7. 主机A接受这个合理的ICMP重定向, 于是修改自己的路由路径, 把对192.0.0.3的通讯都丢给路由器。
8. 入侵者终于可以在路由外收到来自路由内的主机的ip包了, 他可以开始telnet到主机的23口。
其实上面的想法只是一种理想话的情况, 主机许可接收的ICMP重定向包其实有很多的限制条件, 这些条件使ICMP重定向变的非常困难。
TCP/IP协议实现中关于主机接收ICMP重定向报文主要有下面几条限制:
1. 新路由必须是直达的
2. 重定向包必须来自去往目标的当前路由
3. 重定向包不能通知主机用自己做路由
4. 被改变的路由必须是一条间接路由
由于有这些限制, 所以ICMP欺骗实际上很难实现。 但是我们也可以主动的根据上面的思维寻找一些其他的方法。 更为重要的是我们知道了这些欺骗方法的危害性, 我们就可以采取相应的防御办法。
ARP欺骗的防御
知道了ARP欺骗的方法和危害, 我们给出一些初步的防御方法:
1. 不要把你的网络安全信任关系建立在ip地址的基础上或硬件mac地址基础上, (rarp同样存在欺骗的问题), 理想的关系应该建立在ip+mac基础上。
2. 设置静态的mac-->ip对应表, 不要让主机刷新你设定好的转换表。
3. 除非很有必要, 否则停止使用ARP, 将ARP做为永久条目保存在对应表中。 在linux下可以用ifconfig -arp可以使网卡驱动程序停止使用ARP。
4. 使用代理网关发送外出的通讯。
5. 修改系统拒收ICMP重定向报文在linux下可以通过在_blank">防火墙上拒绝ICMP重定向报文或者是修改内核选项重新编译内核来拒绝接收ICMP重定向报文。 在win2000下可以通过_blank">防火墙和IP策略拒绝接收ICMP报文。
代理ARP的应用
代理ARP有两大应用,一个是有利的就是我们在_blank">防火墙实现中常说的透明模式的实现,另一个是有害的就是通过它可以达到在交换环境中进行嗅探的目的.由此可见同样一种技术被应用于不同的目的,效果是不一样的.
我们先来看交换环境中局域网的嗅探.
通常在局域网环境中, 我们都是通过交换环境的网关上网的。 在交换环境中使用NetXray或者NAI Sniffer一类的嗅探工具除了抓到自己的包以外, 是不能看到其他主机的网络通信的。
但是我们可以通过利用ARP欺骗可以实现Sniffer的目的。
ARP协议是将IP地址解析为MAC地址的协议, 局域网中的通信都是基于MAC地址的。
图4 交换网络中的ARP欺骗
如图4所示, 三台主机位于一个交换网络的环境中, 其中A是网关:
A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA
B: ip地址 192.168.0.2 硬件地址 BB:BB:BB:BB:BB
C:ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC
在局域网中192.168.0.2和192.168.0.3都是通过网关192.168.0.1上网的, 假定攻击者的系统为192.168.0.2, 他希望听到192.168.0.3的通信, 那么我们就可以利用ARP欺骗实现。
这种欺骗的中心原则就是arp代理的应用.主机A是局域网中的代理服务器,局域网中每个节点的向外的通信都要通过它.主机B想要听主机C的通信,它需要先使用ARP欺骗,让主机C认为它就是主机A,这个时候它发一个IP地址为192.168.0.1,物理地址为BB:BB:BB:BB:BB:BB的ARP响应包给主机C,这样主机C会把发往主机A的包发往主机B.同理,还要让网关A相信它就是主机C,向网关A发送一个IP地址为192.168.0.3,物理地址为BB:BB:BB:BB:BB:BB的包。
上面这一步的操作和前面的ARP欺骗的原理是一样的,但是还是有问题,过一段时间主机B会发现自己无法上网.所以下面还有一个步骤就是需要在主机B上转发从主机A到主机C的包,并且转发从主机C到主机A的包.现在我们可以看到其实主机B在主机A和主机C的通讯中起到了一个代理的作用,这就是为什么叫做ARP代理的原因。
具体实现要用到两个工具dsniff和fragrouter,dsniff用来实现ARP欺骗,fragroute用来进行包的转发。
首先利用dsniff中的arpspoof来实现ARP欺骗,dsniff软件可以在下面的网址下载:
http://naughty.monkey.org/~dugsong/dsniff
安装这个软件包之前先要下载安装libnet。
欺骗192.168.0.3, 告诉这台机器网关192.168.0.1的MAC地址是192.168.0.2的MAC地址.
[root@sound dsniff-2.3]# ./arpspoof -i eth0 -t 192.168.0.3 192.168.0.1
欺骗192.168.0.1, 告诉192.168.0.1主机192.168.0.3的MAC地址是192.168.0.2的MAC地址。
[root@sound dsniff-2.3]# ./arpspoof -i eth0 -t 192.168.0.1 192.168.0.3
现在我们已经完成了第一步的欺骗,这个欺骗是通过arpspoof来完成的,当然您也可以使用别的工具甚至自己发包来完成.现在我们可以看到在主机A和主机C的arp列表里面都完成了我们需要的工作.在后面的透明代理中我们将使用另外一种不同的理念。
下面我们先打开linux系统中的转发包的选项:
[root@sound /root]# echo "1" >/proc/sys/net/ipv4/ip_forward
下面我们可以下载大名鼎鼎的dugsong的另外一个工具fragroute,这个工具以前叫做fragrouter(仅有1字的差别)主要用于实现入侵检测系统处理分片的ip和tcp包功能的检测,本身自代包转发的功能.可以到下面的网站下载:
http://monkey.org/~dugsong/fragroute/
安装这个软件包之前先要下载安装libpcap和libevent.
当然我们也可以使用fragrouter来完成:
http://www.packetstormsecurity.o ... ectools/fragrouter/
[root@sound fragrouter-1.6]# ./fragrouter -B1
fragrouter: base-1: normal IP forwarding
现在就可以实现在交换局域网中嗅探的目标.当然上面这些只是一些原理性的介绍,在真正的使用中会遇到很多的问题,比如如何实现对网关A和主机C的欺骗,以及如何处理可能出现的广播风暴问题,这些可以在实践中学习.还有一个叫arpsniff的工具能够很方便的完成这一功能,很多网站都提供下载,界面比较友好,由于和上面的原理一样,只是工具使用上的不同并且添加了一些附加的功能,所以这里不在进行介绍。
代理ARP的另外一个应用就是_blank">防火墙的透明代理的实现.我们都知道早期的_blank">防火墙大都是基于路由模式,也就是_blank">防火墙要完成一个路由的作用.这种接入方式需要在局域网内的主机上设置_blank">防火墙的IP为代理,而且需要在外部路由器的路由表中加入一条指向_blank">防火墙的路由.这种方式的缺点在于不透明,需要进行过多的设置,并且破坏了原有的网络拓扑.所以现在几乎全部的_blank">防火墙都实现了一种透明接入的功能,用户的路由器和客户端不用做任何修改,用户甚至感觉不到透明接入方式_blank">防火墙的存在.这种透明接入的原理就是ARP代理。
我们现在看如何配置一台主机作为透明接入模式的_blank">防火墙(透明接入的_blank">防火墙不需要IP):
图5
如图5所示,一台_blank">防火墙连接内部网段和DMZ网段到外部路由.我们在这台用作_blank">防火墙的主机上使用linux操作系统,这样我们可以方便的使用iptables_blank">防火墙.假设三块网卡为eth0,eth1和eth2,eth0和路由器相连,eth1和内网相连.eth2和外网相连.假设DMZ区有2台服务器.
内网地址:192.168.1.0/24
DMZ地址:192.168.1.2---192.168.1.3
路由器的ip地址:192.168.1.1
eth0:AA:AA:AA:AA:AA:AA
eth1:BB:BB:BB:BB:BB:BB
eth2:CC:CC:CC:CC:CC:CC
和前面差不多,第一步需要实现ARP欺骗,这次我们有个简单的实现.我们把路由器的IP地址和_blank">防火墙的eth1和eth2的网卡物理地址绑定,将内网和DMZ网段的IP地址和eth0的网卡绑定,在linux系统上我们用arp命令实现:
arp -s 192.168.1.1 BB:BB:BB:BB:BB:BB
arp -s 192.168.1.1 CC:CC:CC:CC:CC:CC
arp -s 192.168.1.0/24 AA:AA:AA:AA:AA:AA
第二步我们需要在基于linux的_blank">防火墙上设置路由,把目标地址是外部路由的包转发到eth0,把目标地址为内网的包转发到eth1,把目标地址是DMZ网段服务器的包转发到eth2.在linux下面用route命令实现
route add 192.168.1.1 dev eth0
ROUTE ADD -NET 192.168.1.0/24 DEV ETH1
route add 192.168.1.2 dev eth2
route add 192.168.1.3 dev eth3
(针对DMZ网段里面的每台服务器都要增加一条单独的路由) 现在我们就已经实现了一个简单的arp代理的透明接入,当然对应于_blank">防火墙的iptables部分要另外配置,iptables的配置不在本文范畴之内。
小结
本文介绍了ARP协议以及与其相关的安全问题。 一个重要的安全问题就是ARP欺骗, 我们讲到了同一网段的ARP欺骗以及跨网段的ARP欺骗和ICMP重定向相结合的方法。 由于有这些安全问题的存在, 我们给出一些最基本的解决办法。 最后谈到了利用代理ARP实现在交换网络中嗅探和_blank">防火墙的透明接入。