至少四年以前写的。还是有些借鉴意义,稍微编辑了一下,发布于此。加了个tag OldStory。

背景

紫菘10栋,上学期末,某位哥们的“肉机”中了ARP病毒,不停地伪装成我们10栋的网关218.197.219.254给其他计算机发包,至少导致了316以及附近的一排寝室无法上网,拨号软件mentohust不停的提示arp欺骗源的出现,都有一种想把他电脑砸掉的心了,可惜虽然知道他的MAC地址(当然也可能是某些病毒将其电脑伪装成的错误地址),但不知道是那一台。此次事件对我触动颇深,因此借这个网络基础课程的小论文的机会,给大家介绍一下ARP与ARP欺骗的原理,并提出一些解决方法。

ARP协议

基本功能

ARP是地址转换协议(Address Resolution Protocol)的英文缩写,它是一个链路层协议,工作在OSI模型的第二层,在本层和硬件接口间进行联系,同时对上层(网络层)提供服务。 在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。而在TCP/IP协议栈中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址,ARP 协议就是用来确定这种对应关系的协议。所谓地址解析(address resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。 另外,当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的某个端口的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为ARP代理(ARP Proxy)。

工作原理

ARP数据包根据接收对象不同,可分为两种: 广播包(Broadcast)。广播包目的MAC地址为FF-FF-FF-FF-FF-FF,交换机设备接收到广播包后,会把它转发给局域网内的所有主机。 非广播包(Non-Broadcast)。非广播包后只有指定的主机才能接收到。 ARP数据包根据功能不同,也可以分为两种: ARP请求包(ARP Request)。ARP请求包的作用是用于获取局域网内某IP对应的MAC地址。 ARP回复包(ARP Reply)。ARP回复包的作用是告知别的主机,本机的IP地址和MAC是什么。 广播的一般都是ARP请求包,非广播的一般都是ARP回复包。 假设局域网内有以下两台主机,主机名、IP地址、MAC地址分别如下:

主机名 IP地址 MAC地址
A 192.168.0.1 AA-AA-AA-AA-AA-AA
B 192.168.0.2 BB-BB-BB-BB-BB-BB

当主机A需要与主机B进行通讯时,它会先查一下本机的ARP缓存中,有没有主机B的MAC地址。如果有就可以直接通讯。如果没有,主机A就需要通过ARP协议来获取主机B的MAC地址,具体做法相当于主机A向局域网内所有主机喊一嗓子:“喂~谁是192.168.0.2?我是192.168.0.1,我的MAC地址是AA-AA-AA-AA-AA-AA。你的MAC地址是什么,快告诉我”,这时候主机A发的数据包类型为:广播-请求。

当主机B接收到来自主机A的“ARP广播-请求”数据包后,它会先把主机A的IP地址和MAC地址对应关系保存/更新到本机的ARP缓存表中,然后它会给主机A发送一个“ARP非广播-回复”数据包,其作用相当于告诉主机A:“嘿,我是192.168.0.2,我的MAC地址是BB-BB-BB-BB-BB-BB”。当主机A接收到主机B的回复后,它会把主机B的IP地址和MAC地址对应关系保存/更新到本机的ARP缓存表中,之后主机A和B就可以进行通讯了。

从上述局域网主机通讯过程可以看出,主机在两种情况下会保存、更新本机的ARP缓存表,接收到“ARP广播-请求”包时; 接收到“ARP非广播-回复”包时

arp命令

格式:

ARP -s inet_addr eth_addr [if_addr]
ARP -d inet_addr [if_addr]
ARP -a [inet_addr] [-N if_addr] [-v]

命令

-a            通过询问当前协议数据,显示当前 ARP 项。如果指定 inet_addr,则只显示指定计算机的 IP 地址和物理地址。如果不止一个网络接口使用 ARP,则显示每个 ARP 表的项。
-g            与 -a 相同。
-v            在详细模式下显示当前 ARP 项。所有无效项和环回接口上的项都将显示。
inet_addr     指定 Internet 地址。
-N if_addr    显示 if_addr 指定的网络接口的 ARP 项。
-d            删除 inet_addr 指定的主机。inet_addr 可以是通配符 *,以删除所有主机。
-s            添加主机并且将 Internet 地址 inet_addr与物理地址 eth_addr 相关联。物理地址是用连字符分隔的 6 个十六进制字节。该项是永久的。
eth_addr      指定物理地址。
if_addr       如果存在,此项指定地址转换表应修改的接口的 Internet 地址。如果不存在,则使用第一个适用的接口。

示例:

  > arp -s 157.55.85.212   00-aa-00-62-c6-09.... 添加静态项。
  > arp -a                                  .... 显示 ARP 表。

ARP欺骗

欺骗原理

从上文我们已经了解到,主机会保存、更新本机的ARP缓存表的两种情况。从中我们可以看出,ARP协议是没有身份验证机制的,局域网内任何主机都可以随意伪造ARP数据包,ARP协议设计天生就存在严重缺陷。

比如下图PC03为了达到某种目的,于是决定实施一次ARP欺骗攻击。PC03首先向PC02发送了一个ARP数据包,作用相当于告诉PC02:“嘿,我是192.168.0.1,我的MAC地址是03-03-03-03-03-03”,接着他也向GW发送了一个ARP数据包,作用相当于告诉GW:“嘿,我是192.168.0.2,我的MAC地址是03-03-03-03-03-03”。于是,主机PC02与GW之间的数据流向,以及它们各自的ARP缓存表就变成如下图所示:

img

从上图我们可以看出,ARP欺骗之后,主机PC02与GW之间的所有网络数据都将流经PC03,即PC03已经掌控了它们之间的数据通讯。以上就是一次ARP欺骗的实施过程,以及欺骗之后的效果。

ARP欺骗带来的危害可以分为几大类

  1. 网络异常。具体表现为:掉线、IP冲突等。
  2. 数据窃取。具体表现为:个人隐私泄漏(如MSN聊天记录、邮件等)、账号被盗用(如QQ账号、银行账号等)。
  3. 数据篡改。具体表现为:访问的网页被添加了恶意内容,俗称“挂马”。
  4. 非法控制。具体表现为:网络速度、网络访问行为(例如某些网页打不开、某些网络应用程序用不了)受第三者非法控制。

ARP欺骗根据发起个体的不同可以分为两类

  1. 人为攻击。人为攻击的目的主要是:造成网络异常、窃取数据、非法控制。
  2. ARP病毒。ARP病毒不是特指某一种病毒,而是指所有包含有ARP欺骗功能的病毒的总称。ARP病毒的目的主要是:窃取数据(盗号等)、篡改数据(挂马等)。 从目前的情况来看,ARP欺骗(不管是人为的还是ARP病毒)大多数是在网络异常后被发现的。请注意,精心策划的人为ARP欺骗、设计良好的ARP病毒,是可能不会造成网络异常的,所以网络没有出现异常并不代表不存在ARP欺骗问题!

解决方法(针对网关劫持的情况)

arp命令绑定正确MAC地址

方法是在命令提示符下,输入如下命令查看现在的arp缓存表: Arp –a 在用如下命令添加静态项 Arp –c “网关ip地址” “mac地址” 此方法的缺点就是电脑重启后上述arp –a中的内容会被清空,必须重新绑定,很麻烦。

netsh命令绑定正确MAC地址(推荐,笔者就是用的这种方式)

这种方法解决了上一个方法的问题,电脑重启后也不需要重新绑定,一劳永逸。 方法是首先在命令提示符下,运行如下命令: netsh i i show in 在返回结果的第一列中,找到本地连接对应的ldx编号。假设电脑本地连接的ldx编号为16,那么,就接着在CMD命令提示符窗口中键入如下命令绑定IP和MAC地址: netsh -c “i i” add neighbors 16 “网关IP地址” “MAC地址” 之后可以运行此命令查看是否已经绑定: arp –a 若要解除绑定,可运行如下命令: netsh -c “i i” delete neighbors ldx 其中ldx需要改为对应的数字。

ARP防火墙

这个根据亲身经历,不是我推荐的,至少360的arp防火墙不是特别靠谱。就拿上次紫松10栋受到arp攻击的时候,来举例,360arp防火墙的表现是不尽人意的,arp攻击的时候它也只能拦截arp发出来的包,但是仍然无法解决不能上网的问题,就跟没有开时的效果没什么两样。它也有个绑定mac地址的功能,分为手动绑定和自动绑定,但可能是由于欺骗源发包过于频繁其自动绑定每次都会绑定到那个错误的mac地址上;换用手动绑定,绑好后仍然上不了网,在命令提示符中输入arp –a查询,网关地址仍然对应的错误的mac,可见这个手动绑定只是在软件层面上的绑定,可悲的是,当可以正常上网的时在360arp中绑定错误了的话是上不了网的,“对了不一定能上网,错了一定不能上网”,让人很无奈。 当然,360arp防火墙也不是没有一点用的,屏蔽掉的那些数据包可能对计算机有害,所以没事还是把它开着吧,至于那里面的手动绑定,没事还是不要动它为好。

路由器或交换机的高级功能

现在许多交换机或路由器都有一些arp防御的高级功能,原理是自动存储大量的正确的ip地址与mac地址对应的列表并屏蔽非法的数据包,完全阻止arp欺骗或降低其影响范围(比如仅限于某个VLAN中的故障),配合PC上的操作,可实现双向绑定,大大增加局域网的安全性。

总结

在网络中,我们要时刻保持警惕,保护自己的计算机及其中内容的安全。本文所述的arp协议及arp欺骗的内容,仅仅是arp这个领域的一点点皮毛,对于整个网络安全这个话题来说,就更加显得微不足道。在今后的网络生活中,保持安全意识,积极地去学习网络知识,才是我真正想表达的。