ARP欺骗 - 印象云

好久不见,终于回归!

ARP欺骗

socket编程工作在网络层和传输层,这里主要说的是ARP欺骗工作,是在数据链路层(网络接口层)。

在TCP/IP协议族中,数据链路层主要有三个目的:

  1. 为IP模块发送和接收数据
  2. 为ARP模块发送ARP请求和接收ARP应答
  3. RARP模块发送RARP请求和接收RARP应答

这里需要强调一点的是,arp和rarp协议划分到数据链路层还是网络层都可以,这里我们将其划分在数据链路层,下面我们先来了解下ARP和RARP协议的基本内容和工作原理。

1、ARP协议

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

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

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

2、数据包结构

地址解析协议的消息格式很简单,仅包含单一的地址解析请求或响应。ARP 消息的长度取决于上下两层地址的大小,上层地址由所使用的网络协议类型(通常是 IPv4)决定,下层地址则由上层协议所使用的硬件或虚拟链路层的类型决定。消息的报头中包含了这些类型以及对应的地址长度信息,此外还包含了表示请求(1)和应答(2)的操作码。数据包的有效负载为收发双方的硬件地址、协议地址,总计四个地址。

为了把IP地址映射到48位以太网mac地址用于传输,需要一个体现地址转换协议的包格式。 完整的Arp协议如下图所示:

