Arp协议分析与攻击

Posted by wsxq2 on 2019-01-26
TAGS:  ARP协议安全

1 ARP协议

1.1 简介

地址解析协议(英语:Address Resolution Protocol,ARP)是通过解析网路层地址(IP地址)来找寻数据链路层地址(MAC地址)的一个在网络协议包中极其重要的网络传输协议。

1.2 基本功能

在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。所谓地址解析(address resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。

另外,当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为委托ARPARP代理(ARP Proxy)。

在点对点链路(英语:Point-to-Point Protocol,PPP)(如PPPoE宽带接入,亦叫拨号)中不使用ARP,实际上在点对点网络中也不使用MAC地址,因为在此类网络中分别已经获取了对端的IP地址。

1.3 数据包结构

地址解析协议的消息格式很简单,仅包含单一的地址解析请求或响应。

ARP 消息的长度取决于上下两层地址的大小,上层地址由所使用的网络协议类型(通常是IPv4)决定,下层地址则由上层协议所使用的硬件或虚拟链路层的类型决定。

消息的报头中包含了这些类型以及对应的地址长度信息,此外还包含了表示请求(1)和应答(2)的操作码。

数据包的有效负载为收发双方的硬件地址、协议地址,总计四个地址。

为了把IP地址映射到48位以太网地址用于传输,需要一个体现地址转换协议的包格式。

1.3.1 以太网链路层

  • 目标以太网地址:目标MAC地址。FF:FF:FF:FF:FF:FF (二进制全1)为广播地址。
  • 源以太网地址:发送方MAC地址。
  • 帧类型:以太类型,ARP为0x0806。

1.3.2 ARP报文数据

  • 硬件类型:如以太网(0x0001)、分组无线网。
  • 协议类型:如网际协议(IP)(0x0800)、IPv6(0x86DD)。
  • 硬件地址长度:每种硬件地址的字节长度,一般为6(以太网)。
  • 协议地址长度:每种协议地址的字节长度,一般为4(IPv4)。
  • 操作码:1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答。
  • 源硬件地址:n个字节,n由硬件地址长度得到,一般为发送方MAC地址。
  • 源协议地址:m个字节,m由协议地址长度得到,一般为发送方IP地址。
  • 目标硬件地址:n个字节,n由硬件地址长度得到,一般为目标MAC地址。
  • 目标协议地址:m个字节,m由协议地址长度得到,一般为目标IP地址。

1.3.3 报文格式

长度(位) 48 48 16 16 16 8 8 16 48 32 48 32
数据类型 目标以太网地址 源以太网地址 帧类型 硬件类型 协议类型 硬件地址长度 协议地址长度 操作码 源硬件地址 源协议地址 目标硬件地址 目标协议地址
组成 14字节 以太网首部 28字节 ARP请求/应答

1.3.4 Wireshark抓包

一个查询如下:

wireshark抓ARP查询报文.png

相应的应答如下:

wireshark抓ARP应答报文.png

从中获得的信息:

  • 平时arp查询/应答只会在网关(路由器)和局域网内的主机之间进行,当需要在局域网内的两个主机之间进行通信(如使用ping命令)才会在这两个主机之间进行arp查询/应答
  • 间隔时间不定(5,164,310,1335,……)

可以使用如下过滤表达式找出本机(kali,192.168.2.20)和网关(NAT网络NatNetwork,192.168.2.1)之间的arp包:

1
arp  && ((eth.src == 52:54:00:12:35:00 || eth.src==08:00:27:5e:ae:70)  && (eth.dst == 08:00:27:5e:ae:70 || eth.dst==52:54:00:12:35:00))

1.4 工作原理

在每台安装有TCP/IP协议的计算机或路由器里都有一个ARP缓存表,表里的IP地址与MAC地址是一对应的,如下表所示。  

主机名称 IP地址 MAC地址
A 192.168.38.10 00-AA-00-62-D2-02
B 192.168.38.11 00-BB-00-62-C2-02
C 192.168.38.12 00-CC-00-62-C2-02
D 192.168.38.13 00-DD-00-62-C2-02
E 192.168.38.14 00-EE-00-62-C2-02
... ... ...

以主机A(192.168.38.10)向主机B(192.168.38.11)发送数据为例。

  1. 当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到就知道目标MAC地址为(00-BB-00-62-C2-02),直接把目标MAC地址写入帧里面发送就可。
  2. 如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播(ARP request),目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11的MAC地址是什么?”
  3. 网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应(ARP response):“192.168.38.11的MAC地址是00-BB-00-62-C2-02”,此回应以单播方式。这样,主机A就知道主机B的MAC地址,它就可以向主机B发送信息。同时它还更新自己的ARP高速缓存(ARP cache),下次再向主机B发送信息时,直接从ARP缓存表里查找就可。

ARP缓存表采用老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

1.5 免费ARP

免费ARP(gratuitous ARP),他是指主机发送ARP查询(广播)自己的IP地址,当ARP功能被开启或者是端口初始配置完成,主机向网络发送免费ARP来查询自己的IP地址确认地址唯一可用。

作用:

  1. 确定网络中是否有其他主机使用了IP地址,如果有应答则产生错误消息。
  2. 免费ARP可以做更新ARP缓存用,网络中的其他主机收到该广播则在缓存中更新条目,收到该广播的主机无论是否存在与IP地址相关的条目都会强制更新,如果存在旧条目则会将MAC更新为广播包中的MAC

1.6 查看ARP缓存表

  • Windows:开始 → 运行 →cmd→arp -a(参数-a表示显示所用内容)

    如我的电脑中使用该命令的结果如下:

    Windows查看ARP缓存表.png

    其中:

    • 10.177.112.110是WIFI连接校园网的后获得的IP地址
    • 192.168.56.100是VirtualBox仅主机网络的网卡的IP地址
    • 224.0.0.22,224.0.0.251,224.0.0.252,239.255.255.250是多播地址

    多播地址是计算机网络中的一组主机的逻辑标识符,其可用于处理旨在针对指定网络服务进行多播的数据报或帧。多播寻址可以用于链路层(OSI模型中的第2层),例如以太网多播,以及用于因特网协议第4版(IPv4)或第6版(IPv6)多播的因特网层(OSI的第3层)。

    • 255.255.255.255是广播地址
  • Linux:终端→arp -nv

    Linux查看ARP缓存表.png

  • MacOS:终端→arp -nla

2 ARP欺骗

ARP欺骗(英语:ARP spoofing),又称ARP毒化(ARP poisoning,网络上多译为ARP病毒)或ARP攻击,是针对以太网地址解析协议(ARP)的一种攻击技术。此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网络上特定计算机或所有计算机无法正常连线。

2.1 运作机制

ARP欺骗的运作原理是由攻击者发送假的ARP数据包到网络上,尤其是送到网关和受害者上。其目的是要让送至特定的IP地址的流量被错误送到攻击者所取代的地方。主要有如下三种攻击方式:

  • 被动式数据包嗅探(passive sniffing)攻击:攻击者将这些流量另行转送到真正的网关
  • 中间人攻击(man-in-the-middle attack):篡改后再转送
  • 阻断服务攻击:攻击者将ARP数据包导到不存在的MAC地址,例如netcut软件。

简单案例分析:这里用一个最简单的案例来说明ARP欺骗的核心步骤。假设在一个LAN里,只有三台主机A、B、C,且C是攻击者。

  1. 攻击者聆听局域网上的MAC地址。它只要收到两台主机洪泛的ARP Request,就可以进行欺骗活动。
  2. 主机A、B都洪泛了ARP Request.攻击者现在有了两台主机的IPMAC地址,开始攻击。
  3. 攻击者发送一个ARP Reply给主机B,把此包protocol header里的sender IP设为A的IP地址,sender mac设为攻击者自己的MAC地址。
  4. 主机B收到ARP Reply后,更新它的ARP表,把主机A的MAC地址(IP_A, MAC_A)改为(IP_A, MAC_C)。
  5. 当主机B要发送数据包给主机A时,它根据ARP表来封装数据包的Link报头,把目的MAC地址设为MAC_C,而非MAC_A。
  6. 当交换机收到B发送给A的数据包时,根据此包的目的MAC地址(MAC_C)而把数据包转发给攻击者C。
  7. 攻击者收到数据包后,可以把它存起来后再发送给A,达到偷听效果。攻击者也可以篡改数据后才发送数据包给A,造成伤害。

2.2 Kali实战

2.2.1 实验环境

设备:

  • 实体机 Windows 10 家庭版
  • 实体机上安装的 VirtualBox 虚拟机软件
  • VirtualBox 中安装的虚拟机 Ubuntu-Server-16.04-LTS:受害者。网络配置为使用 VirtualBox 中 NAT 网络的NatNetwork(自建的)
  • VirtualBox 中安装的虚拟机 Kali Linux 2.0 (更新至2018-11-07):攻击者。网络配置为使用 VirtualBox 中 NAT 网络的NatNetwork(自建的)

受害者本地ARP缓存表:

受害者的本地缓存表(攻击之前).png

网络拓扑图(攻击前):

网络拓扑图(攻击前).png

网络拓扑图(攻击后):

网络拓扑图(攻击后).png

2.2.2 准备工作

  • 获取受害者IPMAC地址
  • 获取网关IP地址和MAC地址
  • 工具:arpspoof

但是由于使用了工具arpspoof,该工具只需要两个关键参数,受害者的IP地址和网关的IP地址,因为它会自动通过本地的ARP缓存表来获取相应的MAC地址(我的推测)

关于arpspoof的使用可参考man arpspoof,以及结合抓包学习

2.2.3 操作过程

在Kali Linux上:

  1. 开启内核转发功能以防止被发现:echo 1 >/proc/sys/net/ipv4/ip_forward

    kali开启内核转发功能.png

  2. 开始APR欺骗攻击:arpspoof -i eth2 -c host -t 192.168.2.16 -r 192.168.2.1。如下所示:

    kali使用arpspoof工具发起ARP欺骗攻击.png

2.2.4 攻击结果

  1. 受害者ARP本地缓存表:

    受害者本地ARP缓存表(攻击后).png

  2. wireshark抓包:

    wireshark抓ARP包(攻击后).png

  3. 受害者访问外网

    受害者使用ping访问外网.png

2.2.5 arpspoof 的 Python 实现

使用scapy可以轻易实现arpspoof工具的功能,当然,我只写了个arpspoof的简化版(只能攻击一个主机)。源代码如下:

arpspoof的Python实现(源码部分).png

详情参见:https://github.com/wsxq2/hack/blob/master/net/arpspoof.py

命令帮助:

arpspoof的Python实现(命令帮助).png

执行效果:

arpspoof的Python实现(执行效果).png

2.3 防制方法

  1. 最理想的防制方法是网络内的每台计算机的ARP一律改用静态的方式,不过这在大型的网络是不可行的,因为需要经常更新每台计算机的ARP表。命令: arp -s 网关IP 网关MAC
  2. 另外一种方法,例如DHCP snooping,网络设备可借由DHCP保留网络上各计算机的MAC地址,在伪造的ARP数据包发出时即可侦测到。此方式已在一些厂牌的网络设备产品所支持。 DHCP Snooping是 DHCP 的一种安全特性,主要应用在 交换机 上,作用是屏蔽接入网络中的非法的 DHCP 服务器。即开启 DHCP Snooping 功能后,网络中的客户端只有从管理员指定的 DHCP 服务器获取 IP 地址。 由于 DHCP 报文缺少认证机制,如果网络中存在非法 DHCP 服务器,管理员将无法保证客户端从管理员指定的 DHCP 服务器获取合法地址,客户机有可能从非法 DHCP 服务器获得错误的 IP 地址等配置信息,导致客户端无法正常使用网络。启用 DHCP Snooping 功能后,心须将 交换机 上的端口设置为信任(Trust)和非信任(Untrust)状态,交换机 只转发信任端口的 DHCP OFFER/ACK/NAK报文,丢弃非信任端口的 DHCP OFFER/ACK/NAK 报文,从而达到阻断非法 DHCP 服务器的目的。建议将连接 DHCP 服务器的端口设置为信任端口,其他端口设置为非信任端口。 此外 DHCP Snooping 还会监听经过本机的 DHCP 数据包,提取其中的关键信息并生成 DHCP Binding Table 记录表,一条记录包括 IPMAC、租约时间、端口、VLAN、类型等信息,结合 DAI(Dynamic ARP Inspection)和 IPSG(IP Source Guard)可实现ARP防欺骗和IP流量控制功能。
  3. 有一些软件可监听网络上的ARP回应,若侦测出有不正常变动时可发送邮箱通知管理者。例如UNIX平台的Arpwatch以及Windows上的XArp v2[2]或一些网络设备的Dynamic ARP inspection功能。
  4. 在网关绑定主机MACIP地址
  5. 使用ARP防火墙

2.4 正当用途

ARP欺骗亦有正当用途。其一是在一个需要登录的网络中,让未登录的计算机将其浏览网页强制转向到登录页面,以便登录后才可使用网络。另外有些设有备援机制的网络设备或服务器,亦需要利用ARP欺骗以在设备出现故障时将讯务导到备用的设备上。

3 参考链接