1. 程式人生 > >ARP包詳解

ARP包詳解

一.             關於ARP協議的基礎知識

1.ARP的工作原理
            我們都知道乙太網裝置比如網絡卡都有自己全球唯一的MAC地址,它們是以MAC地址來傳輸乙太網資料包的,但是它們卻識別不了我們IP包中的IP地址,所以我們在乙太網中進行IP通訊的時候就需要一個協議來建立IP地址與MAC地址的對應關係,以使IP資料包能發到一個確定的地方去。這就是ARP(Address Resolution Protocol,地址解析協議)。
       講到此處,我們可以在命令列視窗中,輸入
       arp –a
來看一下效果,類似於這樣的條目
210.118.45.100     00-0b-5f-e6-c5-d7     dynamic
就是我們電腦裡儲存的關於IP地址與MAC地址的對應關係,dynamic表示是臨時儲存在ARP快取中的條目,過一段時間就會超時被刪除(xp/2003系統是2分鐘)。
       這樣一來,比如我們的電腦要和一臺機器比如210.118.45.1通訊的時候,它會首先去檢查arp快取,查詢是否有對應的arp條目,如果沒有,就會給這個乙太網絡發ARP請求包廣播詢問210.118.45.1的對應MAC地址,當然,網路中每臺電腦都會收到這個請求包,但是它們發現210.118.45.1並非自己,就不會做出相應,而210.118.45.1就會給我們的電腦回復一個ARP應答包,告訴我們它的MAC地址是xx-xx-xx-xx-xx-xx,於是我們電腦的ARP快取就會相應重新整理,多了這麼一條:
210.118.45.1    xx-xx-xx-xx-xx-xx    dynamic
       為什麼要有這麼一個ARP快取呢,試想一下如果沒有快取,我們每發一個IP包都要發個廣播查詢地址,豈不是又浪費頻寬又浪費資源?而且我們的網路裝置是無法識別ARP包的真偽的,如果我們按照ARP的格式來發送資料包,只要資訊有效計算機就會根據包中的內容做相應的反應.
       試想一下,如果我們按照ARP響應包的相應的內容來重新整理自己的ARP快取中的列表,嘿嘿,那我們豈不是可以根據這點在沒有安全防範的網路中玩些ARP包的小把戲了?在後面的文章裡我就手把手來教你們如何填充發送ARP包,不過先別急,我們再繼續學點基礎知識^_^

2.ARP包的格式
       既然我們要來做一個我們自己的ARP包,當然首先要學習一下ARP包的格式。
       從網路底層看來,一個ARP包是分為兩個部分的,前面一個是物理幀頭,後面一個才是ARP幀。
       首先,物理幀頭,它將存在於任何一個協議資料包的前面,我們稱之為DLC Header,因為這個幀頭是在資料鏈路層構造的,並且其主要內容為收發雙方的實體地址,以便硬體裝置識別。

                                 DLC Header
欄位                   長度(Byte)          預設值                 備註
接收方MAC       6                                                    廣播時,為 ff-ff-ff-ff-ff-ff
傳送方MAC       6        
Ethertype          2                                                   0x0806       0x0806是ARP幀的型別值
                            圖1 物理幀頭格式

       圖1是需要我們填充的物理幀頭的格式,我們可以看到需要我們填充的僅僅是傳送端和接收端的實體地址罷了,是不是很簡單呢?
       接下來我們看一下ARP幀的格式.

                         ARP Frame

欄位                     長度(Byte)         預設值              備註
硬體型別              2                       0x1             乙太網型別值
上層協議型別       2                       0x0800          上層協議為IP協議
MAC地址長度      1                       0x6             乙太網MAC地址長度為 6
IP地址長度           1                       0x4             IP地址長度為 4
操作碼                  2                                       0x1表示ARP請求包,0x2表示應答包
傳送方MAC          6        
傳送方IP              4        
接收方MAC         6        
接收方IP              4        
填充資料             18                            因為物理幀最小長度為64位元組,前面的42位元組再加上4個CRC校驗位元組,還差18個位元組
                              圖2 ARP幀格式


