今天開始將會有一連串的 L2 攻擊實作
因為時間比較趕(還我休息的假日阿 QQ)
所以我們先來講解 MAC Flooding 這個攻擊
在二層網路中,因為尚未引入 IP 的概念,我們顯然沒辦法利用 IP 位置來轉發封包
但我們有二層的位置,也就是 MAC 位置,而大家手中的設備或二層交換機就是利用這個位置來轉發與識別二層封包的
我們先用一個最簡單的網路拓樸,來解釋此一概念
這是一個基本的內部網路,沒有 Internet,只有單純的三台電腦與一台轉發設備
每台電腦都分別接在交換器的一個孔上面
今天,當 PC 1 想要傳送一份資料給 PC 3 時,他會需要 PC 3 的 MAC Address
也就是 cc:cc:cc:cc:cc:cc,MAC 位置為六組 Octet,也就是大小為 8*6 bit 的一組位置
傳送出去的封包會長的像下面一樣
來源 MAC | -> | 目的 MAC |
---|---|---|
aa:aa:aa:aa:aa:aa | -> | cc:cc:cc:cc:cc:cc |
現在三台電腦彼此都沒有直接互相連結,所以傳輸這樣一份資料勢必須要 L2 Switch 的幫忙
當 Switch 拿到這樣一份封包的時候,他要怎麼知道要把封包往哪個實體接口送呢?
顯然他一開始不會知道,這時候該怎麼辦呢?
沒關係,你家的交換器很聰明的,他總要想辦法知道對吧!
既然 Switch 一開始什麼都不知道,什麼都不會,那就學吧!
首先,一開始我們有一張空白的表,來對應哪個目的地 MAC Address 要往哪個連接孔送
所以我們會有一張像這樣的表
目的地 MAC Address | 連接孔 |
---|---|
當 PC 1 傳送了上面那個封包的時候,Switch 收到了
這時候他就知道 aa:aa:aa:aa:aa:aa 這台電腦在 Port 1 上面
所以這時候 Forwading Table 就會變成這樣
目的地 MAC Address | 連接孔 |
---|---|
aa:aa:aa:aa:aa:aa | Port 1 |
但 Switch 這時候還是不知道 cc:cc:cc:cc:cc:cc 要往那裡送啊
沒關係,不知道不就都送看看就好了
所以 Switch 會把這個封包往所有有上線的 Port,也就是 Port 2 與 Port 3 送
這時候 PC 2 看到這個目的地不是他自己,他就直接丟掉了
PC 3 看到說這是要給我的封包,就收下了,這時候 PC 3 也想回 PC 1 訊息
所以發出了以下的封包
來源 MAC | -> | 目的 MAC |
---|---|---|
cc:cc:cc:cc:cc:cc | -> | aa:aa:aa:aa:aa:aa |
這時候 Switch 看到了 aa:aa:aa:aa:aa:aa
這個在的 Forwarding Table 裡面有,應該要往 Port 1 送
所以這時候就直接往 PC 1 所在的 Port 1 送過去了,而不再是以廣播的形式
同時,因為 Switch 看到 cc:cc:cc:cc:cc:cc 這個來源是從 Port 3 來的,所以也會在 Forwading Table 裡面加一筆
讓 Forwarding Table 變成如下
目的地 MAC Address | 連接孔 |
---|---|
aa:aa:aa:aa:aa:aa | Port 1 |
cc:cc:cc:cc:cc:cc | Port 3 |
以後 PC 1 與 PC 3 要互相傳送訊息就會因為 Switch 知道這兩台電腦確切的接線,所以將封包直接傳送給他,不需要再發給 PC 2
Hub 是與 Switch 類似的設備,但唯一區別在於缺少 MAC Learning 機制,也沒有 Forwarding Table
接收到封包就直接廣播給其他網路孔,
現在新買到的家用設備基本上很少見了,因為會造成實體訊號碰撞,要將速度做快不容易
使用 Hub 也會讓連接在上面的每台設備接收到你所傳送的資料,在資訊安全上也有疑慮存在
上述所說的 MAC Forwarding Table 其實是有大小上限的
且多數為硬體限制,不是像電腦的記憶體說加就加的
大多數為 512、1024、2048、4096 等
基本上因為同一台交換機底下設備不會太多,所以基本上廠商也不會想要擴充這個上限
因為有上限的存在,我們可以利用這個上限來監聽封包
我們剛剛說了,如果 Forwarding Table 裡面沒有目的地位置的時候
Switch 就會廣播封包,讓大家都能收到這個封包
假設我們 Switch 的 Forwarding Table 上限是 4 好了
這時候 PC 2 為攻擊者
這時候 PC 2 傳送了以下四個封包給 Switch
來源 MAC | -> | 目的 MAC |
---|---|---|
bb:bb:bb:bb:bb:bb | -> | aa:aa:aa:aa:aa:aa |
dd:dd:dd:dd:dd:dd | -> | aa:aa:aa:aa:aa:aa |
ee:ee:ee:ee:ee:ee | -> | aa:aa:aa:aa:aa:aa |
ff:ff:ff:ff:ff:ff | -> | aa:aa:aa:aa:aa:aa |
原本的 Forwarding Table 長這樣
目的地 MAC Address | 連接孔 |
---|---|
aa:aa:aa:aa:aa:aa | Port 1 |
cc:cc:cc:cc:cc:cc | Port 3 |
在收到上面四個封包後,因為有四條的上限,所以會把舊的丟掉
目的地 MAC Address | 連接孔 |
---|---|
bb:bb:bb:bb:bb:bb | Port 2 |
dd:dd:dd:dd:dd:dd | Port 2 |
ee:ee:ee:ee:ee:ee | Port 2 |
ff:ff:ff:ff:ff:ff | Port 2 |
那下次 PC 1 要傳送封包給 PC 3 時,就必須要再把封包複製一份,往每台電腦丟
攻擊者就可以藉此收到一份不屬於自己的封包
只要攻擊者持續發送上面四個封包,把 Switch 的 Forwarding Table 蓋掉
爾後 PC 1 與 PC 3 之間的傳輸都會變為廣播的形式,相當於被降級成為了一台 Hub
A 想要寄包裹給 C,所以郵局派郵差到 A 的家收取包裹
這時候郵差就知道 A 家在哪裡了,接下來就是送給 C 了
但因為是新郵差,人生地不熟
所以一戶一戶的問,「請問這裡是 C 的家嗎?」
總算是問到 C 的家了,這時候郵差就記得 C 的家在哪裡了
我們郵差的腦容量很小,只能記得四個人的家位置
但今天來了一位惡意的鄰居,他一人分飾多角,假裝是 B D E F 四個人
這時候同時說要寄包裹給 A,郵差到他家收包裹的時候
就變成只記得 B D E F 四個人的家都在 B 的房子
當然有人想出了防禦方法,也就是限制每個實體連接孔能有的 MAC 位置上限
避免一個孔就把整台 Forwarding Table 的上限吃完的問題
Cisco 的設定方法可以參考如下的資訊
Port Security
這是一套實作了各種區域網路攻擊的軟體,Google 一下應該能找到不少教學
而今天所述的 MAC Flooding 在該軟體中也有實作,有興趣的朋友可以去找來玩玩看喔
礙於篇幅就不再今天做介紹了
今天我們看到了 Switch 的運作原理,也了解到了 MAC Learning 機制
我們也看到了怎麼利用 MAC Forwarding Table 的上限來達成攻擊
也談了防治的方法,希望能讓大家學到一點網路的基本觀念
如果喜歡我的文章的話,歡迎幫我按讚訂閱喔
Mac table learning 實作 也可以 參考:
https://osrg.github.io/ryu-book/zh_tw/html/switching_hub.html