IP碎片原理,***和防護


爲了加深理解IP協議和一些DoS***手段大家有必要看看以下內容,也許對你理解這個概念有所幫助.先來看看IP碎片是如何產生的吧.
      一.IP碎片是如何產生的
      鏈路層具有最大傳輸單元MTU這個特性,它限制了數據幀的最大長度,不同的網絡類型都有一個上限值。以太網的MTU是1500,你可以用 netstat -i 命令查看這個值。如果IP層有數據包要傳,而且數據包的長度超過了MTU,那麼IP層就要對數據包進行分片(fragmentation)操作,使每一片的長度都小於或等於MTU。我們假設要傳輸一個UDP數據包,以太網的MTU爲1500字節,一般IP首部爲20字節,UDP首部爲8字節,數據的淨荷(payload)部分預留是1500-20-8=1472字節。如果數據部分大於1472字節,就會出現分片現象。
      IP首部包含了分片和重組所需的信息: 
      | Identification |R|DF|MF| Fragment Offset |
      |<-16>|<3>|<-13>|
      參數解釋:
      Identification:發送端發送的IP數據包標識字段都是一個唯一值,該值在分片時被複制到每個片中。
      R:保留未用。
      DF:Dont Fragment,“不分片”位,如果將這一比特置1 ,IP層將不對數據報進行分片。
      MF:More Fragment,“更多的分片”,除了最後一片外,其他每個組成數據報的片都要把該比特置爲1。
      Fragment Offset:該片偏移原始數據包開始處的位置。偏移的字節數是該值乘以8。
      瞭解了分片,也分析了IP頭的一些信息,讓我們看看IP碎片是怎樣運用在網絡***上的.
      二. IP碎片***
      IP首部有兩個字節表示整個IP數據包的長度,所以IP數據包最長只能爲0xFFFF,就是65535字節。如果有意發送總長度超過65535 的IP碎片,一些老的系統內核在處理的時候就會出現問題,導致崩潰或者拒絕服務。另外,如果分片之間偏移量經過精心構造,一些系統就無法處理,導致死機。所以說,漏洞的起因是出在重組算法上。下面我們逐個分析一些著名的碎片***程序,來了解如何人爲製造IP碎片來***系統。
      1. ***方式之ping o death
      ping o death是利用ICMP協議的一種碎片***。***者發送一個長度超過65535的Echo Request數據包,目標主機在重組分片的時候會造成事先分配的65535字節緩衝區溢出,系統通常會崩潰或掛起。ping不就是發送ICMP Echo Request數據包的嗎?讓我們嘗試***一下吧!不管IP和ICMP首部長度了,數據長度反正是×××,就65535吧,發送一個包:
      # ping -c 1 -s 65535 192.168.0.1
      Error: packet size 65535 is too large. Maximum is 65507
      一般來說,Linux自帶的ping是不允許我們做這個壞事的。
      65507是它計算好的:65535-20-8=65507。Win2K下的ping更摳門,數據只允許65500大小。所以你必須找另外的程序來發包,但是目前新版本的操作系統已經搞定這個缺陷了,所以你還是繼續往下閱讀本文吧。
      2. ***方式之jolt2
      jolt2.c是在一個死循環中不停的發送一個ICMP/UDP的IP碎片,可以使Windows系統的機器死鎖。我測試了沒打SP的Windows 2000,CPU利用率會立即上升到100%,鼠標無法移動。
      我們用Snort分別抓取採用ICMP和UDP協議發送的數據包。
      發送的ICMP包:
      01/07-15:33:26.974096 192.168.0.9 -> 192.168.0.1
      ICMP TTL:255 TOS:0x0 ID:1109 IpLen:20 DgmLen:29
      Frag Offset: 0x1FFE Frag Size: 0x9
      08 00 00 00 00 00 00 00 00 .........
      發送的UDP包:
      01/10-14:21:00.298282 192.168.0.9 -> 192.168.0.1
      UDP TTL:255 TOS:0x0 ID:1109 IpLen:20 DgmLen:29
      Frag Offset: 0x1FFE Frag Size: 0x9
      04 D3 04 D2 00 09 00 00 61 ........a
    從上面的結果可以看出:
     分片標誌位MF=0,說明是最後一個分片。
     偏移量爲0x1FFE,計算重組後的長度爲 (0x1FFE * 8) + 29 = 65549 > 65535,溢出。
     IP包的ID爲1109,可以作爲IDS檢測的一個特徵。
     ICMP包:
     類型爲8、代碼爲0,是Echo Request;
     校驗和爲0x0000,程序沒有計算校驗,所以確切的說這個ICMP包是非法的。
     UDP包:
     目的端口由用戶在命令參數中指定;
     源端口是目的端口和1235進行OR的結果;
     校驗和爲0x0000,和ICMP的一樣,沒有計算,非法的UDP。
     淨荷部分只有一個字符a。
     jolt2.c應該可以僞造源IP地址,但是源程序中並沒有把用戶試圖僞裝的IP地址賦值給src_addr,不知道作者是不是故意的。
     jolt2的影響相當大,通過不停的發送這個偏移量很大的數據包,不僅死鎖未打補丁的Windows系統,同時也大大增加了網絡流量。曾經有人利用jolt2模擬網絡流量,測試IDS在高負載流量下的***檢測效率,就是利用這個特性。
    
     三. 如何阻止IP碎片***
     Windows系統請打上最新的Service Pack,目前的Linux內核已經不受影響。如果可能,在網絡邊界上禁止碎片包通過,或者用iptables限制每秒通過碎片包的數目。如果防火牆有重組碎片的功能,請確保自身的算法沒有問題,否則被DoS就會影響整個網絡。Win2K系統中,自定義IP安全策略,設置“碎片檢查”。
     在很多路由上也有" IP 碎片(Fragment) ***防禦"的設置,網絡規模在150臺左右,建議IP碎片值設置在:3000包/秒,在海蜘蛛路由上測試過,如果 IP碎片值設置過小有些私服遊戲網站打不開.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章