全部博文(297)
分类: LINUX
2007-07-23 17:29:51
IP首部包含了分片和重组所需的信息:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |R|DF|MF| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|<-------------16-------------->|<--3-->|<---------13---------->|
Identification:发送端发送的IP数据包标识字段都是一个唯一值,该值在分片时被复制到
每个片中。R:保留未用。DF:Don't Fragment,“不分片”位,如果将这一比特置1 ,IP层将不对数据报进行分片。MF:More Fragment,“更多的片”,除了最后一片外,其他每个组成数据报的片都要把比特
置1。Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。
另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。
每一IP分片都各自路由,到达目的主机后在IP层重组,请放心,首部中的数据能够正确完成
分片的重组。你不禁要问,既然分片可以被重组,那么所谓的碎片攻击是如何产生的呢?
2. IP碎片攻击
-=-=-=-=-=-=-=-=-=-=-=
IP首部有两个字节表示整个IP数据包的长度,所以IP数据包最长只能为0xFFFF,就是65535字节。如果有意发送总长度超过65535的IP碎片,一些老的系统内核在处理的时候就会出现问题,导致崩溃或者拒绝服务。另外,如果分片之间偏移量经过精心构造,一些系统就无法处理,导致死机。所以说,漏洞的起因是出在重组算法上。下面我们逐个分析一些著名的碎片攻
击程序,来了解如何人为制造IP碎片来攻击系统。
3. 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 字串7
不走运,看来Linux自带的ping不允许我们做坏事。
顺便提一下,记得99年有“爱国主义黑客”(“红客”的前辈)发动全国网民在某一时刻开
始ping某美国站点,试图ping死远程服务器。这其实是一种ping flood攻击,用大量的Echo
Request包减慢主机的响应速度和阻塞目标网络,原理和ping o' death是不一样的,这点要
分清楚。
4. jolt2
-=-=-=-=-=-=-=-=-=-=-=
jolt2.c是在一个死循环中不停的发送一个ICMP/UDP的IP碎片,可以使Windows系统的机器死锁。我测试了没打SP的Windows 2000,CPU利用率会立即上升到100%,鼠标无法移动。我们用Snort分别抓取采用ICMP和UDP协议发送的数据包。
jolt2的影响相当大,通过不停的发送这个偏移量很大的数据包,不仅死锁未打补丁的Windo
ws系统,同时也大大增加了网络流量。曾经有人利用jolt2模拟网络流量,测试IDS在高负载
流量下的攻击检测效率,就是利用这个特性。 字串8
5. teardrop
-=-=-=-=-=-=-=-=-=-=-=
teardrop也比较简单,默认发送两个UDP数据包,就能使某些Linux内核崩溃。Snort抓取的结
果如下: 字串3
第一个:
01/08-11:42:21.985853 192.168.0.9 -> 192.168.0.1
UDP TTL:64 TOS:0x0 ID:242 IpLen:20 DgmLen:56 MF
Frag Offset: 0x0 Frag Size: 0x24
A0 A8 86 C7 00 24 00 00 00 00 00 00 00 00 00 00 .....$..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 .... 字串7
* MF=1,偏移量=0,分片IP包的第一个。
* 结构图:
|<-------20-------->|<------8------>|<---------------28---------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP | UDP | Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|<-------20-------->|<--4-->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP | Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
如果修改源代码,第二片IP包的偏移量也可以为0x4,偏移字节数就是 0x4 * 8 = 32。 字
下面的结构图表示了接收端重组分片的过程,分别对应于偏移字节数为24和32两种情况:
|<-------20-------->|<------8------>|<---------------28---------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP | UDP | Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| +-+-+-+-+
|<------------- 24 ------------->| Data |
| +-+-+-+-+
|<--4-->| 字串9
|
| +-+-+-+-+
|<------------------- 32 ------------------>| Data |
| +-+-+-+-+
|<--4-->| 字串9
可以看出,第二片IP包的偏移量小于第一片结束的位移,而且算上第二片IP包的Data,也未
超过第一片的尾部,这就是重叠现象(overlap)。老的Linux内核(1.x - 2.0.x)在处理这种重叠分片的时候存在问题,WinNT/95在接收到10至50个teardrop分片时也会崩溃。你可以阅读teardrop.c的源代码来了解如何构造并发送这种数据包。
6. 如何阻止IP碎片攻击
-=-=-=-=-=-=-=-=-=-=-=
* Windows系统请打上最新的Service Pack,目前的Linux内核已经不受影响。
* 如果可能,在网络边界上禁止碎片包通过,或者用iptables限制每秒通过碎片包的数目。
* 如果防火墙有重组碎片的功能,请确保自身的算法没有问题,否则被DoS就会影响整个络。
* Win2K系统中,自定义IP安全策略,设置“碎片检查”。 字串5
7. 更多资料
-=-=-=-=-=-=-=-=-=-=-=
[1] TCP/IP Illustracted Volume 1 : The Protocols
[2] Microsoft Security Bulletin MS00-029:
http://www.microsoft.com/technet/security/bulletin/ms00-029.asp
[3] BugTraq Mailing List, "Analysis of jolt2.c(MS00-029)":
http://www.securityfocus.com/archive/1/62011
[4] http://www.attrition.org/security/denial/w/teardrop.dos.html
[5] http://packetstormsecurity.org/0005-exploits/jolt2.c
[6] http://packetstormsecurity.org/Exploit_Code_Archive/teardrop.c