在實現TCP/IP協議的網絡環境下,一個IP包走到哪裡、要怎麼走是靠路由表定義的,但是,當IP包到達該網絡後,哪台機器響應這個IP包卻是靠該IP包中所包含的硬件MAC地址來識別的。也就是說,只有機器的硬件MAC地址和該IP包中的硬件MAC地址相同的機器才會應答這個IP包,因為在網絡中,每一台主機都會有發送IP包的時候,所以,在每台主機的內存中,都有一個 arp--〉硬件MAC的轉換表。通常是動態的轉換表(該arp表可以手工添加靜態條目)。也就是說,該對應表會被主機在一定的時間間隔後刷新。這個時間間隔就是ARP高速緩存的超時時間。通常主機在發送一個IP包之前,它要到該轉換表中尋找和IP包對應的硬件MAC地址,如果沒有找到,該主機就發送一個ARP廣播包,於是,主機刷新自己的ARP緩存。然後發出該IP包。
了解這些常識後,現在就可以介紹在以太網絡中ARP欺騙是如何產生了,可以看看如下一個例子。
1.同網段ARP欺騙分析
如下所示,三台主機的IP地址和MAC地址分布如下:
A: IP地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA;
B: IP地址 192.168.0.2 硬件地址 BB:BB:BB:BB:BB:BB;
C: IP地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC。
一個位於主機B的入侵者想非法進入主機A,可是這台主機上安裝有防火牆。通過收集資料他知道這台主機A的防火牆只對主機C有信任關系(開放23端口(telnet))。而他必須要使用telnet來進入主機A,這個時候他應該如何處理呢?
入侵者必須讓主機A相信主機B就是主機C,如果主機A和主機C之間的信任關系是建立在IP地址之上的。如果單單把主機B的IP地址改的和主機C的一樣,那是不能工作的,至少不能可靠地工作。如果你告訴以太網卡設備驅動程序,自己IP是192.168.0.3,那麼這只是一種純粹的競爭關系,並不能達到目標。我們可以先研究C這台機器,如果我們能讓這台機器暫時當掉,競爭關系就可以解除,這個還是有可能實現的。在機器C宕掉的同時,將機器B的IP地址改為192.168.0.3,這樣就可以成功的通過23端口telnet到機器A上面,而成功的繞過防火牆的限制。
上面的這種想法在下面的情況下是沒有作用的,如果主機A和主機C之間的信任關系是建立在硬件地址的基礎上。這個時候還需要用ARP欺騙的手段,讓主機A把自己的ARP緩存中的關於192.168.0.3映射的硬件地址改為主機B的硬件地址。
我們可以人為地制造一個arp_reply的響應包,發送給想要欺騙的主機,這是可以實現的,因為協議並沒有規定必須在接收到arp_echo後才可以發送響應包。這樣的工具很多,我們也可以直接用Wireshark抓一個arp響應包,然後進行修改。
可以人為地制造這個包。可以指定ARP包中的源IP、目標IP、源MAC地址、目標MAC地址。這樣你就可以通過虛假的ARP響應包來修改主機A上的動態ARP緩存達到欺騙的目的。
下面是具體的步驟。
(1)他先研究192.0.0.3這台主機,發現這台主機的漏洞。
(2)根據發現的漏洞使主機C宕掉,暫時停止工作。
(3)這段時間裡,入侵者把自己的IP改成192.0.0.3。
(4)他用工具發一個源IP地址為192.168.0.3源MAC地址為BB:BB:BB:BB:BB:BB的包給主機A,要求主機A更新自己的ARP轉換表。
(5)主機更新了ARP表中關於主機C的IP-->MAC對應關系。
(6)防火牆失效了,入侵的IP變成合法的MAC地址,可以telnet 了。
(7)上面就是一個ARP的欺騙過程,這是在同網段發生的情況,但是,提醒注意的是,在B和C處於不同網段的時候,上面的方法是不起作用的。
2.不同網段ARP欺騙分析
假設A、C位於同一網段而主機B位於另一網段,三台機器的ip地址和硬件地址如下:
A: IP地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA;
B: IP地址 192.168.1.2 硬件地址 BB:BB:BB:BB:BB:BB;
C: IP地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC。
在現在的情況下,位於192.168.1網段的主機B如何冒充主機C欺騙主機A呢?顯然用上面的辦法的話,即使欺騙成功,那麼由主機B和主機A之間也無法建立telnet會話,因為路由器不會把主機A發給主機B的包向外轉發,路由器會發現地址在192.168.0.這個網段之內。
現在就涉及另外一種欺騙方式--ICMP重定向。把ARP欺騙和ICMP重定向結合在一起就可以基本實現跨網段欺騙的目的。
ICMP重定向報文是ICMP控制報文中的一種。在特定的情況下,當路由器檢測到一台機器使用非優化路由的時候,它會向該主機發送一個ICMP重定向報文,請求主機改變路由。路由器也會把初始數據報向它的目的地轉發。
我們可以利用ICMP重定向報文達到欺騙的目的。下面是結合ARP欺騙和ICMP重定向進行攻擊的步驟。
(1)為了使自己發出的非法IP包能在網絡上能夠存活長久一點,開始修改IP包的生存時間TTL為下面的過程中可能帶來的問題做准備。把TTL改成255。(TTL定義一個IP包如果在網絡上到不了主機後,在網絡上能存活的時間,改長一點在本例中有利於做充足的廣播)。
(2)下載一個可以自由制作各種包的工具(例如hping2)。
(3)然後和上面一樣,尋找主機C的漏洞按照這個漏洞宕掉主機C。
(4)在該網絡的主機找不到原來的192.0.0.3後,將更新自己的ARP對應表。於是他發送一個原IP地址為192.168.0.3硬件地址為BB:BB:BB:BB:BB:BB的ARP響應包。
(5)現在每台主機都知道了,一個新的MAC地址對應192.0.0.3,一個ARP欺騙完成了,但是,每台主機都只會在局域網中找這個地址而根本就不會把發送給192.0.0.3的IP包丟給路由。於是他還得構造一個ICMP的重定向廣播。
(6)自己定制一個ICMP重定向包告訴網絡中的主機:"到192.0.0.3的路由最短路徑不是局域網,而是路由,請主機重定向你們的路由路徑,把所有到192.0.0.3的IP包丟給路由。"
(7)主機A接收這個合理的ICMP重定向,於是修改自己的路由路徑,把對192.0.0.3的通信都丟給路由器。
(8)入侵者終於可以在路由外收到來自路由內的主機的IP包了,他可以開始telnet到主機的23口。
其實上面的想法只是一種理想話的情況,主機許可接收的ICMP重定向包其實有很多的限制條件,這些條件使ICMP重定向變得非常困難。
TCP/IP協議實現中關於主機接收ICMP重定向報文主要有下面幾條限制。
(1)新路由必須是直達的。
(2)重定向包必須來自去往目標的當前路由。
(3)重定向包不能通知主機用自己做路由。
(4)被改變的路由必須是一條間接路由。
由於有這些限制,所以ICMP欺騙實際上很難實現。但是我們也可以主動地根據上面的思維尋找一些其他的方法。更為重要的是我們知道了這些欺騙方法的危害性,我們就可以采取相應的防御辦法。
3.ARP欺騙的防御原則
我們給出如下一些初步的防御方法。
(1)不要把你的網絡安全信任關系建立在IP地址的基礎上或硬件MAC地址基礎上,(RARP同樣存在欺騙的問題),理想的關系應該建立在IP+MAC基礎上。
(2)設置靜態的MAC→IP對應表,不要讓主機刷新你設定好的轉換表。
(3)除非很有必要,否則停止使用ARP,將ARP作為永久條目保存在對應表中。在Linux下用ifconfig -arp可以使網卡驅動程序停止使用ARP。
(4)使用代理網關發送外出的通信。
(5)修改系統拒收ICMP重定向報文。在Linux下可以通過在防火牆上拒絕ICMP重定向報文或者是修改內核選項重新編譯內核來拒絕接收ICMP重定向報文。在Win 2000下可以通過防火牆和IP策略拒絕接收ICMP報文。