我們可以看到需要我們填充的同樣也只是MAC,IP,再加上一個1或2的操作碼而已。

3.ARP包的填充
1) 請求包的填充:
       比如我們的電腦MAC地址為 aa-aa-aa-aa-aa-aa,IP為 192.168.0.1 我們想要查詢 192.168.0.99的MAC地址,應該怎麼來做呢?
       首先填充DLC Header,通過前面的學習我們知道,想要知道某個計算機對應的MAC地址是要給全網傳送廣播的,所以接收方MAC肯定是 ffffffffffff,傳送方MAC當然是自己啦,於是我們的DLC Header就填充完成了,如圖,加粗的是我們要手動輸入的值(當然我編的程式比較智慧,會根據你選擇的ARP包型別幫你自動填入一些欄位,你一用便知^_^)。


                                  DLC Header

欄位                   長度(Byte)              填充值
接收方MAC        6                           ffffffffffff
傳送方MAC        6                           aaaaaaaaaaaa
Ethertype           2                           0x0806

圖3 ARP請求包中 DLC Header內容

       接下來是ARP幀,請求包的操作碼當然是 1,傳送方的MAC以及IP當然填入我們自己的,然後要注意一下,這裡的接收方IP填入我們要查詢的那個IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,於是,如圖,
                             


                       ARP Frame
欄位                   長度(Byte)                 填充值
硬體型別             2                          1
上層協議型別      2                          0800
MAC地址長度     1                          6
IP地址長度          1                          4
操作碼                2                          1
傳送方MAC        6                          aaaaaaaaaaaa
傳送方IP             4                          192.168.0.1
接收方MAC        6                          任意值 xxxxxxxxxxxx
接收方IP             4                          192.168.0.99
填充資料           18                          0

                  圖4 ARP請求包中 ARP幀的內容

       如果我們構造一個這樣的包傳送出去,如果 192.168.0.99存在且是活動的,我們馬上就會收到一個192.168.0.99發來的一個響應包,我們可以檢視一下我們的ARP快取列表,是不是多了一項類似這樣的條目:           
        192.168.0.99                   bb-bb-bb-bb-bb-bb

       我們再來看一下ARP響應包的構造
2) 響應包的填充
      有了前面詳細的解說,你肯定就能自己說出響應包的填充方法來了吧,所以我就不細說了,列兩個表就好了
      比如說給 192.168.0.99(MAC為 bb-bb-bb-bb-bb-bb)發一個ARP響應包,告訴它我們的MAC地址為 aa-aa-aa-aa-aa-aa,就是如此來填充各個欄位

                                   DLC Header
欄位                       長度(Byte)                    填充值
接收方MAC6          6                             bbbbbbbbbbbb
傳送方MAC            6                             aaaaaaaaaaaa
Ethertype               2                             0x0806

               圖5 ARP響應包中 DLC Header內容

                                ARP Frame
欄位                     長度(Byte)                    填充值
硬體型別               2                             1
上層協議型別        2                             0800
MAC地址長度       1                             6
IP地址長度            1                             4
操作碼                   2                             2
傳送方MAC          6                             aaaaaaaaaaaa
傳送方IP               4                             192.168.0.1
接收方MAC          6                             bbbbbbbbbbbb
接收方IP               4                             192.168.0.99
填充資料              18                            0

           圖6 ARP響應包中 ARP幀的內容

     這樣192.168.0.99的ARP快取中就會多了一條關於我們192.168.0.1的地址對映。
     好了,終於到了程式設計實現它的時候了^_^

二.ARP包的遊戲
       既然我們可以自己來填充資料包,那麼來玩些ARP的“小遊戲”欺騙就是易如反掌了,當然,是在沒有安全防護的網路裡 ,比如只有hub或者交換機把你們相連,而沒有路由分段……^_^
       下面我就由淺入深的講一些介紹一些關於ARP的小伎倆。