各字段解释如下:

  • 目标以太网地址:目标MAC地址。FF:FF:FF:FF:FF:FF (二进制全1)为广播地址。
  • 源以太网地址:发送方MAC地址。
  • 帧类型:以太类型,ARP为0x0806。
    以太网报文数据:
  • 硬件类型:如以太网(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地址。

3、工作原理

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

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

  • 确定网络中是否有其他主机使用了这个IP地址,如果有应答则产生错误消息。 一个主机可以通过它来确定另一个主机是否设置了相同的IP地址。主机本身并不希望对此请求有一个回答。但是,如果收到一个回答,那么就会在终端日志上产生一个错误消息“以太网地址a:b:c:d:e:f发送来重复的IP地址”。这样就可以警告系统管理员,某个系统有不正确的设置。
  • 免费ARP可以做更新ARP缓存用,网络中的其他主机收到该广播则在缓存中更新条目,收到该广播的主机无论是否存在与此IP地址相关的条目都会强制更新,如果存在旧条目则会将MAC更新为广播包中的MAC。

可以使用

arp -a

来查看本地ARP缓存表。

建议使用Wire Shark 抓包(真机或者配合gns3)来学习ARP协议。为了产生ARP报文,需要清空ARP缓存。

4、RAPP协议

逆地址解析协议(Reverse Address Resolution Protocol,RARP),是一种网络协议,RFC903中描述了RARP。RARP使用与ARP相同的报头结构相同,作用与ARP相反。RARP用于将MAC地址转换为IP地址。其因为较限于IP地址的运用以及其他的一些缺点,因此渐为更新的BOOTP或DHCP所取代。

反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用。

4.1、数据包结构

类似于ARP的报文格式主要差别在于帧类型代码为0x8035(ARP为0x0806),操作码为3请求(ARP为1),4应答(ARP为2)。

4.2、工作原理

  1. 发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
  2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
  3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
  4. 如果不存在,RARP服务器对此不做任何的响应;
  5. 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。

RARP在原理上很简单但是实现比较复杂,由于RARP的请求是在硬件层上的广播,因此这不能通过路由转发,因此在每个网络都要实现1个RARP服务器。另外在同一网络中不同主机可能会同时进行RARP请求,增大了冲突的概率。

5、ARP欺骗原理

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

ARP工作时,首先请求主机会发送出一个含有所希望到达的IP地址的以太网广播数据包,然后目标IP的所有者会以一个含有IP和MAC地址对的数据包应答请求主机。这样请求主机就能获得要到达的IP地址对应的MAC地址,同时请求主机会将这个地址对放入自己的ARP表缓存起来,以节约不必要的ARP通信。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除。

局域网上的一台主机,如果接收到一个ARP报文,即使该报文不是该主机所发送的ARP请求的应答报文,该主机也会将ARP报文中的发送者的MAC地址和IP地址更新或加入到ARP表中。 也就是说请求主机的IP地址和mac地址会被存入局域网上的其他主机的arp表中。

ARP欺骗攻击就利用了这点,攻击者主动发送ARP报文,发送者的MAC地址为攻击者本主机的MAC地址,发送者的IP地址为被攻击主机的IP地址。通过不断发送这些伪造的ARP报文,让局域网上所有的主机和网关ARP表,其对应的MAC地址均为攻击者的MAC地址,这样所有的网络流量都会发送给攻击者主机。由于ARP欺骗攻击导致了主机和网关的ARP表的不正确,这种情况我们也称为ARP中毒。

根据ARP欺骗者与被欺骗者之间的角色关系的不同,通常可以把ARP欺骗攻击分为如下两种:

  1. 主机型ARP欺骗:欺骗者主机冒充网关设备对其他主机进行欺骗
  2. 网关型ARP欺骗:欺骗者主机冒充其他主机对网关设备进行欺骗

其实很多时候,我们都是进行双向欺骗,既欺骗主机又欺骗网关。 了解了基本原理之后,下面动手实现ARP欺骗程序。

6、简单案例分析

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

  1. 攻击者聆听局域网上的MAC地址。它只要收到两台主机洪泛的ARP Request,就可以进行欺骗活动。
  2. 主机A、B都洪泛了ARP Request,攻击者现在有了两台主机的IP、MAC地址,开始攻击。
  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,造成伤害。

注: 洪泛算法不要求维护网络的拓扑结构和相关的路由计算,仅要求接收到信息的节点以广播方式转发数据包。例如,源节点希望发送一段数据给目标节点。源节点首先通过网络将数据副本传送给它的每个邻居节点,每个邻居节点再将数据传送给各自的除发送数据来的节点之外的其他。如此继续下去,直到数据传送至目标节点或者数据设定的生存期限(TTL,Time To Live)为0为止。

7、构造ARP欺骗数据包

先完成第一个目标,告诉目标主机192.168.1.18网关的地址为Linux所在主机的地址:192.168.1.102。

ARP欺骗的方式分为定向欺骗广播欺骗两种。

(1)定向欺骗

我们想告诉192.168.1.18这台主机网关地址为192.168.1.102所在的主机,构造的数据包应该是这样的:

pkt = Ether(src=[1.102的MAC], dst=[1.18的Mac]) / ARP(1.102的MAC, 网关IP地址, hwdst=1.18MAC, pdst=1.18IP地址, op=2)

上面的代码我们不论是以太网数据包还是ARP数据包,我们都明确指定了来源和目标,在ARP数据包中,我们将Linux的Mac地址和网关的IP地址进行了绑定,op取值为2,作为一个响应包被 1.18 接到,这样 1.18会更新自己的ARP缓存表,造成中毒,从而 1.18 发往网关的数据包都会被发往 1.102。

那么我们如果要欺骗网关,把网关发往1.18的数据包都发送到Linux(1.102)上,根据上面的代码稍作修改即可:

pkt = Ether(src=[1.102的MAC], dst=[网关的Mac]) / ARP(1.102的MAC, 1. 18IP地址, hwdst=网关MAC, pdst=网关IP地址, op=2)

上面构造的两个数据包都是ARP响应包,其实发送请求包也可以进行毒化,请求包毒化的原理是,我们请求时候使用假的源IP和MAC地址,目标主机同样会更新自己的路由表。

ARP请求的方式欺骗主机,构造的ARP包如下:

pkt = Ether(src=[1.102的MAC], dst=[1. 18的Mac]) / ARP(1.102的MAC, 网关IP地址, hwdst=1. 18MAC, pdst=1. 18IP地址, op=1)

ARP请求的方式欺骗网关,构造的ARP包如下:

pkt = Ether(src=[1.102的MAC], dst=[网关的Mac]) / ARP(1.102的MAC, 1. 18地址, hwdst=网关MAC, pdst=网关IP地址, op=1)

我们看到构造ARP请求和响应的主要区别在op的值。

(2)广播欺骗

目前我们欺骗的方式都是一对一欺骗的,事实上我们可以发送广播包,对所有主机进行欺骗。

广播欺骗,首先以太网数据包直接构造一个广播包,ARP包不用填写目标主机的信息即可。

下面是ARP广播响应包的构造方式:

pkt = Ether(src=mac, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=mac, psrc=args[0], op=2)

最后综合定向欺骗和广播欺骗的方式,我们总结一个公式出来:

pkt = Ether(src=攻击机MAC, dst=被欺骗主机(或网关)MAC) / ARP((hwsrc=毒化记录中的MAC, 毒化记录中的IP, hwdst=被欺骗主机MAC, pdst=被欺骗主机IP地址, op=1(或2))

分享