前面我们学习了 ARP 协议,对它的工作原理和报文格式有了深入的了解。现在正是讨论 ARP攻击 的好时候,大家对 网络安全 这种高级话题应该更有兴趣吧!
废话不多说,马上进入安全模式,带大家捋捋 ARP 攻击的来龙去脉:
- ARP 攻击的原理是什么?
- 如何发起 ARP 攻击?
- 通过 ARP 攻击可以做什么?可以窃取信息吗?
- 如何应对 ARP 攻击?
ARP攻击原理
由于 ARP 协议没有真伪校验机制,因此网络中的坏蛋可以发出一些假报文,来欺骗其他主机,以达到不可告人的目的。以下面这个网络为例:
这是一个局域网,包括 PC 、笔记本、手机等多台客户机接入其中;网络中还有一台路由器,连接着外部网络。每台客户机应该都有一条默认路由策略,以路由器 192.168.50.1 为下一跳。
当客户机向外部网络发包时,先通过 ARP 协议获得网关 192.168.50.1 的 MAC 地址,再将 IP 包封装在以太网帧中发给网关,由它负责转发。
有一个坏蛋连到网络中来,他可能是一个外部来的黑客,也可能是一个内鬼。他进来后开始监听网络中的 ARP 流量。由于 ARP 地址解析请求是通过广播发送的,所有参与者都可以收到,黑客也不例外。以 PC 解析网关 192.168.50.1 的 MAC 地址为例:
黑客嗅探到 ARP 请求之后,可以做些什么事情呢?——他可以假扮成网关,伪造 ARP 应答来欺骗 PC 。PC 收到 ARP 应答后,将结果保存在 ARP 缓存中。由于缺乏校验机制,很容易上黑客的当。
值得一提的是:网关也会向 PC 发送应答。那么,PC 到底采信哪一方呢?实际上,系统协议栈一般以最新的应答为准。
这样一来,问题就变得微妙,PC 是否中招取决于真假应答到达的次序。你可能还在考虑,如果黑客等网关应答后,再发出假应答,就能骗过受害者。但 ARP 应答不是广播,黑客一般嗅探不到……
如果你有这种想法,就太单纯了。世界上有这么温柔的黑客吗?实际上,黑客嗅探到 ARP 请求后,会不断发出假应答;总有一个应答可以覆盖网关发出的真应答,进入 PC 的 ARP 缓存表。这就是所谓的 ARP泛洪( arp flooding )。
一旦受害者的 ARP 缓存表被黑客做了手脚,便只能任人宰割了。以 PC 为例,去往外部网络的 IP 包,原本是通过网关来转发的,现在被劫持到黑客那去。
恶作剧的黑客可以将这些包通通丢掉,这样 PC 就无法访问外部网络,莫名其妙地断网了。但这样做并捞不到什么好处,而且很容易被人发现。
因此,为了保持隐蔽,黑客一般会充当中间人,将包再转发到真正的网关。想要做到这一点,黑客必须同时欺骗网关:
由于 PC 被黑客欺骗,它误认为黑客就是网关,因此将外出数据包发给黑客;黑客则将数据包转发给网关,随后进入互联网;如上图绿色路径。
由于网关也被黑客欺骗,它误认为黑客就是 PC ,因此将发给 PC 的数据包都交给黑客;黑客则将数据包发还给 PC;如上图红色路径。
一旦 PC 外出的流量经过黑客的地盘,他便可以悄悄干一些坏事了。他可以对 PC 网络速率进行限制,让它慢到怀疑人生。但限制网速都算轻的,更可怕的事还在后面。
黑客可以分析 PC 的数据包,从中窃取一些敏感信息,包括账号密码。如果 PC 使用非加密的 HTTP 协议与外部通信,它的数据将被黑客一眼看穿。因此,在不安全的网络环境中,必须使用 HTTPS 来保护数据的安全。
除了 HTTP 协议,常见的 telnet 、FTP 、POP3 、SMTP 和 IMAP 等应用协议,都是很容易泄露密码的,必须小心防范。
HTTP 和 HTTPS 协议在应用层中介绍,到时我们会详细讲解为什么 HTTPS 可以保护数据的安全。
防御对策
那怎么防止 ARP 攻击呢?防御对策倒是有不少,但不是很实用。
-
双绑措施
在路由和终端上同时进行 IP 地址和 MAC 地址的绑定,相当于人工管理 ARP 缓存,自行维护 IP 地址和 MAC 地址的对应关系。既然将 ARP 协议弃之不用,黑客就无法发起攻击了。
这个方案虽然可以奏效,但维护非常繁琐。换个网卡或 IP 地址,都需要重新修改配置。当流动电脑临时接入时,也要即时进行绑定,费时费力。
-
交换机端口绑定
跟双绑措施类似,只不过将 IP 和交换机端口进行绑定,缺点也是类似的。
-
PPPoE
使用 PPPoE 协议对网络流量进行二次封装,为每个用户都分配账号密码,上网时必须通过认证。这样 ARP 报文在一个认证的通道中传输,也就不会遭受攻击了。
但 PPPoE 也不是完美的,由于二次封装的存在,传输效率会打些折扣。更严重的是,PPPoE 方式下局域网内无法互访。如果局域网内需要部署文件服务器、打印机,就有麻烦了。
其实最关键的一点在于,坚持使用 HTTPS 这样的加密协议。这样就算遭遇 ARP 劫持,信息也不会被窃取。在陌生的网络环境中,应该尽量不用 HTTP 这样的明文协议。
【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: