目录

前言
Yersinia
  互动模式 Interactive Mode
  GUI 模式 Graphical Mode
  伺服器模式 Daemon Mode
攻击 1: TCN Attack
攻击 2: BPDU DoS Attack
攻击 3: Root Role Attack
  故意不处理 TCN
  不断转 Role
  中间人攻击 (Man-in-the-middle Attack)
防御对策
  Root Guard
  BPDU Guard
  BPDU Filter

前言

本篇文章将会介绍攻击 Spanning Tree Protocol 的方法,使网络里的 Switch 无法正常运作,或者错误地改变了 Topology。Spanning Tree Protocol Attack 的後果可以相当严重,例如可以令网络瘫痪丶资料被窃取和中间人攻击 (Man-in-the-middle Attack),必需正视。在阅读本文之前,读者必需对 Spanning Tree Protocol 的运作深入了解,若信心不够可先查看以下文章:Spanning Tree Protocol (STP) 生成树协定

⛑️  本文目的只为学术研究,解释网络漏洞及防治方法,并不鼓励任何犯法行为,敬请留意。⛑️

Yersinia

首先介绍一下攻击 Switch 的人间最终兵器 Yersinia。透过这个工具,可以向 Switch 发出一些伪造的 BPDU 来作出攻击。当然,我们可以在骇客的武器库 Kali Linux 中找到这件利器。

先执行 yersinia --help 看看 Menu。

stp attack

Yersinia 一共有 3 个运作模式,分别是:

互动模式 Interactive Mode

输入 yersinia -I 进入互动模式,然後可以按 h 打开选单,这就可以查看不同的指令了。

stp attack

例如:要进行 STP 攻击,先按 g,然後选 STP 按 ENTER 进入 STP 的攻击界面。

stp attack

GUI 模式 Graphical Mode

输入 yersinia -G 进入 GUI 模式,经常当机,不好用。

stp attack

伺服器模式 Daemon Mode

输入 yersinia -D 进入 Daemon 模式,这样会启动一个 Server Process,Telnet 到 localhost 的 12000 Port,便可登入。预设登入 username 和 password 都是 root。界面和 Cisco IOS 很相似,要 enable 才可输入攻击指令,enable password 预设是 tomac。功能是一样的,只是感觉专业一点而已。

stp attack

攻击 1: TCN Attack

现在我们可以尝试第一种攻击。Topology Change Notification (TCN) 是网络里一旦出现 Topology Change 时用来通知 Root Switch 的 BPDU,任何 Switch 收到 TCN 都会帮忙传给 Root Switch,Root Switch 收到 TCN 後会通知网络里所有 Switch 缩短 MAC Address Table 的 Aging Time (由 300 秒缩短至 15 秒) ,让所有 Switch 提早消去旧 MAC Address Table 的纪录。在没有 Toplogy Change 的情况下不断发放虚假的 TCN 会让网络里所有 Switch 不停消去 MAC Address Table 纪录,导致 Switch 在传送 Frame 时无法在 MAC Address Table 找到纪录,唯有使用 Broadcast 传送,造成网络里 Broadcast 大幅增加,影响网络效能,也让传送内容暴露於整个网络。

现在我们尝试用 GNS3 配合 Virtualbox 来执行 Kali Linux (Attacker) 去模拟攻击。

stp attack

网络中 SW1 为 Root Switch。两只 Switch 的 Aging Time 为预设值 300 秒。

SW1#show spanning-tree 

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.0200
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    24577  (priority 24576 sys-id-ext 1)
             Address     aabb.cc00.0200
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 300

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 100       128.1    Shr 
Et0/1               Desg FWD 100       128.2    Shr 
SW2#show spanning-tree 

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.0200
             Cost        100
             Port        2 (Ethernet0/1)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     aabb.cc00.0100
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 300

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/1               Root FWD 100       128.2    Shr 

到 Yersinia 按 e 把 Type 修改成 0x80 (代表 TCN)。

