ARP 病毒的分析与防治
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://caihong.blog.51cto.com/277306/121531
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 
实现我的承诺。在这周结束之前,整理出自己的 ARP 病毒防治的思想。

先来看看 ARP 病毒是怎么回事。

简单的说就是:这种病毒自身可以伪造一些 ARP 回应包。这些包的源 IP 地址一般是重要设备的 IP 地址,而那个源 MAC 地址可能是自己的 MAC ,也可能是一个无用的 MAC 地址。而目的 IP 地址和目的 MAC 地址都是广播地址,这样的话,这个新的 ARP 条目就会发送到网络中的任何一个设备中。然后,这些设备就会更新自己的 ARP 缓存,这样一来呢,就达到欺骗的效果了。以后我们的机器在往重要的设备上发送数据的时候,就会先检查自己的 ARP 缓存啊,确实存在这么一个 ARP 条目,殊不知已经是被掉包的了。所以呢,我们发送的数据就不会按照我们原来的意愿,到达真正的目的地。

从上面的这些话当中,我们可以提炼出:中毒后的机器会频繁的自动产生一些假的 ARP 包,来达到让别的设备更新自己的 ARP 缓存的目的,以达到欺骗的目的。

我们可以分下实现这个 ARP 病毒需要分几个步骤:

1.              机器得自己产生 ARP 报文。

2.              并且一定要频繁,更新设备 ARP 缓存的间隔一定要比正常情况下的小,且小的多。

3.              别的设备得接受,并且承认这种频繁来更新的 ARP 条目。

知道了它的工作过程,那么我们就从各个步骤进行分析,下对策。

首先说呢, ARP 这个协议本身就不怎么地,本身就是不安全的。就是在没有 ARP 请求包的情况下,机器也可以发送 ARP 回应包。这样看来的话,就好像是 UDP 对应起 TCP 一样,是属于那种“无连接状态”的。也正是这种协议本身的安全缺陷,才让欺骗这么容易的进行。没事的情况下,设备还具备发送这样的 ARP 包的能力呢,别说中毒了,那就发送的更狂了,并且发送的还都是一些经过特定修改的。修改 ARP 回应包的源 Ip 地址,修改成重要设备的地址。修改了这个 IP 地址,才可以对这个对应的 IP 地址的设备进行阻碍,以后发送往这个设备发送的数据都会发送到这个中毒的机器来。也许你会说,中毒的可以发,人家那个正常的设备也可以发啊。是啊,所以为不让其他的设备承认真正的设备发送的 ARP 包,这个中毒的机器才使得自己拼命的发,一个劲的发,拼命的发。这样的话,让那个真正的设备发送的 ARP 包没有机会更新其他设备的 ARP 缓存。如果我们不该找个 ARP 包的源 MAC 地址的话,也就是说这个 MAC 地址是这个中毒的机器的 MAC 地址,那么以后发送到那个源 IP 地址的设备的数据都会发送到这个中毒的机器来。如果这个 MAC 地址是网关的地址的话,那么其他的机器上网的数据不是发送到真正的网关了,而是发送到这个中毒的机器来。如果在这个机器上再安装个分析软件的话,就完全可以知晓网络中的一切信息交流。如果这个 MAC 地址是个无效的。那么以后发送到那个源 IP 地址的数据流就会被无奈的丢弃啦。因为在 LAN 中传输数据用的是 MAC 啊,。现在每个机器都是知道了那个 IP 地址的是那个 MAC 地址,殊不知这个 MAC 是静心策划的无效 MAC 。这样一来的话,就会导致发送到那个 IP 地址的数据全部被丢弃。造成的后果如何就看这个 ARP 包的源 Ip 地址是什么设备的 IP 地址 了。如果是网关的话,那么全网的机器就都上不去网了。如果是一个普通机器的 Ip 地址呢,那么这个机器就上不去了。我们说的,这种 ARP 病毒包会频繁的发送,虽然正常的 ARP 包被接受的几率很小很小了,但是也会有被接受的可能啊,所以, ARP 病毒会导致网络中的机器上网断断续续的。厉害了,就完全出现网络断开的现象咯。不知不觉,一个“首先”就分析了 1 2 两个步骤。那么我们对于上述的这些过程,该如何阻挠呢?细看,这些都是病毒的实质的工作方式。我们不可能更改他们啊。那么我们就想想是否可以阻止这样的数据包进入网络。如果进入不了网络,那就完全么事咯。这个问题就需要我们在机器联网的地方做手脚了。那就是接入层交换机上的端口咯。也就说得让交换机的端口只允许一个 MAC 地址的数据包通过,并且这个数据包还是的 MAC 地址还是下面连接的机器的真正的 MAC 地址。这样一来呢,如果再找个端口上进出其他 MAC 地址的数据包,这个端口就会采取相应的措施:关闭端口(永久性关闭或者将端口周期性的进入到 err-disable 状态)、限制(将非匹配 MAC 地址的数据包全部丢弃掉)、保护(当端口学习的 MAC 地址数到达了设置在这个端口上可以学习的 MAC 的最大数量的时候,丢弃后面来的任何不同于先前这些 MAC 地址的数据包。)

