1、引言
1.1、ICMP簡介
IP 協議本身沒有提供直接的方法來發現那些發往目的地址失敗的IP 數據包。
此外, IP 沒有提供直接的方式來獲取診斷信息(例如哪些路由器在沿途中被使用了或使用一種方法來估計往返時間)。
爲了解決這些不足之處,將一個特殊的 Internet 控制報文協議( Internet Control Message Protocol,ICMP)[RFC0792][RFC4443]與IP 結合使用,以便提供與IP 協議層配置和IP 數據包處置相關的診斷和控制信息。
ICMP 通常被認爲是IP 層的部分,它需要在所有IP 實現中存在。它使用IP 協議進行傳輸。因此,確切地說,它既不是一個網絡層協議,也不是一個傳輸層協議,而是位於兩者之間。
ICMP報文可以分類兩類:
ICMP報文通常由IP層本身、上層的傳輸協議(例如TCP或UDP),甚至是用戶應用觸發的。
ICMP並不爲IP網絡提供可靠性,它只是表明某些類別的故障和配置信息,最常見的丟包(路由器緩衝區溢出)並不會觸發任何ICMP信息。
鑑於此,黑客們已經在大量攻擊中使用ICMP報文。由於擔心這種攻擊,網絡管理員通常會使用防火牆封堵ICMP報文,特別是在邊界路由器上。如果ICMP被封鎖,大量的診斷程序(例如ping, traceroute)將無法正常工作。
1.2、ICMP報文格式
ICMP報文封裝在IP數據報內
IPv4協議中,協議字段=1
IPV6協議中,下一個頭部字段=58
ICMP頭部=類型+代碼+檢驗和組成
ICMP類型不同,ICMP數據格式不同
2、ICMP報文
2.1、ICMPv4類型
信息類報文: 回顯請求(8)和回顯應答(0);路由器通告(9)和路由器請求(10)等
差錯報文: 目的不可達(3)、重定向(5)、超時(11)、參數問題(12)
2.2、ICMPv6類型
ICMPv6不僅有差錯和信息類報文,還負責IPv6路由器和主機的配置
ICMPv6差錯報文類型字段(0~127),信息類報文類型爲128~255
2.3、報文處理
信息類請求將被操作系統自動處理,差錯類報文傳遞給用戶進程或傳輸層協議。
例外情況是:
重定向報文導致主機路由表自動更新
目的不可達—需要分片報文,用於路徑MTU發現機制
ICMPv6對報文處理更加嚴格:
2.4、限制規則
目的:
限制生成ICMP差錯報文的原因是防止出現廣播風暴。
ICMPv4限制規則:
ICMPv6限制規則:
3、ICMP差錯報文
3.1、總體流量水平規則
除了控制產生ICMP報文條件的規則,還有限制總體流量水平規則。一種推薦的方法是令牌桶。
隨着時間流逝,系統會按恆定1/QPS時間間隔(如果QPS=100,則間隔是10ms)往桶裏加入Token(想象和漏洞漏水相反,有個水龍頭在不斷的加水),如果桶已經滿了就不再加了.新請求來臨時,會各自拿走一個Token,如果沒有Token可拿了就阻塞或者拒絕服務.
令牌桶的另外一個好處是可以方便的改變速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率. 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種算法則實時的計算應該增加的令牌的數量.
3.2、ICMP差錯報文數據包組成
包含一個完整的源自原始數據報的IP頭部副本,再加上原始數據報的IP有效載荷區中的任何其他數據,同時保證生產恆的IP/ICMP數據報的大小不超過特定值(IPV4:576字節,IPV6最小的MTU,至少1280字節)
擴展的ICMP和多部報文
擴展結構用於ICMPv4的目的不可達、超時、參數問題報文,以及ICMPv6的不可達和超時報文。
通過在ICMP報文的尾部追加擴展數據結構的方法,擴展包括一個擴展頭部和對象數據
ICMPv4頭部的第6字節和ICMPv6頭部的第5字節用來表示長度字段
3.3、ICMPv4主機不可達(1)和ICMPv6地址不可達(3):
由路由器或者主機產生,出現在當它被要求使用直接交付方法發送一個IP數據報到一個主機,但由於某些原因無法到達目的地。例如當最後一跳路由器試圖發送一個ARP請求到已經不再或者關閉的主機時。
ICMPv6目的無路由(代碼0)
ICMPv4管理禁止通信(代碼3)和ICMPv6目的管理禁止通信(代碼1)
ICMPv4端口不可達(代碼3)和ICMPv6端口不可達(代碼4)
結合traceroute命令分析
ICMPv4 PTB
數據大於選定的傳出網絡接口的MTU,則需要分片。如果到達的數據包在IP頭部中設置了不分片(Don’t Fragement)字段,此時產生不可達PTB報文。已經用來作爲MTU發現
ICMPv6 PTB
ICMPv6超出源地址範圍
ICMPv6源地址失敗進/出策略
ICMOv6拒絕路由到目的地
重定向(ICMPv4(5)/ICMPv6(137))
ICMP超時(ICMPv4(11)/ICMPv6(3))
結合traceroute命令分析
參數問題(ICMPv4(12)/ICMPv6(4))
3.4.、traceroute的原理
Traceroute命令利用了”TTL超時”以及“端口不可達”的報文。
它發送的用於探測網絡路徑的數據包的IP之上的協議可以是 UDP、TCP或ICMP。不同模式下,探測過程中設計的數據包如下:
3.5、traceroute詳細過程
5.第2個路由器會像第1個路由器一樣,拋棄這個數據包,並像第1個路由器那樣返回一個ICMP消息。
6.該過程會一直持續,traceroute命令不停遞增TTL值,而傳輸路徑上的路由器不斷遞減該值,直到數據報最終抵達預期的目的地。
7.當目的計算機接收到ICMP Echo消息時,會回傳一個ICMP Echo Reply消息地址掩碼請求/應答(17/18)、時間戳請求/應答(13/14)、信息請求/應答(15/16)等已經不再使用。
3.6、回顯請求/應答
回顯請求/應答(ICMPv48/0 ICMPv6128/129)
4、ICMP查詢/信息類報文
4、ICMP查詢/信息類報文
本地代理地址發現請求/應答(ICMPv6 144/145)
發現本地代理
移動前綴請求、通告(ICMPv6 146/147)
用來通知一個移動中的節點其本身前綴已經改變了,一般使用Ipsec保護,防止假冒前綴通告的欺騙
移動IPv6快速切換報文(ICMPv6 154)
當一個移動節點從一個網絡的接入點(AP)移動到另一個是,改善IP切換延遲
組播偵聽查詢/報告/完成(ICMPv6 130/131/132)
版本2組播偵聽發現(ICMPv6 143)
組播路由器發現(IGMP 48/49/50 ICMPv6151/152/153)
5、IPv6中的鄰居發現
NDP(Neighbor Discovery Protocol,鄰居發現協議)是IPv6的一個關鍵協議,它組合了IPv4中的ARP、ICMP路由器發現和ICMP重定向等協議,並對它們作了改進。作爲IPv6的基礎性協議,NDP還提供了前綴發現、鄰居不可達檢測、重複地址監測、地址自動配置等功能。
5.1、路由器請求/通告(133/134)
路由器週期發送RA(route advertisement)消息。每臺設備爲了讓二層網絡上的主機和設備知道自己的存在,定時都會組播發送RA報文,RA報文中會帶有網絡前綴信息,及其他一些標誌位信息。
主機發送RS(route solicitation),路由器迴應RA(route advertisement)。 很多情況下主機接入網絡後希望儘快獲取網絡前綴進行通信,此時主機可以立刻發送RS報文,網絡上的設備將回應RA報文。主機收到包含路由信息的RA報文後,會更新自己的路由表。當主機向其他設備發送報文時,通過查詢該列表的路由信息,選擇合適的路由發送報文
5.2、鄰居請求/通告(135/136)
取代了IPv4的ARP(地址解析協議),主要目的是將IPv6地址轉換爲鏈路層地址,鄰居請求NS(neighbor solicitation),鄰居通告NA(neighbor advertisement)。
主機A發給主機B的報文爲組播報文,主機B發給主機A的是單播報文,其他無關的路由器是不會迴應的。
過程可以這樣描述:
主機A:誰叫李法拉?你住在哪裏?
主機B: 我叫李法拉,住在MAC地址的xxxxx。
主機C: 不是叫我,不管他。
5.3、鄰居不可達檢測(Neighbor Unreachable Detection)
檢測同一個鏈路上的兩個系統什麼時候丟失了或者變得非對稱了。
1、未完成(Incomplete,還有沒有票?不知道啊)。表示正在解析地址,但鄰居鏈路層地址尚未確定。
2、可達(Reachable,我就是今天的票!)表示地址解析成功,該鄰居可達。
3、陳舊(Stale,我的這張舊船票還能登上你的破船嗎?)表示可達時間耗盡,未確定鄰居是否可達。
4、延遲(Delay,破船到底還有沒有?),表示未確定鄰居是否可達。DELAY狀態不是一個穩定的狀態,而是一個延時等待狀態。
5、探查(Probe,這張票還能用嗎?能到xx地方嗎?),節點會向處於PROBE狀態的鄰居持續發送NS報文。
Empty表示鄰居表項爲空。
5.4、鄰居不可達檢測狀態轉換
① 在EMPTY狀態時,如果有報文要發送給鄰接節點,則在本地鄰居緩存表建立該鄰接節點的表項,並將該表項置於INCOMPLETE狀態,同時向鄰接節點以組播方式發送NS報文。
② 節點收到鄰居迴應的單播NA報文後,將處於INCOMPLETE狀態的鄰居緩存表項轉化爲REACHABLE狀態。如果地址解析失敗(發出的組播NS超時),則刪除該表項。
③ 處於REACHABLE狀態的表項,如果在REACHABLE_TIME時間內沒有收到關於該鄰居的“可達性證實信息”,則進入STALE狀態。此外,如果該節點收到鄰居節點發出的非S置位NA報文,並且鏈路層地址有變化,相關表項會進入STALE狀態。
④ 處於STALE狀態的表項,當有報文發往該鄰居時,這個報文會利用緩存的鏈路層地址進行封裝,並使該表項進入DELAY狀態,等待收到“可達性證實信息”。
⑤ 進入DELAY狀態後,如果DELAY_FIRST_PROBE_TIME時間之內還未收到關於該鄰居的“可達性證實信息”,則該表項進入PROBE狀態。
⑥ 在PROBE狀態時,節點會週期性地用NS報文來探測鄰居的可達性,探測最大時間間隔爲RETRANS_TIMER,在最多嘗試MAX_ UNICAST_SOLICIT次後,如果仍未收到鄰居迴應的NA報文,則認爲該鄰居已不可達,該表項將被刪除。
5.5、重複地址檢測DAD(Duplicate Address Detect)
是在接口使用某個IPv6單播地址之前進行的,主要是爲了探測是否有其它的節點使用了該地址。尤其是在地址自動配置的時候,進行DAD檢測是很必要的。
DAD機制通過NS和NA報文實現。
節點會發送NS報文(有人叫張拉拉嗎?),其源地址爲未指定地址,目的地址爲接口配置的IPv6地址。
如果收到自己的報文(聽到自己的迴音,奧,自己的聲音不管他),直接忽略。
在NS報文發送到鏈路上後,如果在規定時間內沒有收到應答的NA報文,則認爲這個單播地址在鏈路上是唯一的,可以分配給接口(好了,我就叫張拉拉了);
反之,如果收到應答的NA報文(一個響亮的聲音回來,我就叫張拉拉!呀丫丫,有人和我同名啊,算了,改個名字吧),則表明這個地址已經被其他節點所使用,不能配置到接口。
5.6、重定向功能
當網關路由器發現更好的報文轉發路徑時候,會用重定向報文告訴主機
主機H1要發送數據到網絡N2,經過路由器R1,由R1再轉發到到R2。
但路由器R1發現R2和它是同一網段,並且R2是直接連接着網絡N2,這時候路由器R1就發送重定向報文(ND redirect)告訴主機H1,以後再給網絡N2的報文就直接給R2好了,別那麼繞彎子,費勁!
在重定向功能中,只有主機纔會處理重定向報文。在圖例中,H1會更新自己的路由表,下次再發送到N2的報文便會直接轉發到R2。
6、ICMPv4和ICMPv6轉換
信息報文只有回顯請求(8->128)和回顯響應(0->129)轉換了。
差錯報文只有目的不可達(3)、超時(11)、參數問題(12)轉換了
7、與ICMP相關的攻擊
7.1、與ICMP相關的攻擊
主要有3類:泛洪(flood)、炸彈(bomb)和信息泄露(information disclosure)
泛洪會造成大量流量,導致針對一臺或多臺計算機的有效的Dos攻擊。
炸彈指的是發送經過特殊構造的報文,能夠導致IP或者ICMP的處理崩潰或者終止。
信息泄露本身並不會造成傷害,但是能夠保住其他攻擊方法避免浪費時間或者被發現。
Smurf攻擊:
一種早期的ICMP攻擊,源IP設爲受害者IP,目的地址設爲廣播地址,導致大量計算機響應,造成Dos攻擊,這種攻擊只需要在防火牆邊界禁止傳入的廣播流量即可處理。
Ping of Death攻擊:
採用ICMPv4回顯請求/應答報文構建數據包分片,當他們重組時形成一個過大的數據報(大於最大值64KB),導致某些系統崩潰,形成另一種形式的Dos攻擊
Land攻擊:
將源地址和目的地址均設爲受害者IP,收到這種報文時,有些實現有問題。
7.2、利用ICMP重定向功能
ICMP重定向功能可能導致終端使用一個錯誤的系統作爲下一跳路由。可以沿着流量流插入一箇中間人進行記錄分析,修改導致不想要的動作。還可能會使受害者認爲自身就是到達目的地址的最優網關,導致無線循環,間接鎖定受害者的主機。
利用路由器通告和路由器請求報文
路由器通告和路由器請求報文能被用於創建類似重定向攻擊,導致受害者修改他們的默認路由;被動接受這些報文可以使攻擊者瞭解本地網絡環境的拓撲結構。
使用ICMP作爲入侵程序的通信通道,協調一組合作病毒的行動。
Smack或Bloop攻擊:
ICMP目的不可達報文可造成現有連接的拒絕服務。
利用ICMP時間戳請求/應答報文
ICMP時間戳請求/應答報文能夠獲取主機的當前時間,進而預測與時間相關的僞隨機序列。
利用PTB報文
PTB報文包含推薦MTU值的字段,攻擊者修改這個值強制中斷使用非常小的數據包運行,導致性能低下。
如果沒有加密,欺騙或者僞裝攻擊仍然可能,使用加密方法的協議提供更高水平的安全性,但部署複雜,出問題時分析複雜。
8、參考文獻
https://baijiahao.baidu.com/s?id=1609424059183543390&wfr=spider&for=pc
https://wenku.baidu.com/view/e6eff8660b4e767f5bcfce16.html
https://blog.csdn.net/zzucsliang/article/details/41407387
https://www.jianshu.com/p/75a5822d0eec
https://www.cnblogs.com/reaperhero/articles/10066611.html
感謝langgy