stp attack

x 再选 0 或 1 向 Switch 传送 BPDU。虽然选项中有 sending tcn BPDN,但若没有修改 Type 的话,攻击是不会成功的。(可能是 bug)

stp attack

整个网络所有 Switch 的 MAC Address Table Aging Time 会变成 15 秒,如果不断重覆发送的话会让整个网络所有 Switch 的 MAC Address Table 纪录只能维持 15 秒。

SW1#show spanning-tree 

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.0200
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    24577  (priority 24576 sys-id-ext 1)
             Address     aabb.cc00.0200
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 15

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 100       128.1    Shr 
Et0/1               Desg FWD 100       128.2    Shr 
SW2#show spanning-tree 

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.0200
             Cost        100
             Port        2 (Ethernet0/1)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     aabb.cc00.0100
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 15

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/1               Root FWD 100       128.2    Shr 

攻击 2: BPDU DoS Attack

当 Switch 收到 BPDU 後需要进行运算,如果向 Switch 大量发放 BPDU 可占用 Swtich 所有 CPU 资源,严重影响网络运作。Yersinia 可以每秒发放数以万计的 BPDU。

攻击前先查看 Switch 的 CPU,在过去 60 秒,CPU 是非常空闲的。

SW1#show processes cpu history       
                                                              
                                                              
                                                              
100                                                           
 90                                                           
 80                                                           
 70                                                           
 60                                                           
 50                                                           
 40                                                           
 30                                                           
 20                                                           
 10                                                           
   0....5....1....1....2....2....3....3....4....4....5....5....
             0    5    0    5    0    5    0    5    0    5    
               CPU% per second (last 60 seconds)


在 Yersinia 进行 BPDU DoS 攻击十分简单,只要按 x 然後选 2 或 3 均可。

stp attack

看看 Spanning Tree Detail,很短时间的攻击已送出了几十万个 BPDU。

SW1#show spanning-tree interface ethernet 0/0 detail 
 Port 1 (Ethernet0/0) of VLAN0001 is designated forwarding 
   Port path cost 100, Port priority 128, Port Identifier 128.1.
   Designated root has priority 32769, address aabb.cc00.0100
   Designated bridge has priority 32769, address aabb.cc00.0200
   Designated port id is 128.1, designated path cost 100
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   Link type is shared by default
   BPDU: sent 185, received 695426

再查看 Switch 的 CPU,由於这是 Simulator,只能为它带来一点点工作量。相信我,如果用真实的 Switch,效果会十分显着!

SW1#show processes cpu history 
                                                              
                                                              
    11111222224444444444555555555522222               22222333
100                                                           
 90                                                           
 80                                                           
 70                                                           
 60                                                           
 50                                                           
 40                                                           
 30                                                           
 20                                                           
 10                     **********                            
   0....5....1....1....2....2....3....3....4....4....5....5....
             0    5    0    5    0    5    0    5    0    5    
               CPU% per second (last 60 seconds)


攻击 3: Root Role Attack

意思是 Attacker 发放含有 Root Priority 较现时 Root Switch 低的 BPDU 到网络,成为网络的 Root Switch (俗称「抢 Root」),现在我们用 Yersinia 模拟抢 Root。

先检查现时 SW1 的 Root Priority 是 24577 (0x6001),MAC Address 是 aabb.cc00.0200。

SW1#show spanning-tree 

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.0200
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
  Bridge ID  Priority    24577  (priority 24576 sys-id-ext 1)
             Address     aabb.cc00.0200
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 15 

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 100       128.1    Shr 
Et0/1               Desg FWD 100       128.2    Shr 

到 Yersinia 按 x 然後选 4 抢 Root。Yersinia 会故意发放相同 Priority 而 MAC Address (aabb.cc00.0100) 较小的 BPDU,因而成为 Root Switch。在 SW1 查看 show spanning tree,结果符合预期。