其实,实现这个功能, CISCO 设备的端口安全特性就可以搞定。它是个接口级的命令:

CORE2(config-if)#switchport port-security ?

  aging        Port-security aging commands

  mac-address  Secure mac address

  maximum      Max secure addresses

  violation    Security violation mode

  <cr>

看到上面的这些参数,我们可以清晰的看到:端口安全特性可以实现在某个特定的 access 模式接口上设定这个端口中学习到的 MAC 地址的存活时间,设定允许学习的 MAC 地址的最大数目,设定只允许某个特定的 MAC 地址的数据包通过(也就是端口和 MAC 地址的绑定),设定违背我们设置的这些规则的处理方式(就是上面介绍的关闭端口、限制、保护三种)。在这个命令的下面有 5 个可以执行的参数,而前 4 个的实现都是在最后一个实施的基础上的。我们输入命令到这个步骤,然后敲下回车,就说明再这个端口上开启了端口安全的特性,然后再逐步实施以上的那些参数。

 

我们再来仔细分析下参数: aging \ mac-address \ maximum

Mac-address :参数后面的值就是我们想让这个端口允许通信的那个特定的 MAC 地址。输入这个命令,就算是我们把某个特定的 MAC 地址和这个端口绑定了。别的机器拿来后,插上网线是不可以上网的。利用这种方法来限制那种虚假的 ARP 包,工作量就老大了,并且网络中还是有很多移动的用户,运作起来就更加的麻烦。不好不好!不过在这个参数的后面呢,还有一个特性, sticky 特性,即:

CORE2(config-if)#switchport port-security mac-address ?

  H.H.H   48 bit mac address

              sticky  Configure dynamic secure addresses as sticky

这个特性说的就是:这个端口会记住这个端口中第一个学习到的 MAC 地址。并且只有这么一个。当然了这个学习到的 MAC 是动态的,到了一定的生存时间还是会在这个端口的缓存中消失的。至于存在多长的时间,那就看下面的这个参数咯。

 

存活时间( aging ):这个参数后面的参数值说的就是端口缓存中的 MAC 表项可以保持多久。

 

最大数( maximum ):这个参数后面的参数值说的就是这个端口允许学习的 MAC 地址的最大数量。

我们分析了,让端口和 MAC 地址绑在一起不好,太麻烦了。那么使用 sticky 特性看来还是不错的,比较方面,并且在一定程度上可以解决这个问题。但是还得结合存活时间这个参数。这样一来,就不会让这个 MAC 频繁的学习、变动了。使用了这个特性后呢,在端口允许学习的 MAC 地址的最大数量上就是 1 个了,就是那个最先学习到的 MAC 地址。那么运用这个特性的时候,最大学习数量这个参数就不需要了。如果我们不使用这个特性,而是通过限制最大学习的 MAC 地址数和存活时间,也不会太好。比如我们允许最大的是 2 个(不能太多,越多越危险,只有一个是最安全的。),存活时间设置到最大。因为 ARP 欺骗包是频繁发送的,所以只要给它一点机会,就会疯狂的发送出去,那么最大的学习数量 2 个,就成了漏洞了。

我们前面也提到了,在伪造 ARP 包的时候,源 IP 地址和源 MAC 地址都是可以进行特定的修改的。我们上面提出的这个端口安全的特性,只是针对修改 MAC 地址的欺骗 ARP 包。那么对于修改 IP 地址的 ARP 欺骗包如何避免呢?我们可以绑定 IP 地址和 MAC 地址。这样的话,即使有一个修改了 IP ARP 欺骗包,发送的时候,发现自己的 IP 地址和 MAC 地址的匹配关系和原来绑定的不一样,所以这个数据包就夭折了。也就进入不了网络了。

