IP分片是在网络上传输IP报文时常采用的一种技术手段,但是其中存在一些安全隐患。Ping of Death, teardrop等攻击可能导致某些系统在重组IP分片的过程中宕机或者重新启动。最近,一些IP分片攻击除了用于进行拒绝服务攻击之外,还经常用于躲避防火墙或者网络入侵检测系统的一种手段。部分路由器或者基于网络的入侵检测系统(NIDS),由于IP分片重组能力的欠缺,导致无法进行正常的过滤或者检测。在本文中将从 IP分片的基本概念介绍入手,详细探讨基于IP分片的攻击和迂回入侵检测系统所采用的一些手段。
IP分片的理解
IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。这一过程称为分片( fragmentation)。 IP 分片(Fragmentation)发生在要传输的IP报文大小超过最大传输单位MTU(Maximum Transmission Unit)的情况。比如说,在以太网(Ethernet)环境中可传输最大IP报文大小(MTU)为1500字节。如果要传输的报文大小超过1500字节,则需要分片之后进行传输。由此可以看出,IP分片在网络环境中是经常发生的事件。但是,如果经过人为的恶意操作的分片,将会导致拒绝服务攻击或者迂回路由器、防火墙或者网络入侵检测系统(NIDS)的一种攻击手段。
为到达目标主机之后能够正常重组,各分片报文具有如下信息:
* 各IP分片基于IP分片识别号进行重组,识别号相同的重组为相同的IP报文。IP分片识别号长度为16位,叫做“IP identification number”或者“fragment ID”。
* 各分片具有从原始报文进行分片之前的分片偏移量以确定其位置。
* 各分片具有分片数据长度,其中20字节IP包头不包含在该数据长度中。即,传输1500字节的数据时,实际数据长度为1480(1500-20)字节。
* 当每个分片之后还存在后续的分片时,该分片的ME(More Fragment)标志位为1。
为了更加深入地了解IP分片原理,下面观察一下4,000字节的 ICMP 数据传输时的分片情况。
首先发送4000字节的 ICMP数据。(通常 ping 报文传输大小为56字节的ICMP报文。为了测试,我们利用 -s 选项发送4000字节的 ICMP报文以便发生分片。)
[root@linux /root]# ping -s 4000 192.168.0.25
PING 192.168.0.25 (192.168.0.25): 4000 data bytes
4008 bytes from 192.168.0.25: icmp_seq=0 ttl=254 time=20.7 ms
4008 bytes from 192.168.0.25: icmp_seq=1 ttl=254 time=20.1 ms
利用 tcpdump 进行抓包分析结果如下。
20:55:56.548630 linux.test.com >
test.com.cn: (frag 30338:1048@2960)
20:55:56.558095 linux.test.com >
test.com.cn: (frag 30338:1480@1480+)
20:55:56.565466 linux.test.com >
test.com.cn: icmp: echo request (frag 30338:1480@0+)
传输之前的数据报文长度为20字节,IP报头+ 8字节,ICMP报头+ 4000字节,ICMP之和为4028字节。由于数据长度超过以太网的MTU 1500字节,因此必须进行分片传输。上图是通过以太网传输的3个分片的情况。