主題: ARP協議揭密
查看單個文章
舊 2004-03-09, 01:10 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 ARP協議揭密

ARP協議揭密



內容:

ARP協議概述
ARP使用舉例
ARP欺騙
代理ARP的應用
小結


張新瑞 (zhangxinrui2@163.com)
2003 年 5 月

1 ARP協議概述

IP資料包常通過以太網發送。以太網設備並不識別32位IP位址:它們是以48位以太網地址傳輸以太網資料包的。因此,IP驅動器必須把IP目的地址轉換成以太網網目的地址。



在這兩種地址之間存在著某種靜態的或算法的映射,常常需要檢視一張表。地址解析協議(Address Resolution Protocol,ARP)就是用來確定這些映像的協議。

ARP工作時,送出一個含有所希望的IP位址的以太網廣播資料包。


目的地主機,或另一個代表該主機的系統,以一個含有IP和以太網地址對的資料包作為應答。發送者將這個地址對高速快取起來,以節約不必要的ARP通信。

如果有一個不被信任的節點對本地網路具有寫訪問許可權,那麼也會有某種風險。


這樣一台機器可以發佈虛假的ARP報文並將所有通信都轉向它自己,然後它就可以扮演某些機器,或者順便對資料流進行簡單的修改。ARP機制常常是自動起作用的。在特別安全的網路上, ARP映射可以用固件,並且具有自動抑制協議達到防止幹擾的目的。


圖1 以太網上的ARP報文格式

圖1是一個用作IP到以太網地址轉換的ARP報文的例子。在圖中每一行為32位,也就是4個八位組表示,在以後的圖中,我們也將遵循這一方式。

硬體類型字列指明了發送方想知道的硬體連接頭類型,以太網的值為1。

協議類型字列指明了發送方提供的高層協議類型,IP為0806(16進制)。


硬體地址長度和協議長度指明了硬體地址和高層協議地址的長度,這樣ARP報文就可以在任意硬體和任意協議的網路中使用。操作字列用來表示這個報文的目的,ARP請求為1,ARP回應為2,RARP請求為3,RARP回應為4。

當發出ARP請求時,發送方填好發送方首部和發送方IP位址,還要填寫目標IP位址。



當目標機器收到這個ARP廣播包時,就會在回應報文中填上自己的48位主機地址。

2 ARP使用舉例

我們先看一下linux下的arp命令(如果開始arp表中的內容為空的話,需要先對某台主機進行一個連接,例如ping一下目標主機來產生一個arp項):

d2server:/home/kerberos# arp
Address HWtype HWaddress Flags Mask Iface
211.161.17.254 ether 00:04:9A:AD:1C:0A C eth0
Address:主機的IP位址
Hwtype:主機的硬體類型
Hwaddress:主機的硬體地址
Flags Mask:記錄標誌,"C"表示arp高速快取中的條目,"M"表示靜態的arp條目。

用"arp --a"命令可以顯示主機地址與IP位址的對應表,也就是機器中所儲存的arp快取訊息。這個高速快取存放了最近Internet地址到硬體地址之間的映射記錄。高速快取中每一項的生存時間一般為20分鐘,起始時間從被新建時開始算起。

d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
可以看到在快取中有一條211.161.17.254相對應的arp快取條目。
d2server:/home/kerberos# telnet 211.161.17.21
Trying 211.161.17.21...
Connected to 211.161.17.21.
Escape character is ^].
^].
telnet>quit
connetion closed.

在執行上面一條telnet命令的同時,用tcpdump進行監聽:

d2server:/home/kerberos# tcpdump -e dst host 211.161.17.21
tcpdump: listening on eth0

我們將會聽到很多包,我們取與我們arp協議相關的2個包:

1 0.0 000:F8:0A:FB:83 FF:FF:FF:FF:FF:FF arp 60
who has 211.161.17.21 tell d2server
2 0.002344(0.0021) 00:E0:3C:43:0D:24 000:F8:0A:FB:83 arp 60
arp reply 211.161.17.21 is at 00:E0:3C:43:0D:24

在第1行中,源端主機(d2server)的硬體地址是000:F8:0A:FB:83。目的端主機的硬體地址是FF:FF:FF:FF:FF:FF,這是一個以太網廣播地址。電纜上的每個以太網連接頭都要接收這個資料幀並對它進行處理。