下面我们说说:其他的设备在什么情况下是承认新来的 ARP 条目的。在我们机器中的 ARP 缓存,其中的 MAC 条目的存活时间一般为 2—3 分钟。并且更新条目的时候,是查看 ARP 对应关系中的 IP 地址的。想想也是咯,因为在一个机器的 ARP 缓存中同时存在俩个 ARP 地址条目: IP 地址相同且 MAC 地址不相同。这种情况是肯定不存在的嘛。如果真存在的话,那么发向这个 IP 地址的数据到底该往哪里发送就全乱套了。如果是存在好几个 ARP 条目: IP 地址不相同, MAC 地址相同,还是会出现的。这种情况也就是最一般的 ARP 欺骗了啊 ~

当我们机器中的 ARP 对应条目是静态的时候,那么这个条目就是无法被代替的。也就是说它的存活时间是永久。只有是动态的,才会被新来的那些相应的条目更新掉。对于这种情况,我们有没有一个方法可以让机器不承认新来的这些 ARP 更新条目呢?弄成静态的就 OK 了吧。所以,弄个网关的绑定批处理,放在系统的启动项里,这样就好了。但是对于那种移动性很强的笔记本用户来说就不怎么方便。到一个 VLAN 中就会绑定原来 VLAN 中的网关,就会出乱子了。如果我们从目的端来处理这个问题,那么就太逊了! ~~ 因为这种情况下, ARP 欺骗包已经在网络中进行逛游了 ~~~ 并且,这种数据包,为了最大可能让别人接受它,病毒程序回把这种包的 TTL 值设置到最大。也就是说这种广播包在网络中逛游的时间会尽量的长。最好的就是在源头搞定它。

在我们上述介绍的方法中,最简单实行、有效的就是:使用端口安全的 sticky 特性 +aging 参数 +IP----MAC 地址绑定。

 

ARP 欺骗一般分为俩种:内网的和外网的。

内网的:就是发生在 LAN 内部的。一般的欺骗行为就是欺骗网关,发送一个 IP 地址是网关和 MAC 地址是自己的 ARP 欺骗包。并且别的机器都承认了这点。那么以后发送到网关的数据就会到了这个中毒的机器。如此一来,别的机器上网断断续续,非常的慢,时间长了甚至会断网。这个中毒的机器还是可以上网的,不过也会越来越慢的,因为别的机器发送的数据都得经过这个中毒的家伙联通外部网络。当中设备 down 掉后,所有的其他的机器都上不去网了。这种情况下的 ARP 欺骗很容易看出来的。如果网络非常的慢,并且时断时续的,有 ARP 病毒的特征。那么就可以进入“运行 ---CMD ”,命令: arp –a 。这样一来的话,就会看到网络 Ip 地址对应的 MAC 地址,然后你再查查这个 MAC 地址对应着多少 IP 地址,如果是很多的话,那么就中招了。解决的办法就是: arp –d ,删除原来的 ARP 缓存,并且对正确的网关 IP 地址和 MAC 地址进行绑定: arp –s [ip address]  [mac-address] 。这种情况的欺骗也是非常容易看出来的。通过 arp –a arp –s 俩搞定就 OK 了。具体的过程是:我们查看上网有问题的机器,进去看看 arp –a , 找到了那个网关的 ARP 条目,查看对应的 MAC 地址,和真的网关的 MAC 地址是不一样的,所以肯定是中毒咯。那么我们的解救办法就是删除 ARP 缓存的条目,然后手动绑定正确网关 IP MAC 地址。接下来就是找到那个中毒的机器 ----- 根据那个 MAC 地址,去中心设备上查看这个地址是从哪个端口上学习到的,然后一级一级的查下去,找到后就让它隔离杀毒去,使用的命令是: show mac-address table | include [H.H.H.H] 。并且根据上面的违背方式的处理方式做出相应的解决,比如把那些关闭了的端口 no shut 下。

