目录


传统 L2 攻击的本质就一句话:以太网设计之初假设"能插上网线的都是自己人",所以同广播域内的协议全无认证—ARP欺骗,MAC洪泛,DHCP攻击,VLAN跳跃,STP操纵,LLMNR/NBT-NS投毒

⚠️ 免责声明
本文仅用于网络安全教学、技术研究和防御知识普及目的。文中描述的ARP欺骗技术及相关攻击手法仅供学习理解网络协议原理和安全防护机制使用。严禁将本文内容用于任何非法攻击、入侵或破坏他人网络的行为。任何未经授权的网络攻击行为均属违法,后果自负。请遵守法律法规,做负责任的网络安全从业者。

ARP欺骗原理

具体到 ARP,这个"无认证"体现在三个层面:

  1. 不问也信:ARP 协议允许"未请求的 ARP 应答"(Gratuitous ARP)。哪怕主机 A 从来没问过"谁是 192.168.1.1?“,只要攻击者发一个 ARP Reply 说"我是 192.168.1.1,MAC 是 AA:BB:CC”,A 就会照单全收并更新缓存。

  2. 无状态验证:ARP 是一个无状态协议。主机不会记录"我刚才发了什么请求",也不会校验"这个应答是不是对我之前请求的回应"。

  3. 先到先得 / 后到覆盖:ARP 缓存的更新策略是"收到就更新",没有合法性校验机制。攻击者只要发包频率够高,就能盖掉合法的 ARP 条目。

ARP发包逻辑

不免费ARP(标准ARP请求/应答)
  • 逻辑Who has 192.168.1.100? Tell 192.168.1.1.

  • 场景:A要给B发数据,但A不知道B的MAC地址。

  • 行为:A广播询问,B单播回复。

  • 本质查询

2. 免费ARP(Gratuitous ARP)
  • 逻辑192.168.1.1 is at MAC-A.(我问的是我自己)

  • 场景:网卡刚启动、IP变更、HA切换(比如VRRP主备切换)。

  • 行为:主机主动广播,不期待回复,强制全网更新缓存。

  • 本质宣告

三种基础攻击模式

根据欺骗方向的不同,ARP 欺骗分为三种典型形态 :

1. 单向欺骗(Host → Gateway)

攻击者只向受害主机发伪造 ARP 应答:“网关 192.168.1.1 的 MAC 是我”。受害者所有出网流量都被导到攻击者。

  • 如果攻击者不开 IP 转发​ → 受害者直接断网(这就是局域网"断网攻击"的原理)

  • 如果攻击者开启 IP 转发​ → 受害者毫无感知,流量被静默截获

2. 单向欺骗(Gateway → Host)

攻击者只向网关发伪造 ARP 应答:“192.168.1.100 的 MAC 是我”。网关回给受害者的流量被导到攻击者。单独用这种模式只能拿回程流量,意义不大。

3. 双向欺骗(完整 MITM)

攻击者同时向受害主机和网关两边投毒:

  • 告诉受害者"网关 MAC = 攻击者 MAC"

  • 告诉网关"受害者 MAC = 攻击者 MAC"

于是受害者 ↔ 网关之间的所有双向流量都过攻击者机器,这才是 ARP 欺骗最危险的形态——中间人 。攻击者通常开启 net.ipv4.ip_forward=1 做透明转发,让通信看起来完全正常 。

补充流程示例

先固定所有场景的角色(绝不换):

  • 受害者V:192.168.1.100,真实MAC是MAC_V

  • 网关G(内网出口):192.168.1.1,真实MAC是MAC_G

  • 攻击者A:192.168.1.200,真实MAC是MAC_A

  • 同网段服务器S(比如内网文件服务器):192.168.1.50,真实MAC是MAC_S

  • 外网目标(比如百度):不在同广播域,记为S_out


单向ARP欺骗(只毒化受害者V)的完整流程

我们只做一件事:发伪造ARP包告诉V——「网关G的IP=192.168.1.1,对应的MAC是MAC_A」,不碰G、也不碰其他任何主机的ARP缓存。

场景1:V访问同网段服务器S(比如打开\\192.168.1.50\share
  1. V要发数据给S,查本地ARP缓存,已经被毒化:192.168.1.50 → MAC_A

  2. V发出的以太网帧:✅ 目的MAC=MAC_A(攻击者),源MAC=MAC_V,里面包裹着发给S的IP包

  3. 交换机查CAM表,把帧转发给A(攻击者)

  4. 【关键分支】

    • 如果A开了IP转发:A把帧的二层目的MAC改成真实的MAC_S,重新封装后发给S

    • 如果A没开IP转发:帧被A丢弃,V直接断网(因为上行流量没到S)

  5. S收到来自V的IP包,处理完要回包给V:S查自己的ARP缓存(没被毒化,是真实的):192.168.1.100 → MAC_V

  6. S发出的回程帧:❌ 目的MAC=MAC_V(受害者),源MAC=MAC_S,直接发给交换机,交换机转给V

  7. 整个过程中,回程流量完全不经过A,A只能拿到V→S的上行流量,看不到S→V的下行流量(比如S返回的文件内容、错误提示等)。


场景2:V访问外网S_out(比如打开百度)

流程和上面几乎一致,只是多了网关G的转发环节:

  1. V要发数据给外网,先把包发给网关G:查ARP缓存(被毒化):192.168.1.1 → MAC_A

  2. V发出的帧:✅ 目的MAC=MAC_A,源MAC=MAC_V,包裹着发给外网的IP包

  3. 交换机转帧给A,A开IP转发后,把帧的二层目的MAC改成真实的MAC_G,发给G

  4. G做NAT转换,把包转发到外网的S_out

  5. S_out回包给G,G做完NAT后,要回包给V:查自己的ARP缓存(没被毒化):192.168.1.100 → MAC_V

  6. G发出的回程帧:❌ 目的MAC=MAC_V,源MAC=MAC_G,直接发给交换机,转给V

  7. 同样,回程流量(G→V)完全不经过A,A只能拿到V→外网的上行流量(比如V发的HTTP POST请求里的账号密码)。


⚠️ 免责声明
本文内容仅供网络安全教学和技术研究使用,旨在帮助读者理解网络协议漏洞及防御方法。严禁将所学技术用于任何非法目的,包括但不限于未经授权的网络监听、数据窃取、系统破坏等行为。实施网络攻击将面临法律制裁,请务必遵守法律法规,维护网络安全环境。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