第1行中緊接著的一個輸出字列是arp,表明幀類型字列的值是0x0806,說明此資料幀是一個ARP請求或回答。

在每行中,單詞後面的值60指的是以太網資料幀的長度。由於ARP請求或回答的資料幀長都是42字節(28字節的ARP資料,14字節的以太網幀頭),因此,每一幀都必須加入填充字元以達到以太網的最小長度要求:60字節。

第1行中的下一個輸出字列arp who-has表示作為ARP請求的這個資料幀中,目的I P地址是211.161.17.21的地址,發送端的I P地址是d2server的地址。tcpdump列印出主機名對應的預設值I P地址。

從第2行中可以看到,儘管ARP請求是廣播的,但是ARP應答的目的地址卻是211.161.17.21(00:E0:3C:43:0D:24)。ARP應答是直接送到請求端主機的,而是廣播的。tcpdump列印出arp reply的字樣,同時列印出回應者的主機ip和硬體地址。

在每一行中,行號後面的數位表示tcpdump收到分組的時間(以秒為公司)。除第1行外,每行在括號中還包含了與上一行的時間差異(以秒為公司)。

這個時候我們再看看機器中的arp快取:

d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
(211.161.17.21) at 00:E0:3C:43:0D:24 [ether] on eth0

arp高速快取中已經增加了一條有關211.161.17.21的映射。

再看看其他的arp相關的命令:

d2server:/home/kerberos# arp -s 211.161.17.21 00:00:00:00:00:00
d2server:/home/kerberos# arp
Address HWtype HWaddress Flags Mask Iface
211.161.17.254 ether 00:04:9A:AD:1C:0A C eth0
211.161.17.21 ether 00:00:00:00:00:00 CM eth0
d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
(211.161.17.21) at 00:00:00:00:00:00 [ether] PERM on eth0

可以看到我們用arp -s選項設置了211.161.17.21對應的硬體地址為00:00:00:00:00:00,而且這條映射的標誌字列為CM,也就是說我們手工設置的arp選項為靜態arp選項,它保持不變沒有超時,不像高速快取中的條目要在一定的時間間隔後更新。

如果想讓手工設置的arp選項有超時時間的話,可以加上temp選項

d2server:/home/kerberos# arp -s 211.161.17.21 00:00:00:00:00:00 temp
d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
(211.161.17.21) at 00:00:00:00:00:00 [ether] on eth0
d2server:/home/kerberos# arp
Address HWtype HWaddress Flags Mask Iface
211.161.17.254 ether 00:04:9A:AD:1C:0A C eth0
211.161.17.21 ether 00:00:00:00:00:00 C eth0

可以看到標誌字列的靜態arp標誌"M"已經去掉了,我們手工加上的是一條動態條目。

請大家注意arp靜態條目與動態條目的區別。

在不同的系統中,手工設置的arp靜態條目是有區別的。在linux和win2000中,靜態條目不會因為偽造的arp回應包而改變,而動態條目會改變。而在win98中,手工設置的靜態條目會因為收到偽造的arp回應包而改變。

如果您想刪除某個arp條目(包括靜態條目),可以用下面的命令:

d2server:/home/kerberos# arp -d 211.161.17.21
d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
(211.161.17.21) at <incomplete> on eth0

可以看到211.161.17.21的arp條目已經是不完整的了。

還有一些其他的命令,可以參考linux下的man文檔:

d2server:/home/kerberos# man arp

3 ARP欺騙

我們先複習一下上面所講的ARP協議的原理。在實現TCP/IP協議的網路環境下,一個ip包走到哪裡,要怎麼走是靠路由表定義,但是,當ip包到達該網路後,哪台機器回應這個ip包卻是靠該ip包中所包含的硬體mac地址來識別。也就是說,只有機器的硬體mac地址和該ip包中的硬體mac地址相同的機器才會應答這個ip包,因為在網路中,每一台主機都會有發送ip包的時候,所以,在每台主機的記憶體中,都有一個 arp--> 硬體mac 的轉換表。通常是動態的轉換表(該arp表可以手工新增靜態條目)。也就是說,該對應表會被主機在一定的時間間隔後刷新。這個時間間隔就是ARP高速快取的超時時間。

