从实践中学习ARP原理

其实网上已经有很多ARP欺骗的资料了,写博客是为了加深自己的对计算机网络基础的理解,刚毕业的时候喜欢捧着数据库系统概论,计算机网络,操作系统这些书籍看,能掌握一些基础的东西,但是其实很枯燥,还是从实践中掌握底层的知识比较生动有趣。这次梳理一下从实践中掌握ARP协议。


1. ARP协议介绍

ARP即Address Resolution Protocol,地址解析协议,用来将ip地址解析成MAC地址。在同一个网络中的主机之间的通讯,必须要知道目标主机的MAC地址,那么如何才能知道目标主机的MAC地址呢?所以就有了ARP协议,该协议将目标主机的ip地址解析成MAC地址。那么ARP是如何解析ip地址的呢?

假设A主机要跟B主机通讯。

第一步: A主机会先查看自己的ARP缓存里面是否有B主机Mac地址记录;
第二步:如果A主机ARP缓存表有B主机的MAC记录,则A主机直接拿这个MAC跟B主机通讯;
第三步:如果A主机ARP缓存表没有B主机的MAC记录,则会向该局域网的所有主机广播一个ARP请求,而A主机的ip地址跟MAC地址,目标主机的ip等信息会在这个请求包里面,本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求;
第四步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中;
第五步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A;
第六步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了

用通俗的例子来讲解上面的解析过程就是:

有一个班级(局域网),

班上有56个学生(主机),

李雷(主机A)是班长,

韩梅梅(主机B)是班上新来的同学(所有人都不认识她)。有一天,老师让李雷帮忙叫一下韩梅梅到他的办公室去,因为李雷不认识韩梅梅,所以他到教室门口大声喊“我是班长李雷,请问谁是韩梅梅?”(广播ARP请求,别计较神经病才会把自己的职称跟姓名也喊出来,这里是为了形象说明ARP)

班上所有人都听到了这句话,但是只有韩梅梅回应“我是韩梅梅”,其他人都当没听到这句话(丢弃请求包),并且韩梅梅记住了这个人事班长李雷,班长李雷也记住了这个人是韩梅梅(ARP缓存)。

下一次老师再次让李雷找韩梅梅的时候,李雷就直接能找到韩梅梅,而不用广播了,除了失忆。


2. ARP欺骗原理

上面简单介绍了ARP的原理之后,那么有什么不太对劲的地方呢?那就是A主机收到B主机的响应之后,直接更新ARP缓存表,并不会去验证这个响应到底是不是B主机响应回来的,可能是C主机冒充B主机响应的,所以下次A主机跟B主机通讯时,从ARP缓存表里面获取的记录其实并不是B主机的,而是C主机的,这就是ARP欺骗。

上面那个通俗例子来讲就是:

李雷在门口大声喊“我是班长李雷,请问谁是韩梅梅?”,然后小明不要脸地回应“我是韩梅梅”,李雷不加思索地就认为他小明是韩梅梅,下次通讯直接找了小明。(这种场景这个例子不是很合适,因为李雷认识小明,并不会认为他是韩梅梅,但是ARP缓存里面可以这样,主机B的ip指向一个MAC,主机C的ip也指向同一个MAC)


3. ARP欺骗实现 

知道了ARP欺骗的原理,很容易就能实现ARP欺骗,关键是修改被攻击主机的ARP缓存表。

假设攻击主机A,被攻击主机B,和正常通讯的主机C的信息如下:

主机 ip MAC
主机A A_ip A_MAC
主机B B_ip B_MAC
主机C C_ip C_MAC

被攻击主机B的arp缓存表如下(被攻击之前):

ip MAC
A_ip A_MAC
C_ip C_MAC

现在攻击主机A通过工具给主机B发送arp恶意请求包(伪装成C主机给B主机发ARP请求包),然后致使主机B的ARP缓存表变成以下关系:

ip MAC
A_ip A_MAC
C_ip A_MAC

这个时候,如果B主机跟C主机通讯的话,那么B主机根据C主机的ip通过ARP缓存表,找到的主机其实是A的,那么请求会全部发给攻击主机A,那么A可以分析这些包的信息获取个人隐私,同时把这些包转发给主机C,从而不被轻易发现。

局域网里面用的更多的其实是双向欺骗:

攻击主机A欺骗网关说我(A)就是主机B,然后网关把所有发给B主机的请求都发给了主机A;

攻击主机A欺骗主机B说我(A)就是网关,然后主机B把所有发给网关的请求都发给了主机A;

这样的话主机B的所有请求以及响应都会经过主机B。


4. ARP欺骗防范

使用ARP个人防火墙,公共wifi不要轻易输账号密码之类的敏感信息。