0%

【网络安全】ARP欺骗

0x00 前言

借着移动网络安全这门公选课的契机开始学习网络安全(我一个网络安全专业的学生竟然从公选课才能学习到专业知识QAQ),先从最基本的ARP欺骗学起吧。

0x01 ARP协议是干什么的

Address Resolution Protocol(地址解析协议),用来将IP地址转换为MAC地址,使网络适配器可以根据数据报报头的IP地址填入MAC地址,从而完成帧的封装与发送。

那么ARP是如何得知某个IP地址对应的MAC地址呢?当然是询问了。当一台主机想要与另一台主机通信却发现不知道对方的MAC地址时,就要发送一个ARP REQUEST的广播帧,向整个局域网中的主机询问。

image-20200923003729083

这时,每一台收到这个广播帧的主机都会将它传递至网络层,并检查本机的IP地址是否与ARP报文中询问的IP地址相同。不相同则丢弃该包,相同则向报文中的Sender MAC address发送一个ARP REPLY帧,告知其自己的MAC地址。

image-20200923004612416

收到ARP REPLY的询问者此时知道了该IP地址对应的MAC地址,并将这个IP地址到MAC地址的映射存入自己的ARP表中。这个表记录了所有主机已知的地址映射,每一个表项都有一个TTL值表示其有效期。

当某一表项有效期到期后,主机会自动删除该表项。而在此之前,主机仍会不死心地向要被删除的MAC地址问一句:你的IP地址对应的MAC地址是多少啊?

image-20200923005756759

我们注意这里以太网帧的目的地址并不是ff:ff:ff:ff:ff:ff广播地址,而是被删除项的MAC地址。

若得到回应,则说明该表项依然有效。主机会更新其TTL值,继续放入ARP表中。

除此之外,通过wireshark我们还能观察到ARP的一些其他功能:

image-20200923010427957

对于344与346号包,它们的内容似乎与上述提到的包不大一样。

我们可以看到344号包中有ARP Probe,这是向局域网中其他主机询问:有没有人拥有这个IP地址啊?没有的话我就用了。

在等待一段时间后,它判断该IP地址是可用的,于是发出ARP Announcement表明自己从此使用该IP地址。

0x02 ARP欺骗是什么

ARP欺骗属于中间人攻击的一种,我们首先来看维基百科对于中间人攻击的解释

中间人攻击(英语:Man-in-the-middle attack,缩写:MITM)在密码学和计算机安全领域中是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。在许多情况下这是很简单的(例如,在一个未加密的Wi-Fi无线接入点的接受范围内的中间人攻击者,可以将自己作为一个中间人插入这个网络)。

一个中间人攻击能成功的前提条件是攻击者能将自己伪装成每一个参与会话的终端,并且不被其他终端识破。中间人攻击是一个(缺乏)相互认证的攻击。大多数的加密协议都专门加入了一些特殊的认证方法以阻止中间人攻击。例如,SSL协议可以验证参与通讯的一方或双方使用的证书是否是由权威的受信任的数字证书认证机构颁发,并且能执行双向身份认证。

简单来说,对于相互通信的A与B,中间人M面对A伪装成B,面对B伪装成A,这样就从逻辑上插入到A与B的通信链路中间,可以对其通信进行监听或者篡改。

\(A\Leftrightarrow M \Leftrightarrow B\)

在ARP欺骗(或者称为ARP毒化)中,攻击者通过向A发送ARP包将表项\[(B_{IP},M_{MAC})\]加入到A的ARP表中,通过向B发送ARP包将表项\[(A_{IP},M_{MAC})\]加入到B的ARP表中,从而使得A发送给B的包、B发送给A的包都被发送到攻击者那里,进而攻击者成功地变成了A、B的中间人。这个过程正是利用ARP对A、B进行欺骗,从而达到攻击的目的,因此叫做ARP欺骗。

由于ARP在局域网中运行,因此ARP欺骗的适用范围也仅限局域网。

0x03 如何实现ARP欺骗

根据0x01中介绍的ARP工作原理,我们要想向一台主机中插入恶意表项似乎只能等待该主机主动发问,然后伪装为另一台主机进行ARP响应。但是这个过程只发生在一台主机接入网络后第一次与另一台主机通信时,由此时机进行攻击太过苛刻,我们需要找到另一种ARP表更新的条件。我们直接用现成的工具试一试吧。

这里我们使用了Kali Linux中的ettercap工具实施ARP欺骗,具体的流程网上有很多教程了,这里不再赘述。我们感兴趣的是如何主动地实施ARP欺骗。

img

上述截图是攻击成功后的抓包截图,我们看到攻击者为了维持恶意ARP表项存在于A与B的ARP表中,每隔10s主动向A与B分别发送含有恶意表项的ARP REPLY。这表明即使是没有经过ARP REQUEST而得到的ARP REPLY也会被主机接受,进而更新ARP表项。因此,如何实现主动ARP攻击呢?只需“无厘头地”向目标主机发送一个恶意的ARP REPLY即可。

0x04 关于ARP欺骗的一些思考

为什么局域网内的主机会接受一个未经请求的ARP应答呢?这并非设计协议的漏洞,而是现实需要。有一种Gratuitous ARP,其行为与上述ARP欺骗相似。详见链接。

为了防范ARP欺骗,一种有效的方式是采用send-ack方式。即当收到一个修改mac地址表的ARP响应报文时,先向被修改项发送一个指向应查询数据包,如果得到可以修改的请求,则进行修改。

写得很好的相关资料:

ARP防御篇-如何揪出“内鬼”并“优雅的还手”

企业ARP欺骗分析及防御:不同网段欺骗分析及对策