1. 小伎倆
1)        你可以試著發一個請求包廣播,其中的ARP幀裡關於你的資訊填成這樣:
(為了節省篇幅,我只寫需要特別指出的填充欄位)


傳送方MAC    6          隨便亂填一個錯誤的
傳送方IP         4          填上你的IP


       出現什麼結果?是不是彈出一個IP地址衝突的提示?呵呵,同樣的道理,如果傳送方IP填成別人的,然後每隔1秒發一次………..-_-b
2)        比如你們都靠一個閘道器192.168.0.1 上網 ,如果你想讓192.168.0.77 上不了網,就可以偽裝成閘道器給192.168.0.77發一個錯誤的ARP響應包, like this

傳送方MAC     6        隨便亂填一個錯誤的
傳送方IP          4        閘道器IP 192.168.0.1

接收方就填192.168.0.77的相關資訊,傳送之後,它還能上網不?這樣能折騰他好一陣子了,只要它的系統得不到正確的到閘道器的ARP對映表它就一直上不了網了 ^_^
              ARP欺騙

       因為在以太網裡,網路裝置就是靠MAC資訊來識別的計算機的,比如A電腦知道MAC地址為 22-22-22-22-22-22的電腦是B,而如果我給A傳送一個ARP響應包,告訴它我的MAC是22-22-22-22-22-22的話,A同樣會認為我的計算機是B了,那麼好,我們設想有這麼一個環境,A的防火牆只對IP為192.168.0.2 MAC為 22-22-22-22-22-22的B有信任關係,而且A打開了21埠提供FTP服務,正常情況下因為防火牆的緣故我們的計算機是連不到A的,於是我們想辦法讓B down掉,或者在它關機的時候,我們把我們的IP改成B的192.168.0.2,然後給A傳送一個ARP迴應包,告訴A更新一下ARP快取列表,192.168.0.2的IP對映到我們的MAC地址上來,於是,奇蹟出現了,我們可以連到A的FTP上了,防火牆失效了^_^
不過這個辦法只能在同網段內生效,如果我們和A不在一個網段內,那就要複雜的多了,還要配合ICMP的重定向來控制報文的路由,這個我準備在以後闡述ICMP包的時候, 詳細講解,就不再此多說了。

3. 基於ARP欺騙的監聽原理
       監聽的技術有很多了,不過我們常用的sniffer工具只能在基於hub的網路中起作用,碰到哪怕是交換機都無能為力了,這個時候我們的ARP欺騙技術就派上用場了。
       還是假設有三臺主機A,B,還有我們的主機,位於同一個交換式區域網中A與B正在通訊,如果我們想要刺探A――>B通訊的內容,於是我們就可以給A傳送一個偽造的ARP迴應包,告訴A,B的IP對應的MAC條目為我們的MAC地址,於是,A也就會相應的重新整理自己的ARP快取,將, 發給B的資料,源源不斷的傳送到我們的主機上來,這樣我就可以對接收到的資料包進行分析就好了,達到了監聽的目的。當然,因為動態ARP快取是動態的,有超時時間的,所以我們必須每隔一段時間就給A傳送一個ARP迴應包雖然我們這樣達到了目的, ,但是A到B的通訊卻被停止了,為了不讓B發現,我們還要對每次接收到的資料包進行轉發,全部都轉發給B,這樣就天衣無縫了^_^
       同樣的,如果我們還想監聽B à A的資料包,一樣給B發一個ARP迴應包,告訴B,A的IP對應的MAC是我們的主機MAC,於是B到A的資料包也源源不斷的發到我們的主機上來了,當然我們也是一樣要對這些資料包進行轉發,如圖:
A   <------>    我們的主機    <------>    B
一切都無誤的話,A和B的通訊內容就這樣不知不覺的被我們監聽到了^_^