SW1#show spanning-tree 

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.0100
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Cost 100 
             Port 1 (Ethernet0/0)
  Bridge ID  Priority    24577  (priority 24576 sys-id-ext 1)
             Address     aabb.cc00.0200
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 15 

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 100       128.1    Shr 
Et0/1               Desg FWD 100       128.2    Shr 

Root Role 被 Attacker 抢走会造成以下问题:

故意不处理 TCN

正常情况下,Root Switch 在收到 TCN 後,会通知网络里其他 Switch,籍此缩短 MAC Address Table 的 Aging Time (由 300 秒缩短至 15 秒),来让各 Switch 重新 Learn MAC Address。Attacker 故意不处理 TCN,导致网络发生 Toplogy Change 後因为 MAC Address Table 没有更新而造成短暂 Black Hole 问题。与 TCN Attack 不同,TCN Attack 是不用更新的情况下强迫大家更新,而现在的情况是需要更新时却偏偏不叫大家更新。

不断转 Role

Attacker 发放低 Switch Priority 抢 Root,然後又发放高 Priority 放弃 Root,不断重覆,令 Topology 不断改变,造成网络不稳定。

中间人攻击 (Man-in-the-middle Attack)

又称为 Dual-homed (或 Dual-homing),原理为 Attacker 用两个 Interface 接驳网络中不同 Switch,然後抢 Root 让网络 Traffic 错误地流经 Attacker,此时 Attacker 就可以查看或删改这些 Packet。

请看下图,假设 Attacker 接驳网络中不同的 Switch 并抢 Root 成为 Root Switch,於是 SW1 与 SW2 之间自然成为 Blocking。Client 连接 Server 的 Traffic 就会流经 Attacker。现在尝试模拟这种攻击。

stp attack

由於这种攻击需要两个 Interface,先到 Yersinia 按 i 来 enable 两个 interface。然後开始攻击。

stp attack

发动攻击後确认一下,Attacker 成为 Root Switch 了,而 SW2 的 Port E0/1 是 Blocking。

SW1#show spanning-tree 

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.0100
             Cost        100
             Port        1 (Ethernet0/0)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    24577  (priority 24576 sys-id-ext 1)
             Address     aabb.cc00.0200
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 300

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Root FWD 100       128.1    Shr 
Et0/1               Desg FWD 100       128.2    Shr 
SW2#show spanning-tree 

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.0100
             Cost        100
             Port        1 (Ethernet0/0)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     aabb.cc00.0100
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 300

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Root FWD 100       128.1    Shr 
Et0/1               Altn BLK 100       128.2    Shr 

要达成 Man-in-the-middle Attack,还要靠另一个工具,名为 Ettercap。这软件可以扮演 Virtual Switch,并可以分析所有经过的 Data Frame。

stp attack

选 Sniff ➡️  Bridged sniffing。

stp attack

选择接驳 Switch 的两个 Interface。

stp attack

选 View ➡️  Connections,现在 Client 和 Server 之间的沟通都被看光光了......😱

stp attack

你甚至可以打开这些 Connections 去看看 Packet 里面的内容,下图为 Client 向 Web Server 要求网页内容及 Web Server 的回传资料。

stp attack

防御对策

所谓 Spanning Tree Protocol Attack,说穿了其实就是 BPDU 在搞鬼,防御对策主要从 BPDU 着手。

Root Guard

Root Guard 可以防止 Root Switch 在不适当或不受信任的位置出现,有关 Root Guard 的设定方法请看这里

BPDU Guard

BPDU Guard 比 Root Guard 更严紧,不容许 BPDU 出现,简单来说就是不容许 Port 对 STP 进行任何干扰。有关 BPDU Guard 的设定方法请看这里

BPDU Filter

如果想防止 Port 收到 BPDU 的资讯,并且不理会 Port 传来的 BPDU,可直接开启 BPDU Filter,但要留意会有 Switch Loop 的风险。有关 BPDU Filter 的设定方法请看这里