通常主機在發送一個ip包之前,它要到該轉換表中尋找和ip包對應的硬體mac地址,如果沒有找到,該主機就發送一個ARP廣播包,於是,主機刷新自己的ARP快取。然後發出該ip包。

瞭解這些常識後,現在就可以談在以太網路中如何實現ARP欺騙了,可以看看這樣一個例子。

3.1 同一網段的ARP欺騙


圖2 同一網段的arp欺騙

如圖2所示,三台主機

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後才可以發送回應包.這樣的工具很多,我們也可以直接用snifferpro抓一個arp回應包,然後進行修改。

你可以人為地製造這個包。可以指定ARP包中的源IP、目標IP、源MAC地址、目標MAC地址。

這樣你就可以通過虛假的ARP回應包來修改主機A上的動態ARP快取達到欺騙的目的。

下面是具體的步驟:

他先研究192.0.0.3這台主機,發現這台主機的漏洞。
根據發現的漏洞使主機C當掉,暫時停止工作。
這段時間裡,入侵者把自己的ip改成192.0.0.3
他用工具發一個源ip地址為192.168.0.3源MAC地址為BB:BB:BB:BB:BB:BB的包給主機A,要求主機A更新自己的arp轉換表。
主機更新了arp表中關於主機C的ip-->mac對應關係。
防火牆失效了,入侵的ip變成合法的mac地址,可以telnet 了。
上面就是一個ARP的欺騙過程,這是在同網段發生的情況,但是,提醒注意的是,在B和C處於不同網段的時候,上面的方法是不起作用的。

3.2 不同網段的ARP欺騙


圖3 不同網段之間的ARP欺騙

如圖3所示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重定向報文,請求主機改變路由。路由器也會把初始資料報向它的目的地轉發。

我們可以利用ICMP重定向報文達到欺騙的目的。

下面是結合ARP欺騙和ICMP重定向進行攻擊的步驟:

為了使自己發出的非法ip包能在網路上能夠存活長久一點,開始修改ip包的生存時間ttl為下面的過程中可能帶來的問題做準備。把ttl改成255. (ttl定義一個ip包如果在網路上到不了主機後,在網路上能存活的時間,改長一點在本例中有利於做充足的廣播)
下載一個可以自由製作各種包的工具(例如hping2)
然後和上面一樣,尋找主機C的漏洞按照這個漏洞當掉主機C。
在該網路的主機找不到原來的192.0.0.3後,將更新自己的ARP對應表。於是他發送一個原ip地址為192.168.0.3硬體地址為BB:BB:BB:BB:BB:BB的ARP回應包。
好了,現在每台主機都知道了,一個新的MAC地址對應192.0.0.3,一個ARP欺騙完成了,但是,每台主機都只會在局域網中找這個地址而根本就不會把發送給192.0.0.3的ip包丟給路由。於是他還得構造一個ICMP的重定向廣播。
自己定制一個ICMP重定向包告訴網路中的主機:"到192.0.0.3的路由最短路徑不是局域網,而是路由,請主機重定向你們的路由路徑,把所有到192.0.0.3的ip包丟給路由。"
主機A接受這個合理的ICMP重定向,於是修改自己的路由路徑,把對192.0.0.3的通訊都丟給路由器。
入侵者終於可以在路由外收到來自路由內的主機的ip包了,他可以開始telnet到主機的23口。
其實上面的想法只是一種理想話的情況,主機許可接收的ICMP重定向包其實有很多的限制條件,這些條件使ICMP重定向變的非常困難。

TCP/IP協議實現中關於主機接收ICMP重定向報文主要有下面幾條限制:

新路由必須是直達的
重定向包必須來自去往目標的當前路由
重定向包不能通知主機用自己做路由
被改變的路由必須是一條間接路由
由於有這些限制,所以ICMP欺騙實際上很難實現。但是我們也可以主動的根據上面的思維尋找一些其他的方法。更為重要的是我們知道了這些欺騙方法的危害性,我們就可以採取相應的防禦辦法。

3.3 ARP欺騙的防禦

知道了ARP欺騙的方法和危害,我們給出一些初步的防禦方法:

