轉自--http://blog.csdn.net/zhangnn5/article/details/6810347
在閱讀這篇文章之前,我假設你已經知道TCP/IP協議,ARP協議,知道什麼是sniffer等基本網路知識。
在一般的區域網路裡面,經常會有兩種接入方式,一種是HUB接入(這裡的HUB是指普通HUB),一種是交換器直接接入(這裡的交換器是比較進階的交換器,老式交換器不在此列)。採用HUB方式接入的網路,資料傳送的時候,是採用廣播的方式發送,這個時候,只要一台主機將自己的網卡設定成混雜模式(promiscuous mode),就可以嗅探到整個網路的資料。 此篇文章不打算討論這種網路環境的嗅探(sniffer)和反嗅探(anti sniffer)方法,主要是想就交換器方式直接接入的網路環境如何sniffer以及如何anti
sniffer做一個比較粗淺的分析。
我們知道,一台電腦想要接入到網路中,必須要有兩個地址。一個是網卡的地址,我們稱之為MAC地址,它是固化在網卡中的。在乙太網路中,我們通過MAC地址來進行資料傳送和資料交換。在乙太網路環境中,資料會分幀傳送,每一個資料幀都會包含自己的MAC和目的MAC地址資訊; 另外一個地址是平時所說的IP地址,定義在網路層,每一台網路電腦都會有一個或者多個IP地址,這是一個虛擬資料,並且可以隨時更改。IP地址和MAC地址是同時使用的,在資料傳送過程中,一個完整的TCP/IP包需要由乙太網路進行資料封裝,資料分幀,最後再通過物理層傳輸到目標電腦。在乙太網路封裝上層的TCP/IP包的時候,它需要知道源MAC地址和目的MAC地址,但是我們只能給出一個對方的IP地址,這個時候就需要一個協議來支援IP到MAC的轉換,這就是ARP,Address Resolution Protocol. 在區域網路中,ARP是通過廣播的方式來發送的,比如,我的機器IP是192.168.7.110(A),需要知道192.168.7.119(B)機器的MAC地址,那從A機器就會廣播一個ARP包,這個包裡帶有B機器的IP,如果B機器收到了此ARP包,那麼他就會同樣返回一個ARP包,裡面帶有響應的MAC地址。A收到這個ARP包後,得到B的MAC地址,這個時候乙太網路就可以開始封裝TCP/IP包了,可以開始正常的資料傳送了。比如:
d:\>arp -a
view plain
- Interface: 192.168.7.110 on Interface 0x1000003
- Internet Address Physical Address Type
- 192.168.7.1 00-90-0b-01-a0-61 dynamic
-
- d:\>ping 192.168.7.119
-
- Pinging 192.168.7.119 with 32 bytes of data:
-
- Reply from 192.168.7.119: bytes=32 time<10ms TTL=128
-
- Ping statistics for 192.168.7.119:
- Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
- Approximate round trip times in milli-seconds:
- Minimum = 0ms, Maximum = 0ms, Average = 0ms
- Control-C
- ^C
- d:\>arp -a
-
- Interface: 192.168.7.110 on Interface 0x1000003
- Internet Address Physical Address Type
- 192.168.7.1 00-90-0b-01-a0-61 dynamic
- 192.168.7.119 00-d0-59-26-df-1a dynamic
可以清楚的看到,在未和192.168.7.119通訊之前,本機是沒有該IP對應MAC地址的,但一旦通訊後,我們就知道了對方的MAC地址,windows會將對方MAC地址存在自己的ARP cache裡面。
為了節省網路資源以及通訊時間,多數作業系統會保留一張ARP緩衝表,裡面記錄曾經訪問的IP和MAC地址影射記錄,一旦區域網路中有一個新的ARP廣播,對應一個IP到MAC的記錄,這個ARP緩衝表就會被重新整理,MAC地址會更換成新的廣播包裡定義的MAC地址,這個時候就存在一個問題,在更新的時候,系統並沒有去檢查是否真的是由該機器廣播出來的,區域網路中的惡意使用者就會利用欺騙的方式來更改網路途徑,將真正的MAC地址替換成自己的MAC地址,這種方法稱之為:ARP spoofing。
交換器在處理資料的時候,它會根據自己機器內部的一個MAC到連接埠的資料表來查詢符合要求的MAC地址資料包該發往哪個連接埠。這張表從交換器開機的時候就存在,在每個連接埠第一次資料傳送的時候就會記錄對應的連接埠的MAC地址. 通過發送我們偽造的MAC地址資料包到交換器,就可以欺騙交換器重新整理自己的MAC地址到連接埠的資料表,假設A主機串連在2口,假設我在4口,要sniffer A主機的資料,那麼我就需要偽造一個ARP資料包,告訴交換器A主機MAC地址是在4口,那麼交換器就會將本來發送到A主機的資料會轉送到4口上,這個時候我就可以監聽到了A主機的資料傳送了,這個就是基於交換網路的arp欺騙sniffer過程。
通過arp 欺騙,一般sniffer有幾個方法:
1. 就是上面介紹的欺騙MAC進行資料竊聽,但由於A收不到資料,這樣它會重新發布ARP包,這樣導致sniffer很容易暴露,而且效果不好,A會丟包,同樣你的sniffer 一樣不會抓到全部的資料。
2. 發起"中間人"竊聽。攻擊者可以在兩台通訊主機之間插入一個中轉迴路,這樣,攻擊者既可以sniffer到兩機的資料,同樣還可以不影響兩機的通訊。我們假設X是攻擊者的機器,A和B是目標機器。
X如果想發起攻擊,首先在向A主機發送一個ARP包,讓A認為B機器IP對應的MAC地址是X主機的,同時再向B機器發送一個ARP包,讓B機器認為A機器IP對應的MAC地址是X主機的,如:
3. MAC flood攻擊
通過快速(比如超過1000線程) 發送大量偽造MAC地址資料包,會造成交換器的MAC-連接埠表塞滿,但為了正常資料不被丟棄,大多數交換器會採取類似HUB一樣方式:廣播的方式發送資料。這個時候,再在網路中任何一台機器設定網卡為混雜模式,就可以sniffer到任何想要監聽的資料了。
*注: 以上方法我並沒有正式測試過,理論上可行,實際上還有待驗證。
上面介紹了幾種常見的基於switch網路的arp spoofing sniffer方法,那麼對於一個管理員來說,如何防範這種方式的資料嗅探呢?
嚴格來說,沒有一種通用的方法來解決arp欺騙造成的問題,最大的可能就是採用靜態ARP緩衝表,由於靜態ARP表不可以重新整理,那麼偽造的ARP包將會被直接丟棄。但這樣造成的問題就是,整個網路中的所有機器,都必須要建立一個靜態MAC表,在大型網路中,會增加交換器的負擔,造成效率下降。如果機器更換,那麼就要手工去更改MAC地址表,很顯然,在大型網路中這種方式是不適用的。
在這裡需要注意的是,windows下即使你建立了靜態MAC到IP的影射表,但是在收到了強制更新的ARP包後,依然會重新整理機器的影射表,一樣會被sniffer到。
進階交換器還提供了MAC綁定功能,指定交換器某個連接埠和某個MAC綁定,這種方法可以很有效防止MAC複製(clone)方式的竊聽,但是對於上述的arp 欺騙攻擊效果不大。
最可靠的方法就是採用第三方軟體來解決,Arpwatch是一個運行在Unix平台下的免費工具,他可以檢測到網路中所有MAC地址的變化,一旦網路中的MAC地址有變化,它就會發送一封email到指定地點。
後記:這篇小文寫的很簡短,其實在交換網路中還有其他幾種攻擊方法,比如MAC clone等,而且交換網路中的sniffer方法還不止這一種,我這裡只是介紹最常見,容易發生和編程實現的sniffer方法,希望對大家有所協助。本人水平有限,如有錯誤,請不吝指責