ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ARP欺骗实验全解析:从断网攻击到Scapy检测与防御

ARP欺骗实验全解析:从断网攻击到Scapy检测与防御 简介ARP欺骗是网络攻击中的经典手法通过伪造网关MAC地址可实现对局域网通信的监听与篡改。西南科技大学网络攻防与对抗课程将此设为验证型实验本资料是围绕该实验三整理的一份完整实验报告面向正在学习网络协议、网络安全或需要完成同类课程设计的高校学生及安全爱好者。报告涵盖实验背景与目的、两台虚拟机攻击者与受害者的环境搭建、Cain和Winpcap工具的使用、ARP欺骗规则配置、telnet和ftp服务开启以及抓包结果与ARP缓存对比分析同时记录了实验者初次操作时遇到的常见问题与排错思路便于读者对照复现。资源共1个文件为doc格式文档整体约1.99MB图文结合、步骤清晰适合直接参考。已有2379人学习下载阅读后可掌握Cain在局域网内的嗅探方法学会识别网关MAC异常替换并深入理解ARP欺骗带来的敏感信息泄露风险为后续网络攻防技术学习打下基础。1. ARP欺骗实验整垮局域网只要一个包网络攻防课做到实验三很多人会第一次在 Wireshark 里眼睁睁看着网关“消失”——前一秒还能 ping 通外网后一秒全部请求超时。这一节课的内容叫 ARP 欺骗实验它不依赖任何高深漏洞靠的是链路层协议设计里一个朴素的信任缺陷。西南科技大学网络攻防与对抗实验三把 ARP 欺骗单拎出来作为独立实验目的不是教人搞破坏而是让实验者亲手制造一起“全网断网”事故再顺着抓包结果把原理、危害和防御一次看透。适合刚学完 TCP/IP 协议栈、准备从理论转向动手的本科生也适合想在企业内网里排查 ARP 攻击的运维人员。接下来从协议本身出发沿着环境搭建、断网攻击、流量劫持、防御与检测这条线把整套实验完整复现一遍。2. ARP协议原理与实验环境为什么局域网这么容易被骗2.1 ARP 的工作模型广播问路与无脑应答ARPAddress Resolution Protocol解决的核心问题是已知目标 IP如何找到对应的 MAC 地址。主机 A 要向主机 B 发包发现本地 ARP 缓存里没有 B 的 MAC 地址就往整个广播域发一条 ARP 请求“谁是 192.168.1.100请把你的 MAC 告诉我。”局域网内所有主机都会收到这条广播但只有 IP 匹配的主机才会回复“我是 192.168.1.100我的 MAC 是 aa:bb:cc:dd:ee:ff”。问题出在回复环节ARP 应答是单播发送但接收方不会去验证这条应答是否真的来自被询问的那台机器。只要主机 A 收到一条声称“192.168.1.100 的 MAC 是 xx:xx:xx”的应答它就会直接更新缓存完全不检查发送者的真实来源。网络攻防里大量链路层攻击根子都在这个“先信任、后校验”的机制上。用 Linux 系统可以快速查看自己的 ARP 缓存养成实验前先观测的习惯ip neigh show arp -nip neigh输出里会看到类似192.168.1.1 dev eth0 lladdr 00:0c:29:1a:2b:3c REACHABLE的记录。lladdr后面就是网关的 MAC 地址REACHABLE表示该条目处于可用状态。实验前记下这个 MAC攻击后再次执行同样的命令对比结果就能直观感受到 MAC 地址被替换的过程。2.2 实验拓扑与选型两台虚拟机就够了ARP 欺骗实验对硬件几乎没有要求最常见的实验环境是一台 Kali Linux 攻击机、一台 Windows 或 Linux 靶机加上一个虚拟化软件自带的 NAT 网卡。以 VMware 为例把攻击机、靶机都挂在VMnet8NAT 模式下它们和物理机处在同一个广播域里攻击机发广播时其他两台都能收到。这种拓扑最接近校园网里一台真实主机与网关的关系实验现象明显排查简单。角色IP 地址作用攻击机Kali192.168.1.10发送伪造 ARP 应答靶机Ubuntu192.168.1.20被欺骗的目标主机网关192.168.1.1被冒用的“合法设备”选型建议如果只是想快速验证断网直接拿物理机当靶机也可以但一定要在隔离的实验网络里操作避免影响宿舍或公司其他设备的正常通信。Kali 自带arpspoofdsniff 套件和 Wireshark省去编译安装的步骤Ubuntu 作为靶机则方便用ip neigh实时查看缓存变化。实验开始前先让靶机主动 ping 一次网关让靶机的 ARP 缓存里正常记录网关地址。这一步非常关键否则靶机一开始就不知道网关是谁后续攻击现象会和预期不一致ping -c 3 192.168.1.1 ip neigh show | grep 192.168.1.1ping -c 3表示只发 3 个 ICMP 请求包够建立缓存即可。执行后观察输出如果能看到一个lladdr不为00:00:00:00:00:00的条目说明靶机已经正确缓存了网关的 MAC 地址。2.3 用 tcpdump 观察正常 ARP 交互在动手攻击之前先在靶机上抓一次正常 ARP 流量建立“正常长什么样”的基线。使用以下命令监听所有 ARP 报文sudo tcpdump -i eth0 arp -nn -e参数拆解-i eth0指定网卡arp表示只抓 ARP 协议-nn不做 IP 和端口反向解析显示速度快且不产生额外流量-e显示链路层 MAC 地址。正常交互会看到这样的报文08:00:27:5a:1b:2c ff:ff:ff:ff:ff:ff, ARP, Request who-has 192.168.1.1 tell 192.168.1.20ff:ff:ff:ff:ff:ff是广播地址说明 ARP 请求是广播发送的。Request who-has后面的 IP 就是要查询的目标。观察几次后按CtrlC停止抓包此时建立的基线数据会在第 4 章和攻击后的抓包形成鲜明对比。3. 用 arpspoof 完成真实 ARP 欺骗从断网到双向劫持3.1 开启 IP 转发让受害者“看不见”自己被劫持直接发送伪造的 ARP 应答可以让靶机把网关的 MAC 地址改成攻击机的 MAC此时靶机发往网关的所有流量都会先到达攻击机。如果攻击机不开启 IP 转发这些数据包会被直接丢掉靶机表现为断网——这是断网攻击如果开启 IP 转发攻击机把收到的数据包再转给真正的网关靶机完全感知不到异常而攻击者已经实现了中间人劫持。这个差异是整个实验的分水岭。在 Kali 攻击机上执行sudo echo 1 /proc/sys/net/ipv4/ip_forwardLinux 下更规范的写法是sudo sysctl -w net.ipv4.ip_forward1sysctl -w是运行时修改内核参数等号后面的1表示开启转发功能。用sysctl -w的好处是它同时会写/proc/sys/net/ipv4/ip_forward且大部分发行版会自动加载配置。验证命令cat /proc/sys/net/ipv4/ip_forward输出1则表示开启成功。本实验里先开启转发再做欺骗可以一次实验同时观察“在线劫持”的完整过程如果故意把该值设为0则会立刻变成断网攻击两种现象的对比对理解转发环节很有帮助。3.2 单边欺骗一句话让靶机“以为”网关变了arpspoof是 dsniff 工具套件里最常用的命令。先查看攻击机自己的网卡信息确认接口名和 IPifconfig假设 Kali 的网卡名是eth0IP 为192.168.1.10靶机 IP 为192.168.1.20网关 IP 为192.168.1.1。要欺骗靶机让它相信网关的 MAC 是攻击机的 MAC执行sudo arpspoof -i eth0 -t 192.168.1.20 192.168.1.1参数含义如下表参数取值说明-ieth0指定攻击机的网卡接口-t192.168.1.20被欺骗的靶机 IP最后一个参数192.168.1.1要冒用的主机 IP本场景即网关命令运行后arpspoof 会持续向靶机发送伪造的 ARP 应答内容是“192.168.1.1 的 MAC 地址是 00:0c:29:xx:xx:xx”即攻击机的 MAC。它默认每隔 2 秒重发一次以保证靶机的 ARP 缓存一直处于被污染状态。此时切换到靶机上查看缓存ip neigh show | grep 192.168.1.1会看到网关对应的lladdr已经变成攻击机的 MAC。目标若再 ping 网关所有 ICMP 包都会先进入攻击机若转发已开启则可继续到达网关若未开启则产生 Destination Host Unreachable。3.3 双向欺骗把网关也骗一遍实现全双工劫持单边欺骗只能接收靶机发往网关的流量但网关返回给靶机的应答会直接发送到靶机攻击者看不到回程流量只能保证“去”的方向经过自己。要实现完整的中间人劫持必须同时对网关进行欺骗让网关也把靶机的 MAC 地址错误解析成攻击机的 MAC。这样做的基本思路是再开一条反向的欺骗命令。新建第二个终端执行sudo arpspoof -i eth0 -t 192.168.1.1 192.168.1.20这条命令的作用与 3.2 恰好相反向网关发 ARP 应答告诉网关“192.168.1.20 的 MAC 是 00:0c:29:xx:xx:xx”也就是攻击机的 MAC。现在网关发往靶机的数据也会先经过攻击机再被转发到真正的靶机。配合上面第一条命令双向的流量都汇聚到攻击机形成标准的 man-in-the-middle 拓扑。运行后的典型状态arpwhois 192.168.1.20 → MAC 为攻击机 MAC arpwhois 192.168.1.1 → MAC 为攻击机 MAC验证双向欺骗是否生效的简单方法在攻击机上执行sudo tcpdump -i eth0 icmp然后让靶机持续 ping 网关ping 192.168.1.1。如果 tcpdump 能抓到大量 ICMP 请求和应答说明流量确实经过了攻击机双向欺骗成功。3.4 三个常见翻车点及排查方法实验最常见的错误有三种。第一种是忘记开启ip_forward导致靶机断网现象特别剧烈新手容易误以为实验没做完排查方法是查/proc/sys/net/ipv4/ip_forward是否为1。第二种是网卡选择错误比如 Kali 机器有多块网卡-i指定成了非活动网卡导致包发不出去对策是以ifconfig中带实际 IP 的接口为准。第三种是防火墙拦截了转发流量某些 Linux 发行版默认启用了ufw或iptables需要临时放行sudo iptables -P FORWARD ACCEPT这条命令把 FORWARD 链默认策略改为 ACCEPT避免防火墙丢包。注意该操作只影响当前会话重启后失效。若实验完成后要追求安全建议还原默认策略。4. 用 Wireshark 验证攻击结果伪造应答与流量重定向的具体特征4.1 抓包准备用过滤条件把干扰降到最低攻击跑通后Wireshark 的验证环节不能省。它既能确认伪造报文的格式也为后续写检测脚本提供特征依据。在攻击机上打开 Wireshark选择eth0网卡开始抓包应用过滤表达式arp只看 ARP 报文避免 TCP/UDP 大量刷屏。为了让攻击现象更明显建议先停止上一章里的 arpspoof 进程让攻击机回到正常状态然后在 Wireshark 里清空当前显示再重新启动 arpspoof 命令这样抓包结果里出现的 ARP 应答就全部来自攻击行为本身。4.2 识别伪造应答的两个硬指标正常 ARP 应答应当满足操作码opcode为2reply且发送方 MAC 与发送方 IP 真实对应。伪造应答最大的破绽是——发送方 IP 与发送方 MAC 的组合不一致。在 Wireshark 里点击任意一条 ARP 应答帧展开 Address Resolution Protocolrequest/reply部分重点看三个字段字段正常值以网关为例伪造值Sender MAC address网关真实 MAC如 00:0c:29:11:22:33攻击机 MAC如 00:0c:29:aa:bb:ccSender IP address192.168.1.1192.168.1.1Target MAC address靶机 MAC靶机 MAC注意看Sender IP 和 Target 部分都能对上唯独 Sender MAC 是错的。这正是 ARP 欺骗的本质IP 地址没变MAC 被偷换了。利用 Wireshark 的显示过滤可以直接锁定所有应答包arp.opcode 2结合上文提到的抓包基线对比正常回复与伪造回复后者会出现高频次、成对的应答刷屏现象。正常情况下同一 IP 的 ARP 应答只在询问时出现一次而 arpspoof 每 2 秒一轮循环发送抓包界面上会看到同一 IP-MAC 组合反复出现间隔均匀这也是自动化检测最容易识别的特征。4.3 验证流量劫持用 ICMP 与 HTTP 双重确认仅仅看到 ARP 应答异常还不够还要证明数据真的经过了攻击机。方法有两层。第一层用 ICMP 验证转发链路。攻击机开 tcpdump 监听icmp靶机ping 192.168.1.1持续发包观察攻击机上能否看到 echo request。能看到就说明“靶机 → 网关”方向的流量已经被劫持。第二层用 HTTP 验证内容可见性。在靶机上用 curl 访问一个 http 站点curl http://example.com攻击机的 Wireshark 里过滤 HTTP 协议http如果能看到完整的 GET 请求说明攻击者已经能完整读取明文流量。这个实验的意义在于提醒读者ARP 欺骗后HTTP 这类明文协议完全没有隐私。HTTPS 场景下虽然看不到明文内容但面对后续章节提到的中间人证书劫持依然有被解密的风险。4.4 基于抓包结果的检测规则这一节的内容直接为第 6 章脚本埋下伏笔。从抓包中可以归纳出三条规则同一 IP 在短时间内出现多个不同的 MAC 地址这是中毒的直接证据某个 MAC 发出的 ARP 应答频率远超正常水平说明发报者在持续广播伪造信息Sender IP、Sender MAC 的组合与交换机/网关上的真实 ARP 表不一致。第 6 章的检测脚本就是围绕规则一设计的。5. 从欺骗到防护交换机端口安全与 Dynamic ARP Inspection5.1 端口安全在交换机上禁止 MAC 地址“漂移”ARP 欺骗的本质是让同一端口出现多个 MAC 地址或者同一 MAC 在不同端口间跳变。交换机上的端口安全Port Security可以从源头上限制一个物理端口允许学习的 MAC 数量。以常见的 Cisco 交换机命令为例interface FastEthernet0/1 switchport mode access switchport port-security switchport port-security maximum 2 switchport port-security violation shutdown逐行说明进入接口配置模式后switchport mode access把端口设为接入模式switchport port-security开启端口安全功能maximum 2表示该端口最多学习 2 个 MAC 地址violation shutdown则表示超过限制时直接将该端口置为 error-disable 状态。此配置适合连接单人主机的接入端口若端口连接的是一台交换机或 AP则需要调大 maximum 值或用 sticky 方式动态学习。端口安全能缓解“MAC 地址漂移”类攻击但对纯软件层面的 ARP 欺骗效果有限——攻击机可以不断伪造不同 MAC。所以它只能作为基础防线不能单独依赖。5.2 DAI让交换机学会“校验”每一份 ARP 应答Dynamic ARP InspectionDAI是目前对抗 ARP 欺骗最有效的手段。它的核心思想是交换机拦截所有 ARP 报文并与 DHCP Snooping 绑定表IP ↔ MAC ↔ 端口 ↔ VLAN 的对应关系进行比对不匹配的报文直接丢弃。启用 DAI 前的必要条件是已配置 DHCP Snooping。ip dhcp snooping ip dhcp snooping vlan 10 interface FastEthernet0/1 ip dhcp snooping trust interface FastEthernet0/2 ip arp inspection trust配置含义前两条开启 DHCP Snooping 并作用于 VLAN 10第三条把连接 DHCP 服务器或上行口的端口设为信任口防止伪造 DHCP 应答第四条把连接攻击者/终端的端口配置为不信任口对其上送的 ARP 报文进行 DAI 校验。不信任口上送的所有 ARP 应答都必须命中 DHCP Snooping 绑定表否则丢弃。DAI 的局限在于如果攻击者可以伪造 DHCP 请求先抢占一个合法 IP 并从 DHCP 服务器获得绑定表条目之后用该 IP 做 ARP 欺骗DAI 依然可能被绕过。所以更严谨的做法是同时开启 IP Source Guard它会让交换机检查每一个数据包的源 IP 是否与绑定表一致从网络层彻底阻断伪造源地址。5.3 主机侧防御静态 ARP 绑定和 ARP 防护工具如果环境里没有可管理的交换机只能在主机上做对抗。Linux 主机可以把网关 MAC 写成静态条目sudo ip neigh replace 192.168.1.1 lladdr 00:0c:29:11:22:33 dev eth0 nud permanentnud permanent表示该条目永远不老化攻击者发来的 ARP 应答无法覆盖它。代价是网关换了网卡硬件地址后必须手动修改。Windows 下对应的命令是arp -s 192.168.1.1 00-0c-29-11-22-33但 Windows 的静态 ARP 在某些版本上也会被部分驱动忽略效果不如 Linux 稳定。对于没有管理权限的办公主机可以部署开源 ARP 防护软件。检测端的思路是监听所有 ARP 报文维护一张 IP → MAC 映射表一旦发现同一 IP 出现两个不同 MAC立即告警。第 6 章会实现一个最小可用的检测器原理和它们完全一致。6. 用 Scapy 写一个 ARP 欺骗检测器把实验结论固化成脚本实验做到最后理论验证已经闭环剩下最值得做的事是把“能发现问题”变成“能自动发现问题”。用 Scapy 监听局域网内的 ARP 报文实时维护 IP 到 MAC 的映射关系一旦发现冲突就告警。这个脚本可以直接在教学实验环境里运行也可以挂到企业内网的服务器上做长期监控。#!/usr/bin/env python3 from scapy.all import sniff, ARP import time # 存储已知的 IP - MAC 映射IP 是唯一键 ip_mac_map {} def detect_arp(packet): # 只处理 ARP 应答报文op2请求报文无欺骗判定价值 if packet[ARP].op ! 2: return src_ip packet[ARP].psrc src_mac packet[ARP].hwsrc if src_ip in ip_mac_map: # 如果同一个 IP 出现了新的 MAC触发告警 if ip_mac_map[src_ip] ! src_mac: print(f[ALERT] IP {src_ip} 发生 MAC 漂移 f{ip_mac_map[src_ip]} - {src_mac}) # 更新映射避免对同一次攻击连续告警 ip_mac_map[src_ip] src_mac else: # 第一次观察到该 IP先加入映射表 ip_mac_map[src_ip] src_mac print(f[LEARN] {src_ip} - {src_mac}) if __name__ __main__: print(开始监听 ARP 应答按 CtrlC 停止) sniff(filterarp, prndetect_arp, storeFalse)代码逻辑Sniff 拦截所有 ARP 包op ! 2跳过请求包对每个应答包提取psrc发送者 IP和hwsrc发送者 MAC若 IP 已存在但 MAC 不一致说明收到伪造应答或发生 MAC 漂移输出告警。这里刻意跳过了请求包因为正常情况下请求包不携带可信的 IP-MAC 对应关系包含它容易产生误报。运行方式sudo python3 arp_detector.py验证脚本是否有效可以开两个终端一个运行检测脚本另一个运行第 3 章的arpspoof命令。几秒内检测端就会打出[ALERT]信息提示某 IP 的 MAC 发生变化。如果想让检测器更贴近实际防御场景可以加一个--daemon参数把输出写入日志文件或者对接企业微信/钉钉的 webhook 实现远程告警。这个脚本只用了约 30 行代码却完整复刻了商业防护软件的核心检测逻辑。输入侧可以继续扩展的点有两个方向一是加入 ARP 报文频率统计把 arpspoof 这类周期性发包工具的特征识别出来二是接入交换机show mac address-table的定期巡检从设备侧交叉验证主机侧的判断结果。做到这一步ARP 欺骗实验就不仅仅是课上的一次断网演练而是真正成了一个可以移植到生产环境里的安全检测能力。本文还有配套的精品资源点击获取
返回列表