不要把你的網路安全信任關係建立在ip地址的基礎上或硬體mac地址基礎上,(rarp同樣存在欺騙的問題),理想的關係應該建立在ip+mac基礎上。
設置靜態的mac-->ip對應表,不要讓主機刷新你設定好的轉換表。
除非很有必要,否則停止使用ARP,將ARP做為永久條目儲存在對應表中。在linux下可以用ifconfig -arp可以使網卡驅動程式停止使用ARP。
使用代理閘道發送外出的通訊。
修改系統拒收ICMP重定向報文
在linux下可以通過在防火牆上拒絕ICMP重定向報文或者是修改內核選項重新編譯內核來拒絕接收ICMP重定向報文。

在win2000下可以通過防火牆和IP策略拒絕接收ICMP報文。

4 代理ARP的應用

代理ARP有兩大應用,一個是有利的就是我們在防火牆實現中常說的透明模式的實現,另一個是有害的就是通過它可以達到在交換環境中進行嗅探的目的.由此可見同樣一種技術被應用於不同的目的,效果是不一樣的.

我們先來看交換環境中局域網的嗅探.

通常在局域網環境中,我們都是通過交換環境的閘道上網的。在交換環境中使用NetXray或者NAI Sniffer一類的嗅探工具除了抓到自己的包以外,是不能看到其他主機的網路通信的。

但是我們可以通過利用ARP欺騙可以實現Sniffer的目的。

ARP協議是將IP位址解析為MAC地址的協議,局域網中的通信都是基於MAC地址的。


圖4 交換網路中的ARP欺騙

如圖4所示,三台主機位於一個交換網路的環境中,其中A是閘道:

A: ip地址 192.168.0.1 硬體地址 AA:AA:AA:AA:AA
B: ip地址 192.168.0.2 硬體地址 BB:BB:BB:BB:BB
C:ip地址 192.168.0.3 硬體地址 CC:CC:CC:CC:CC

在局域網中192.168.0.2和192.168.0.3都是通過閘道192.168.0.1上網的,假定攻擊者的系統為192.168.0.2,他希望聽到192.168.0.3的通信,那麼我們就可以利用ARP欺騙實現。

這種欺騙的中心原則就是arp代理的應用.主機A是局域網中的代理服務器,局域網中每個節點的向外的通信都要通過它.主機B想要聽主機C的通信,它需要先使用ARP欺騙,讓主機C認為它就是主機A,這個時候它發一個IP位址為192.168.0.1,物理地址為BB:BB:BB:BB:BB:BB的ARP回應包給主機C,這樣主機C會把發往主機A的包發往主機B.同理,還要讓閘道A相信它就是主機C,向閘道A發送一個IP位址為192.168.0.3,物理地址為BB:BB:BB:BB:BB:BB的包.

上面這一步的操作和前面的ARP欺騙的原理是一樣的,但是還是有問題,過一段時間主機B會發現自己無法上網.所以下面還有一個步驟就是需要在主機B上轉發從主機A到主機C的包,並且轉發從主機C到主機A的包.現在我們可以看到其實主機B在主機A和主機C的通訊中起到了一個代理的作用,這就是為什麼叫做ARP代理的原因.

具體實現要用到兩個工具dsniff和fragrouter,dsniff用來實現ARP欺騙,fragroute用來進行包的轉發.

首先利用dsniff中的arpspoof來實現ARP欺騙,dsniff軟體可以在下面的網址下載:

http://naughty.monkey.org/~dugsong/dsniff

安裝這個軟體包之前先要下載安裝libnet.

欺騙192.168.0.3,告訴這台機器閘道192.168.0.1的MAC地址是192.168.0.2的MAC地址.

[root@sound dsniff-2.3]# ./arpspoof -i eth0 -t 192.168.0.3 192.168.0.1
欺騙192.168.0.1,告訴192.168.0.1主機192.168.0.3的MAC地址是192.168.0.2的MAC地址。

[root@sound dsniff-2.3]# ./arpspoof -i eth0 -t 192.168.0.1 192.168.0.3
現在我們已經完成了第一步的欺騙,這個欺騙是通過arpspoof來完成的,當然您也可以使用別的工具甚至自己發包來完成.現在我們可以看到在主機A和主機C的arp列表裡面都完成了我們需要的工作.在後面的透明代理中我們將使用另外一種不同的理念.

下面我們先開啟linux系統中的轉發包的選項:

