目錄

前言
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 的設定方法請看這裡