對ICMP洪水攻擊的詳細淺析
此文章主要介紹的是互聯網的巨大威脅之ICMP洪水攻擊的詳細淺析,ICMP全稱Internet Control Message Protocol即網際控制信息協議。提起ICMP,可能有些人會感到陌生,實際上,ICMP與我們息息相關。
幾年前的某天晚上9時,兩個“大蝦”進入一個聊天室,提議里面的50多個網民“去響應號召,做愛國的事”,以下是原話摘錄:
大蝦甲:今晚10點,大家一起去ping白宮!
大蝦乙:嗯嗯!ping死白宮!
網民:怎么做?
大蝦甲:你怎么這么笨?開MS-DOS窗口,輸入 ping xxx.xxx.xxx.xxx -l 65500 -t就可以了!
網民:這樣有什么用?
大蝦甲:只要這樣做,白宮網站就進不去了。
網民:哦~~原來如此~~~這樣做是什么原理?高手可以解釋一下嗎?
大蝦甲:這個嘛……還是讓他來說吧!
大蝦乙:這個……這個……咳,總之別問這么多,照著做就是了,上頭說過好像是什么DOS攻擊吧,這樣做,白宮網站的服務器就會垮掉。
大蝦甲:總之到時候你們一起這樣做就可以了!10點準時開始,我們先去準備了!
網民:不懂……
不懂歸不懂,當晚10點,愛國的網民們一起用上面“高手”給出的命令開始了雄偉的“愛國反擊戰”——一場無聊的鬧劇!
他們這樣做是什么原理?那樣的“攻擊”有效嗎?要解釋這些,就要從ICMP協議說起。
一、什么是ICMP協議?
ICMP全稱Internet Control Message Protocol(網際控制信息協議)。提起ICMP,一些人可能會感到陌生,實際上,ICMP與我們息息相關。在網絡體系結構的各層次中,都需要控制,而不同的層次有不同的分工和控制內容,IP層的控制功能是最復雜的,主要負責差錯控制、擁塞控制等,任何控制都是建立在信息的基礎之上的,在基于IP數據報的網絡體系中,網關必須自己處理數據報的傳輸工作,而IP協議自身沒有內在機制來獲取差錯信息并處理。為了處理這些錯誤,TCP/IP設計了ICMP協議,當某個網關發現傳輸錯誤時,立即向信源主機發送ICMP報文,報告出錯信息,讓信源主機采取相應處理措施,它是一種差錯和控制報文協議,不僅用于傳輸差錯報文,還傳輸控制報文。
二、ICMP報文格式
ICMP報文包含在IP數據報中,屬于IP的一個用戶,IP頭部就在ICMP報文的前面,所以一個ICMP報文包括IP頭部、ICMP頭部和ICMP報文(見圖表,ICMP報文的結構和幾種常見的ICMP報文格式),IP頭部的Protocol值為1就說明這是一個ICMP報文,ICMP頭部中的類型(Type)域用于說明ICMP洪水攻擊報文的作用及格式,此外還有一個代碼(Code)域用于詳細說明某種ICMP報文的類型,所有數據都在ICMP頭部后面。RFC定義了13種ICMP報文格式,具體如下:
類型代碼 類型描述
0 響應應答(ECHO-REPLY)
3 不可到達
4 源抑制
5 重定向
8 響應請求(ECHO-REQUEST)
11 超時
12 參數失靈
13 時間戳請求
14 時間戳應答
15 信息請求(*已作廢)
16 信息應答(*已作廢)
17 地址掩碼請求
18 地址掩碼應答
其中代碼為15、16的信息報文已經作廢。
下面是幾種常見的ICMP報文:
1.響應請求
我們日常使用最多的ping,就是響應請求(Type=8)和應答(Type=0),一臺主機向一個節點發送一個Type=8的ICMP報文,如果途中沒有異常(例如被路由器丟棄、目標不回應ICMP或傳輸失敗),則目標返回Type=0的ICMP報文,說明這臺主機存在,更詳細的tracert通過計算ICMP報文通過的節點來確定主機與目標之間的網絡距離。
2.目標不可到達、源抑制和超時報文
這三種報文的格式是一樣的,目標不可到達報文(Type=3)在路由器或主機不能傳遞數據報時使用,例如我們要連接對方一個不存在的系統端口(端口號小于1024)時,將返回Type=3、Code=3的ICMP報文,它要告訴我們:“嘿,別連接了,我不在家的!”,常見的不可到達類型還有網絡不可到達(Code=0)、主機不可到達(Code=1)、協議不可到達(Code=2)等。源抑制則充當一個控制流量的角色,它通知主機減少數據報流量,由于ICMP沒有恢復傳輸的報文,所以只要停止該報文,主機就會逐漸恢復傳輸速率。最后,無連接方式網絡的問題就是數據報會丟失,或者長時間在網絡游蕩而找不到目標,或者擁塞導致主機在規定時間內無法重組數據報分段,這時就要觸發ICMP超時報文的產生。超時報文的代碼域有兩種取值:Code=0表示傳輸超時,Code=1表示重組分段超時。
3.時間戳
時間戳請求報文(Type=13)和時間戳應答報文(Type=14)用于測試兩臺主機之間數據報來回一次的傳輸時間。傳輸時,主機填充原始時間戳,接收方收到請求后填充接收時間戳后以Type=14的報文格式返回,發送方計算這個時間差。一些系統不響應這種報文。
三、回到正題:這樣的攻擊有效嗎?
在前面講過了,ping使用的是ECHO應答,不知道大家注意過沒有,ping的返回很慢,用NetXRAY抓包僅為1--5包/秒,這是為什么呢?事實上,ICMP本身并不慢(由于ICMP是SOCK_RAW產生的原始報文,速度比SOCK_STREAM的SYN和SOCK_DGRAM的UDP要快幾乎10倍!),這樣的速度是ping程序故意延遲的(為什么?M$可不想每個人都能用ping來干壞事),同樣,我測試過一些號稱“ping洪水”的程序,發現它們的效率和ping.exe沒什么兩樣,經過Dependency Walker查看程序調用的函數發現,他們用的是ICMP.dll提供的ICMPSendEcho這個API,這個函數是計算ECHO時間的,速度當然慢!而那兩個“高手”號召的ping攻擊實際上就是為了實現ICMP洪水攻擊,但是他們用的方法……想想洪水的速度和山澗小溪的速度相差多少吧!就用ping.exe和ICMPSendEcho這種小溪慢慢流淌的速度能做什么?還不是讓人家看笑話!這種攻擊根本就是浪費自己的時間!