[root@sound /root]# echo "1" >/proc/sys/net/ipv4/ip_forward
下面我們可以下載大名鼎鼎的dugsong的另外一個工具fragroute,這個工具以前叫做fragrouter(僅有1字的差別)主要用於實現入侵檢測系統處理分片的ip和tcp包功能的檢測,本身自代包轉發的功能.可以到下面的網站下載:

http://monkey.org/~dugsong/fragroute/

安裝這個軟體包之前先要下載安裝libpcap和libevent.

當然我們也可以使用fragrouter來完成:

http://www.packetstormsecurity.org/groups/ w00w00/sectools/fragrouter/

[root@sound fragrouter-1.6]# ./fragrouter -B1
fragrouter: base-1: normal IP forwarding

現在就可以實現在交換局域網中嗅探的目標.當然上面這些只是一些原理性的介紹,在真正的使用中會遇到很多的問題,比如如何實現對閘道A和主機C的欺騙,以及如何處理可能出現的廣播風暴問題,這些可以在實踐中學習.還有一個叫arpsniff的工具能夠很方便的完成這一功能,很多網站都提供下載,界面比較友好,由於和上面的原理一樣,只是工具使用上的不同並且新增了一些附加的功能,所以這裡不在進行介紹.

代理ARP的另外一個應用就是防火牆的透明代理的實現.我們都知道早期的防火牆大都是基於路由模式,也就是防火牆要完成一個路由的作用.這種接入方式需要在局域網內的主機上設置防火牆的IP為代理,而且需要在外部路由器的路由表中加入一條指向防火牆的路由.這種方式的缺點在於不透明,需要進行過多的設置,並且破壞了原有的網路拓撲.所以現在幾乎全部的防火牆都實現了一種透明接入的功能,用戶的路由器和客戶端不用做任何修改,用戶甚至感覺不到透明接入方式防火牆的存在.這種透明接入的原理就是ARP代理.

我們現在看如何配置一台主機作為透明接入模式的防火牆(透明接入的防火牆不需要IP),


圖5

如圖5所示,一台防火牆連接內部網段和DMZ網段到外部路由.我們在這台用作防火牆的主機上使用linux操作系統,這樣我們可以方便的使用iptables防火牆.假設三塊網卡為eth0,eth1和eth2,eth0和路由器相連,eth1和內網相連.eth2和外網相連.假設DMZ區有2台服務器.

內網地址:192.168.1.0/24
DMZ地址:192.168.1.2---192.168.1.3
路由器的ip地址:192.168.1.1
eth0:AA:AA:AA:AA:AA:AA
eth1:BB:BB:BB:BB:BB:BB
eth2:CC:CC:CC:CC:CC:CC

和前面差不多,第一步需要實現ARP欺騙,這次我們有個簡單的實現.我們把路由器的IP位址和防火牆的eth1和eth2的網卡物理地址綁定,將內網和DMZ網段的IP位址和eth0的網卡綁定,在linux系統上我們用arp命令實現:

arp -s 192.168.1.1 BB:BB:BB:BB:BB:BB
arp -s 192.168.1.1 CC:CC:CC:CC:CC:CC
arp -s 192.168.1.0/24 AA:AA:AA:AA:AA:AA

第二部我們需要在基於linux的防火牆上設置路由,把目標地址是外部路由的包轉發到eth0,把目標地址為內網的包轉發到eth1,把目標地址是DMZ網段服務器的包轉發到eth2.在linux下面用route命令實現

route add 192.168.1.1 dev eth0
route add -net 192.168.1.0/24 dev eth1
route add 192.168.1.2 dev eth2
route add 192.168.1.3 dev eth3

(針對DMZ網段裡面的每台服務器都要增加一條單獨的路由) 現在我們就已經實現了一個簡單的arp代理的透明接入,當然對應於防火牆的iptables部分要另外配置,iptables的配置不在本文範疇之內.

小結

本文介紹了ARP協議以及與其相關的安全問題。一個重要的安全問題就是ARP欺騙,我們講到了同一網段的ARP欺騙以及跨網段的ARP欺騙和ICMP重定向相結合的方法。由於有這些安全問題的存在,我們給出一些最基本的解決辦法。最後談到了利用代理ARP實現在交換網路中嗅探和防火牆的透明接入。

有關更深入的知識請參考RFC826、RFC814、RFC1029、RFC1166以及有關dugsong有關的網頁: http://freshmeat.net/~dugsong/
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次