找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2550|回复: 0

IP碎片原理,攻击和防护

[复制链接]
发表于 2008-11-13 16:25:13 | 显示全部楼层 |阅读模式
为了加深理解IP协议和一些DoS攻击手段大家有必要看看以下内容,也许对你理解这个概念有所帮助.先来看看IP碎片是如何产生的吧.
/ l8 K) o: t7 ^- _9 F  R; \) \' _) Y1 E      一.IP碎片是如何产生的
3 M; ~6 ~. o; n' o: w/ Q' L      链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -e命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。 * ]2 m0 Z3 b4 k) O! L7 @/ h/ z$ S$ F
      IP首部包含了分片和重组所需的信息:  
$ d& c6 W& Z/ M, J" D: a      | Identification |R|DF|MF| Fragment Offset |
+ Y0 Y' H1 e+ b# l7 i      |<-16>|<3>|<-13>|+ A3 g1 p- U  k2 l: g% ?1 i
      参数解释:
0 G% T% g( h& i% ]5 y5 E; U4 Z, x$ M      Identification:发送端发送的IP数据包标识字段都是一个唯一值,该值在分片时被复制到每个片中。 6 A" G, L9 @$ F" O, N
      R:保留未用。
# p% k2 ~: O* g" h      DF:Dont Fragment,“不分片”位,如果将这一比特置1 ,IP层将不对数据报进行分片。 # c5 c8 ~! a% L4 H
      MF:More Fragment,“更多的分片”,除了最后一片外,其他每个组成数据报的片都要把该比特置为1。
