Sniffer 初論(1) 來源:pckkc
竟然最近這個Sniffer引起大家討論,我就來簡單談一下它好了。

其實要了解 Sniffer 這個東西,大家可能對於乙太網路的架構要有點基礎才行,
我會花時間寫些基礎網路架構的東西。

目前我們個人電腦使用的網路架構,我想絕大部份都是乙太網路,在我們使
用的乙太網路架構裡,所有電腦送往網路的資料都是在同一條線路上傳輸,
各位應該多少都有架過 LAN 的經驗,如果你用過像 BNC 這類看起來像電視
Cable 線的網路線來連接 LAN 上的各台機器,你可能比較能體會「送往網路
的資料都是在同一條線路上」的觀念。但大部分人都是用 HUB 來串連電腦,
所以你可能無法深刻體會,所以我稍微舉點實例。

大家平常用電腦時,在 LAN 裡面和同事或同學交換資料,以人類的想法是把
資料由 A 送到 B,好了,現在我們來深入一點想,你的電腦是透過網路卡和
HUB 連接,當你用人類想法覺得是由 A 送資料到 B,其實你是將整個資料送
到 HUB 裡面,而 HUB 其實是不知道所謂 B 機器是在那個 HUB 插座內的電
腦(註),所以它就將訊號送給在 HUB 上面的所有機器,讓它們自己去判斷
這資料是不是送給你。

所以所謂「送往網路的資料都是在同一條線路上」的意思,其實是當你在
LAN 裡面一台機器發出訊息,此時其實是所有機器都會收到訊息,但是經由
機器的判斷機制,會決定出這資料是不是送給我還是送給別人。

「如何判斷資料是否送給我?」

最好的方式就是當初 A 送資料出來時,在資料內加入「來源︰A的位址」、
「目的︰B 的位址」這種資訊在裡面,而每台電腦在收到這些資料時,只要直
接判斷 B 的位址是否和我自己機器相同,如是代表是送給我,不是的話我就
不管它,直接把資料丟掉……

而這種除了資料外還加入一些特定格式的資訊在裡面的東西,就是大家常聽
到的封包。封包裡,除了正常的資料之外,會再加上其它的資訊在裡面,
這些資訊可能是位址或是代表其它意義,端看你怎麼去定義它的格式。

好了,講到這裡用人類口語的方式表達完,該談點電腦的東西。

剛剛提過,我們需要每台機器有個機器位址,才行判斷這個封包是不是寄給
我,在乙太網路 IEEE 的定義裡,這個位址有個名詞,就是 MAC Address….
講白一點好了,你可以把 MAC Address 當成是網路卡的實體位址,也就是每
片網路卡都有一個「單獨唯一不重複」的 MAC Address。這樣當 A 送資料到 B,
封包內會有 A 的 MAC Address 代表來源,B 的 MAC Address 代表目的,
所以其它機器比對自己的 MAC Address,發現和 B 的 MAC Address 不同,
它就不管這個封包,直接在網路卡那邊就把封包拋棄。

現在有這個觀念之後,我們可以談談 Sniffer。Sniffer 的目的既然是竊聽
網路上的訊息,所以它的做法很簡單,告訴網路卡不管是什麼香蕉、芭樂或
去它擔擔麵的機車資料,送給我的、送給它的,我全部都要,也就是你網路
卡別管這麼多,把所有你收到訊號都交給我就對了。

這就是 Sniffer 它的基本原理。

OK!回過頭談談剛剛我有一個(註)要補充。其實除了HUB之外,另外有一個
叫 Switch 的網路設備,它的功用跟 HUB 完全一樣,不同點在於 Switch 裡
面會記錄每台機器上網路片的 MAC Address,所以當它收到 A→B 的訊息時,
它會知道送到哪台機器,所以不會發生每台機器都可以收到訊息的情形。

所以 Sniffer 簡單講有兩種做法,一種很簡單,讓網路卡變笨不要判斷封包
的來源位址,通通收起來就是了。另一種比較難,要對付 Switch,需要先幹
掉本尊,然後冒充本尊的 MAC Address 讓 Switch 送資料到你機器上。

好了,簡簡單單幾行話將 Sniffer 大概介紹一下,這下再去看 Bensan 的文
件我想大家會比較容易。其實說實話,很多駭客的東西都是在基礎網路架構
上打轉,有空多摸點 TCP/IP 這類的東西絕對有必要!

小恐龍工作坊 提供