ICMP消息的作用和控制
我們學習網(wǎng)絡,少不了對OSI模型的認識。從中,我們也知道,支持網(wǎng)絡結構的一些協(xié)議,也是有著層次的區(qū)分。那么今天我們介紹的ICMP以及ICMP消息的有關內(nèi)容也是其中的重點。OSI模式的第3層是網(wǎng)絡層。數(shù)據(jù)鏈路層提供節(jié)點間的連接,而網(wǎng)絡層則負責路由轉(zhuǎn)發(fā)及實現(xiàn)路由表協(xié)議。其中最主要的就是互聯(lián)網(wǎng)協(xié)議(IP)。網(wǎng)絡層上還提供其他的服務,如互聯(lián)網(wǎng)控制消息協(xié)議(ICMP)。ICMP是專門用作邏輯錯誤和診斷的信使。RFC792對它作了詳細的闡述。任何IP網(wǎng)絡設備都有發(fā)送、接收或運作ICMP消息的功能。雖然ICMP的設計者沒有考慮今天出現(xiàn)的安全性問題,但是他們已經(jīng)設計了一些能使ICMP更有效運作的基本準則。
1. 為了確保ICMP消息不會淹沒IP網(wǎng)絡,ICMP沒有任何特別的優(yōu)先級,它總是一種常規(guī)流量。
2. ICMP消息作為其他ICMP消息的響應而發(fā)送。這個設計機制是為了防止出現(xiàn)一個錯誤消息不斷地重復制造出另一個錯誤消息。否則,它就真的是個大問題了。
3. ICMP不能作為多播或廣播流量的響應而發(fā)送。
知道了這些ICMP基本準則后,我們再來關注下ICMP報頭的格式。設計好的ICMP的報頭就包含了一個類型域和代碼域。通常ICMP包含以下類型:
0 Echo Reply (Ping)
3 Destination Unreachable
4 Source Quench
5 Redirect Message
6 Alternate Host Address
8 Echo Request (Ping)
9 Router Advertisement
10 Router Solicitation
11 Time Exceeded
類型域和代碼域可以一起用于確定ICMP消息的發(fā)送原因。例如,類型3表示一個目標不能到達。在類型3消息中有16位唯一碼。該代碼標識了目標為什么不能到達。其中可能包括網(wǎng)絡問題(代碼0)、路由阻擋數(shù)據(jù)包(代碼13),或者甚至是應用不在目標計算機(代碼3)。最常見的ICMP信息類型是8/0,它是一個呼叫請求/回答(ping)。
現(xiàn)在有很多基于ICMP開發(fā)的網(wǎng)絡工具。Traceroute就是其中的一個。Traceroute以連續(xù)地發(fā)送有序編號的IP TTL數(shù)據(jù)包來尋找ICMP TTL溢出的返回消息。通過它的這個設計,你能發(fā)現(xiàn)ICMP是一個非常有用的網(wǎng)絡工具。但是,它也是最常用的和最濫用的協(xié)議之一?,F(xiàn)在,讓我們來看看一些關于ICMP濫用的情況。
ICMP濫用
之前介紹過使用ping作為基本的連接工具。但它也被黑客廣泛地用來在攻擊前進行連接驗證。你是無法攻擊一個沒有連接上和沒有啟動的系統(tǒng)——而ping則是幫你發(fā)現(xiàn)系統(tǒng)是否正在運行的好辦法。由于這樣的問題太多了,以致目前很多網(wǎng)絡都阻擋了ping。雖然這樣做是一個好的開始,但是它并沒有完全解決問題。比如,隱藏工具Loki就是一個例子。
1996年Phrak的地鐵雜志上發(fā)布了Loki,它是一個概念驗證工具。如果安裝在內(nèi)部電腦上,Loki可以使用ICMP回叫網(wǎng)絡外的黑客。管理員看到的只是發(fā)出的新ping流量,而黑客則事實上已經(jīng)建立了隱秘的通道。ICMP協(xié)議從而正被用于消息傳送。但是,只要在防火墻上同時阻擋進出的ICMP就可以解決這個問題。
與ICMP相關的另一個潛在問題是它在拒絕服務(DoS)攻擊中的使用。Smurf就是一個例子。Smurf使用ping數(shù)據(jù)包來濫用ICMP。它會發(fā)送壞ICMP數(shù)據(jù)包。它能修改目標地址以將數(shù)據(jù)包發(fā)送到網(wǎng)絡節(jié)點的廣播地址。而源地址則已經(jīng)被重新指定為被攻擊者地址。在大型的網(wǎng)絡上,很多系統(tǒng)都會響應廣播ping。這樣攻擊的結果是導致被攻擊者被ping響應流所淹沒,以致合法的訪問被阻斷。在2002年發(fā)生了一個類似的、針對核心DNS服務器的攻擊案例。管理員可以在Cisco路由器上添加以下命令來防止他們的網(wǎng)絡響應Smurf流量:no ip directed-broadcast.
ICMP還可以用于輔助進行端口掃描和OS識別,這也叫做指紋識別。它是攻擊過程中一個必要的步驟。畢竟,在不知道目標系統(tǒng)運行狀態(tài)的情況下,攻擊是無法成功的。例如,黑客可能只有一個針對Windows XP的攻擊,因此它對于Windows 2003系統(tǒng)就沒有用了。指紋識別是用于識別OS的。當進行指紋識別時,黑客會使用一個掃描工具來向目標系統(tǒng)發(fā)送一系列正常的、特有的以及異常的ICMP查詢。接著,掃描工具會觀察響應并將它們與數(shù)據(jù)庫進行比較。
ICMP是設計用于更可信網(wǎng)絡的。有了ICMP的所有功能,如果它可以在網(wǎng)絡上自由的進出,那么它將會是非常實用的。但是,事實上并不是這樣的。如果你的目的是為了使網(wǎng)絡更加的安全,那么要盡可能地在重要的網(wǎng)絡訪問端口阻截和禁用ICMP。你的選擇將會丟棄或拒絕流量。但是,這些都由你自己來決定。從安全的角度考慮,丟棄數(shù)據(jù)包可以減少信息的泄露并使黑客更加難以收集到信息。而拒絕數(shù)據(jù)包會使服務能發(fā)現(xiàn)操作失敗并快速地中止,而這使使網(wǎng)絡更加容易受到攻擊了。基于這些原因,作者建議選擇丟棄ICMP數(shù)據(jù)。