0 x+ Z: e% h" U, O7 V( k( S( t8 k0 n      Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。 0 ^% c; R- Z4 ~6 @
      了解了分片,也分析了IP头的一些信息,让我们看看IP碎片是怎样运用在网络攻击上的.) q  ?; w2 g+ e( T+ R+ d

% O, ^& v# L. H, H+ D      二. IP碎片攻击
5 w( C7 l! e; ^) X! E3 v8 m# o6 q      IP首部有两个字节表示整个IP数据包的长度,所以IP数据包最长只能为0xFFFF,就是65535字节。如果有意发送总长度超过65535 的IP碎片,一些老的系统内核在处理的时候就会出现问题,导致崩溃或者拒绝服务。另外,如果分片之间偏移量经过精心构造,一些系统就无法处理,导致死机。所以说,漏洞的起因是出在重组算法上。下面我们逐个分析一些著名的碎片攻击程序,来了解如何人为制造IP碎片来攻击系统。& K! d( i  m, o' W1 ~0 h
- a2 G% l& ~+ L* j/ a
      1. 攻击方式之ping o death
$ S; i6 H$ _, F  L" o      ping o death是利用ICMP协议的一种碎片攻击。攻击者发送一个长度超过65535的Echo Request数据包,目标主机在重组分片的时候会造成事先分配的65535字节缓冲区溢出,系统通常会崩溃或挂起。ping不就是发送ICMP Echo Request数据包的吗?让我们尝试攻击一下吧!不管IP和ICMP首部长度了,数据长度反正是多多益善,就65535吧,发送一个包:
# v, i) p8 o+ T' ]0 a      # ping -c 1 -s 65535 192.168.0.1 2 K; D" ~8 z6 K7 O2 ~8 }6 |2 K) W
      Error: packet size 65535 is too large. Maximum is 65507 2 _+ k" f" m0 a3 }6 }3 W; a$ j( Q+ V
      一般来说,Linux自带的ping是不允许我们做这个坏事的。# }6 z/ t* _! R& t* q& u& U
      65507是它计算好的:65535-20-8=65507。Win2K下的ping更抠门,数据只允许65500大小。所以你必须找另外的程序来发包,但是目前新版本的操作系统已经搞定这个缺陷了,所以你还是继续往下阅读本文吧。 . c4 M& D/ W( Q

; b+ f% [. l; i9 y, @      2. 攻击方式之jolt2 ( H0 l% [5 K! B
      jolt2.c是在一个死循环中不停的发送一个ICMP/UDP的IP碎片,可以使Windows系统的机器死锁。我测试了没打SP的Windows 2000,CPU利用率会立即上升到100%,鼠标无法移动。   K, z0 a" U6 L/ Y4 H) G4 R
      我们用Snort分别抓取采用ICMP和UDP协议发送的数据包。 9 k+ {* B6 [& L
      发送的ICMP包: 6 E! j3 E& X& s' @1 g0 Z
      01/07-15:33:26.974096 192.168.0.9 -> 192.168.0.1
9 s7 y; D6 P% b      ICMP TTL:255 TOS:0x0 ID:1109 IpLen:20 DgmLen:29
$ r  ^4 P7 M5 J! b8 J( W( o7 q& B      Frag Offset: 0x1FFE Frag Size: 0x9
0 \- W* O; ?% n& O. a      08 00 00 00 00 00 00 00 00 .........
  {, [! M- ~2 U/ q' y) B* }1 K      发送的UDP包: : ?+ {& c( _5 h9 O* {  H' R, H
      01/10-14:21:00.298282 192.168.0.9 -> 192.168.0.1 - D% K$ e/ g  h# }' c
      UDP TTL:255 TOS:0x0 ID:1109 IpLen:20 DgmLen:29 5 K4 F* v& ^  `- j0 s
      Frag Offset: 0x1FFE Frag Size: 0x9 1 \% Q5 P0 P4 A/ [& G3 y
      04 D3 04 D2 00 09 00 00 61 ........a
" D  w9 M& E/ F% S1 \6 x$ j2 A5 }    从上面的结果可以看出:
! d) z7 J: x0 W- O# f     分片标志位MF=0,说明是最后一个分片。 * {" p7 Q; D( o; E, g: ~6 Y: C
     偏移量为0x1FFE,计算重组后的长度为 (0x1FFE * 8) + 29 = 65549 > 65535,溢出。 7 F" ]* a/ Z! @0 ~! ?
     IP包的ID为1109,可以作为IDS检测的一个特征。 . z8 h% F, C9 l* _2 l! P8 p! k/ j
     ICMP包:
( u* c1 N# K: l# |& i$ T     类型为8、代码为0,是Echo Request; ( k( ?  s5 K% q& e
     校验和为0x0000,程序没有计算校验,所以确切的说这个ICMP包是非法的。
4 }+ t, n( s; |" w; q9 k, F) x( G     UDP包:
: }5 L/ u$ V( o, Y' P8 D0 z     目的端口由用户在命令参数中指定; 3 H5 l6 |. N/ c6 `- o" c
     源端口是目的端口和1235进行OR的结果; $ k7 k! R4 X2 v; M- l7 c9 ]
     校验和为0x0000,和ICMP的一样,没有计算,非法的UDP。 ! w8 h# E, S( S$ d, {5 j* A
     净荷部分只有一个字符a。
2 w* F& G$ h3 o     jolt2.c应该可以伪造源IP地址,但是源程序中并没有把用户试图伪装的IP地址赋值给src_addr,不知道作者是不是故意的。
1 Q+ N; H( A6 ?) ]: k& \( K6 \     jolt2的影响相当大,通过不停的发送这个偏移量很大的数据包,不仅死锁未打补丁的Windows系统,同时也大大增加了网络流量。曾经有人利用jolt2模拟网络流量,测试IDS在高负载流量下的攻击检测效率,就是利用这个特性。
* l1 J3 W7 `, @! ]: D$ i  D8 J     
3 K4 T) s; F5 v8 B5 ~5 N     三. 如何阻止IP碎片攻击 . p4 z6 r: ?" V; z; m
     Windows系统请打上最新的Service Pack,目前的Linux内核已经不受影响。如果可能,在网络边界上禁止碎片包通过,或者用iptables限制每秒通过碎片包的数目。如果防火墙有重组碎片的功能,请确保自身的算法没有问题,否则被DoS就会影响整个网络。Win2K系统中,自定义IP安全策略,设置“碎片检查”。
4 L. [( Q7 i" ^' A     在很多路由上也有" IP 碎片(Fragment) 攻击防御"的设置,网络规模在150台左右,建议IP碎片值设置在:3000包/秒,在海蜘蛛路由上测试过,如果 IP碎片值设置过小有些私服游戏网站打不开.
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|宽带技术网 |网站地图 粤公网安备44152102000001号

GMT+8, 2025-5-8 04:14 , Processed in 0.020503 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表