刚才有点事情,打断了思路。从这里写吧(和原来的思路的轨道不会差很多哦 ~~~ 呵呵、、放心!)。我们看到了 ARP 欺骗包不是修改 Ip 地址就是修改 MAC 地址,或者是同时修改。我们把 IP 地址和 MAC 地址绑定了,就可以防止那种修改 IP 地址的 ARP 欺骗包。因为你绑定了 IP 地址后,即使那个机器关机了,他的 Ip 地址和 MAC 地址对应关系还是存在和核心设备里的。如果想伪造一个已分配出去的 IP 地址,就不会成功的,会导致冲突的。我已经尝试过了:绑定一个 IP 地址,并且将其网线拔掉,然后这个时侯就让别的机器再配置成这样的 IP 地址(现在先前配置的 IP 地址的主机已经脱网了,也不会产生冲突咯按说),尝试上网,结果不能联通网络。 OK 咯,这就说明我们上面想要阐述的问题了啊 ! 如果是修改 MAC 地址的那种欺骗包呢,我们就采用在端口上限制某些特定的 MAC 地址通过或者限制端口学习的 MAC 地址的最大数量。这个时侯呢,这些 MAC 地址条目显然是动态的,那么就有可能被 ARP 欺骗包更新掉。所以我们还得结合 MAC 条目的存活时间参数,设置的其值尽量的最大。限制端口通过特定的 MAC 地址,也就是 MAC 地址和端口绑定,这样不太好,因为有些用户移动性还是很大的。所以还是采用 sticky 特性吧。

以上说了这么多这么多的话,聊的都是 LAN 之内的 ARP 欺骗。现在还出现了 LAN 之间的 ARP 欺骗。比如一个网段的俩个机器 10.140.19.2 10.140.19.3 之间想进行通信。在路由器的那边有个机器 10.140.18.2 ,这个机器上有 ARP 病毒。当 19.2 发送给 19.3 数据的时候,原本可以很轻松的完成的。但是 18.2 的病毒就想让他们之间的数据先发送到他这里,然后发送到 19.3 ,或者是发送到他这里就 OK 了,就不往下发了。他要是想告诉 19.2 一个假的 ARP 包的话,那么那个真正的 19.3 的机器肯定不能在网络上存在的啊,否则就会产生 Ip 地址的冲突,那个假的数据包也发送不出去啊。所以第一个问题就是解决掉 19.3 这个机器,让他 down 掉。如何 down 掉呢,别问我了,至少现在我还没研究***的东西。假设它 over 了,那么 19.2 就会发送广播啊,找原来的 19.3 啊。正常的情况下,就会在路由器的一边使劲的喊,没人鸟你。如果这个时侯 18.2 发送给路由器一个特殊的包,让路由器发给 19.2 发送一个 ICMP 重定向(主机路由重定向),这个重定向报文的作用就是告诉 19.2 ,如果你想发送数据包到 19.3 ,你得把数据包发送到路由器,然后传输到 18.2 MAC 才可以。这就是让 ARP 欺骗和 ICMP 重定向结合起来了。

如果没有 ICMP 重定向这个东西,那么这个 LAN 之间的欺骗就成不了啊。如果想阻止这种欺骗,那就搞定 ICMP 重定向呗。一般什么情况下我们会开启设备的这个功能呢?说:一个 LAN 有俩个口连接着 internet 。默认的情况下呢,也就是默认路由咯,我们就使用端口 1 。但是,若默认路由出了问题,那就得使用另外的那个端口进入 internet 了。但是下面的机器不知道啊,还是把数据都发送到这个端口,这个时侯呢,这个端口就会产生一个 ICMP 重定向报文,发送给那个发送数据包的主机,以后发送数据的时候,别往我这里发了,从我这里走不是最好的走法,你直接发送到端口 2 OK 了。其实仔细想想,这不就是实现了网关的冗余嘛?如果使用了 HSRP 这种负载均衡,使用的是虚拟的网关地址。那么这样的话呢,这个 ICMP 重定向就用不到了吧。是啊,当我们开启 HSRP 或者 VRRP 的时候,这个功能就自动关闭了。如果没使用这俩个功能,我们也可以手动关闭 ICMP 重定向(在某个特定的端口下)。

如果真的是发生了这样的 LAN 之间的 ARP 欺骗,我想病毒一定会在路由器中加入一个主机路由。加入的这个路由条目的目的地址就是那个中毒的机器。找到那个 IP 地址的机器所在,隔离杀毒就好了嘛。

 

对于 ARP 病毒的分析和防治,这些都是我自己的理解。自己考虑起来,觉得不会写 11 页吧,但是居然还是写出了这么多,也许废话太多了。嘿嘿、、、那我就祝愿大家取其精华,弃其糟粕,找到自己想要了解的那些点!

有什么地方需要改正和补充的,敬请大家指出,我会及时改正,也非常期望和大家一起学习讨论! QQ:418838267

圣诞将至,祝愿:

51CTO 的所有工作人员和广大博友节日快乐!