定義
ICMP協定是一種面向無連線的協定,用於傳輸出錯報告控制信息。它是一個非常重要的協定,它對於網路安全具有極其重要的意義。
它是TCP/IP協定族的一個子協定,屬於網路層協定,主要用於在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態信息等。當遇到IP數據無法訪問目標、IP路由器無法按當前的傳輸速率轉發數據包等情況時,會自動傳送ICMP訊息。ICMP報文在IP幀結構的首部協定類型欄位(Protocol 8bit)的值=1.
如下圖所示,ICMP包有一個8位元組長的包頭,其中前4個位元組是固定的格式,包含8位類型欄位,8位代碼欄位和16位的校驗和;後4個位元組根據ICMP包的類型而取不同的值。
ICMP提供一致易懂的出錯報告信息。傳送的出錯報文返回到傳送原數據的設備,因為只有傳送設備才是出錯報文的邏輯接受者。傳送設備隨後可根據ICMP報文確定發生錯誤的類型,並確定如何才能更好地重發失敗的數據包。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由傳送方完成。
我們在網路中經常會使用到ICMP協定,比如我們經常使用的用於檢查網路通不通的Ping命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協定工作的過程。還有其他的網路命令如跟蹤路由的Tracert命令也是基於ICMP協定的。
協定內容
ICMP的全稱是 Internet Control Message Protocol 。從技術角度來說,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網路的連線狀況﹐也能確保連線的準確性﹐其功能主要有:
· 偵測遠端主機是否存在。
· 建立及維護路由資料。
· 重導資料傳送路徑(ICMP重定向)。
· 資料流量控制。ICMP在溝通之中,主要是透過不同的類別(Type)與代碼(Code) 讓機器來識別不同的連線狀況。常用的類別如下表所列﹕
ICMP 是個非常有用的協定﹐尤其是當我們要對網路連線狀況進行判斷的時候。
重要性
ICMP協定對於網路安全具有極其重要的意義。ICMP協定本身的特點決定了它非常容易被用於攻擊網路上的路由器和主機。例如,在1999年8月海信集團“懸賞”50萬元人民幣測試防火牆的過程中,其防火牆遭受到的ICMP攻擊達334050次之多,占整個攻擊總數的90%以上!可見,ICMP的重要性絕不可以忽視!
比如,可以利用作業系統規定的ICMP數據包最大尺寸不超過64KB這一規定,向主機發起“Ping of Death”(死亡之Ping)攻擊。“Ping of Death” 攻擊的原理是:如果ICMP數據包的尺寸超過64KB上限時,主機就會出現記憶體分配錯誤,導致TCP/IP堆疊崩潰,致使主機當機。(作業系統已經取消了傳送ICMP數據包的大小的限制,解決了這個漏洞)
此外,向目標主機長時間、連續、大量地傳送ICMP數據包,也會最終使系統癱瘓。大量的ICMP數據包會形成“ICMP風暴”,使得目標主機耗費大量的CPU資源處理,疲於奔命。
校驗算法
以下代碼在Visual Studio 2008 + Windows 7下調試通過。
lpsz指定要計算的數據包首地址,_dwSize指定該數據包的長度。
int CalcCheckSum(char* lpsz,DWORD _dwSize)
{
int dwSize;
__asm // 嵌入彙編
{
mov ecx,_dwSize
shr ecx,1
xor ebx,ebx
mov esi,lpsz
read: //所有word相加,保存至EBX暫存器
lodsw
movzx eax,ax
add ebx,eax
loop read
test _dwSize,1 //校驗數據是否是奇數位的
jz calc
lodsb
movzx eax,al
add ebx,eax
calc:
mov eax,ebx //高低位相加
and eax,0ffffh
shr ebx,16
add eax,ebx
not ax
mov dwSize,eax
}
return dwSize;
}
抵禦攻擊
雖然ICMP協定給黑客以可乘之機,但是ICMP攻擊也並非無藥可醫。只要在日常網路管理中未雨綢繆,提前做好準備,就可以有效地避免ICMP攻擊造成的損失。
對於“Ping of Death”攻擊,可以採取兩種方法進行防範:第一種方法是在路由器上對ICMP數據包進行頻寬限制,將ICMP占用的頻寬控制在一定的範圍內,這樣即使有ICMP攻擊,它所占用的頻寬也是非常有限的,對整個網路的影響非常少;第二種方法就是在主機上設定ICMP數據包的處理規則,最好是設定拒絕所有的ICMP數據包。
設定ICMP數據包處理規則的方法也有兩種,一種是在作業系統上設定包過濾,另一種是在主機上安裝防火牆。具體設定如下:
1.在Windows 2000 Server中設定ICMP過濾
Windows 2000 Server提供了“路由與遠程訪問”服務,但是默認情況下是沒有啟動的,因此首先要啟動它:點擊“管理工具”中的“路由與遠程訪問”,啟動設定嚮導。在其中選擇“手動配置伺服器”項,點擊[下一步]按鈕。稍等片刻後,系統會提示“路由和遠程訪問服務現在已被安裝。要開始服務嗎?”,點擊[是]按鈕啟動服務。
服務啟動後,在計算機名稱的分支下會出現一個“IP路由選擇”,點擊它展開分支,再點擊“常規”,會在右邊出現伺服器中的網路連線(即網卡)。用滑鼠右鍵點擊你要配置的網路連線,在彈出的選單中點擊“屬性”,會彈出一個網路連線屬性的視窗,如圖1所示。
圖1中有兩個按鈕,一個是“輸入篩選器”(指對此伺服器接受的數據包進行篩選),另一個是“輸出篩選器”(指對此伺服器傳送的數據包進行篩選),這裡應該點擊[輸入篩選器] 按鈕,會彈出一個“添加篩選器”視窗,再點擊[添加]按鈕,表示要增加一個篩選條件。
在“協定”右邊的下拉列表中選擇“ICMP”,在隨後出現的“ICMP類型”和“ICMP編碼”中均輸入“255”,代表所有的ICMP類型及其編碼。ICMP有許多不同的類型(Ping就是一種類型),每種類型也有許多不同的狀態,用不同的“編碼”來表示。因為其類型和編碼很複雜,這裡不再敘述。
點擊[確定]按鈕返回“輸入篩選器”視窗,此時會發現“篩選器”列表中多了一項內容(如圖2所示)。點擊[確定]按鈕返回“本地連線”視窗,再點擊[確定]按鈕,此時篩選器就生效了,從其他計算機上Ping這台主機就不會成功了。
2. 用防火牆設定ICMP過濾
許多防火牆在默認情況下都啟用了ICMP過濾的功能。如果沒有啟用,只要選中“防禦ICMP攻擊”、“防止別人用ping命令探測”就可以了,如圖3所示。
防禦方法
選擇合適的防火牆
有效防止ICMP攻擊,防火牆應該具有狀態檢測、細緻的數據包完整性檢查和很好的過濾規則控制功能。
狀態檢測防火牆通過跟蹤它的連線狀態,動態允許外出數據包的回響信息進入防火牆所保護的網路。例如,狀態檢測防火牆可以記錄一個出去的 PING(ICMP Echo Request),在接下來的一個確定的時間段內,允許目標主機回響的ICMP Echo Reply直接傳送給前面發出了PING命令的IP,除此之外的其他ICMP Echo Reply訊息都會被防火牆阻止。與此形成對比的是,包過濾類型的防火牆允許所有的ICMP Echo Reply訊息進入防火牆所保護的網路了。許多路由器和基於Linux核心2.2或以前版本的防火牆系統,都屬於包過濾型,用戶應該避免選擇這些系統。
新的攻擊不斷出現,防火牆僅僅能夠防止已知攻擊是遠遠不夠的。通過對所有數據包進行細緻分析,刪除非法的數據包,防火牆可以防止已知和未知的 DoS攻擊。這就要求防火牆能夠進行數據包一致性檢查。安全策略需要針對ICMP進行細緻的控制。因此防火牆應該允許對ICMP類型、代碼和包大小進行過濾,並且能夠控制連線時間和ICMP包的生成速率。
配置防火牆以預防攻擊
一旦選擇了合適的防火牆,用戶應該配置一個合理的安全策略。以下是被普遍認可的防火牆安全配置慣例,可供管理員在系統安全性和易用性之間作出權衡。
防火牆應該強制執行一個預設的拒絕策略。除了出站的ICMP Echo Request、出站的ICMP Source Quench、進站的TTL Exceeded和進站的ICMP Destination Unreachable之外,所有的ICMP訊息類型都應該被阻止。
ICMP類型
這是一個完整的ICMP類型的列表: Table C-1. ICMP類型
TYPE | CODE | Description | Query | Error |
0 | 0 | Echo Reply——回顯應答(Ping應答) | x | |
3 | 0 | Network Unreachable——網路不可達 | x | |
3 | 1 | Host Unreachable——主機不可達 | x | |
3 | 2 | Protocol Unreachable——協定不可達 | x | |
3 | 3 | Port Unreachable——連線埠不可達 | x | |
3 | 4 | Fragmentation needed but no frag. bit set——需要進行分片但設定不分片比特 | x | |
3 | 5 | Source routing failed——源站選路失敗 | x | |
3 | 6 | Destination network unknown——目的網路未知 | x | |
3 | 7 | Destination host unknown——目的主機未知 | x | |
3 | 8 | Source host isolated (obsolete)——源主機被隔離(作廢不用) | x | |
3 | 9 | Destination network administratively prohibited——目的網路被強制禁止 | x | |
3 | 10 | Destination host administratively prohibited——目的主機被強制禁止 | x | |
3 | 11 | Network unreachable for TOS——由於服務類型TOS,網路不可達 | x | |
3 | 12 | Host unreachable for TOS——由於服務類型TOS,主機不可達 | x | |
3 | 13 | Communication administratively prohibited by filtering——由於過濾,通信被強制禁止 | x | |
3 | 14 | Host precedence violation——主機越權 | x | |
3 | 15 | Precedence cutoff in effect——優先中止生效 | x | |
4 | 0 | Source quench——源端被關閉(基本流控制) | ||
5 | 0 | Redirect for network——對網路重定向 | ||
5 | 1 | Redirect for host——對主機重定向 | ||
5 | 2 | Redirect for TOS and network——對服務類型和網路重定向 | ||
5 | 3 | Redirect for TOS and host——對服務類型和主機重定向 | ||
8 | 0 | Echo request——回顯請求(Ping請求) | x | |
9 | 0 | Router advertisement——路由器通告 | ||
10 | 0 | Route solicitation——路由器請求 | ||
11 | 0 | TTL equals 0 during transit——傳輸期間生存時間為0 | x | |
11 | 1 | TTL equals 0 during reassembly——在數據報組裝期間生存時間為0 | x | |
12 | 0 | IP header bad (catchall error)——壞的IP首部(包括各種差錯) | x | |
12 | 1 | Required options missing——缺少必需的選項 | x | |
13 | 0 | Timestamp request (obsolete)——時間戳請求(作廢不用) | x | |
14 | Timestamp reply (obsolete)——時間戳應答(作廢不用) | x | ||
15 | 0 | Information request (obsolete)——信息請求(作廢不用) | x | |
16 | 0 | Information reply (obsolete)——信息應答(作廢不用) | x | |
17 | 0 | Address mask request——地址掩碼請求 | x | |
18 | 0 | Address mask reply——地址掩碼應答 |