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
个分片的情况。
上一篇《基于
IP
分片的攻击方法(一)》讲了
IP
分片的理解。本文就通过
Tcpdump
进行监听并分析分片的整个过程和基于分片的攻击技术做讨论。
下面通过
Tcpdump
进行监听并分析分片的整个过程。
首先第一个分片中包含
20
字节的
IP
报头和
8
字节的
ICMP
报头及
1472(=1500-20-8)
字节的
ICMP
数据。
其中
IP
报头中包含如下内容。
Protocol = ICMP
Fragment ID = 30338
More Fragments Flag = 1
Fragment Offset = 0
Data Length = 1480
下面由
tcpdump
监听到的分片内容中,
30338
代表
fragment ID
。
1480
代表数据长度,
0
代表分片偏移量,
+
代表
MF
标志位为
1
。
20:55:56.565466 linux.test.com > test.com.cn: icmp: echo request (frag 30338:1480@0+)
IP
报头中封装的数据可能为
TCP
、
UDP
或者
ICMP
等
IP
协议数据。在这里发送的是
ICMP
报文,通过
tcpdump
中监听到的
ICMP
报头信息中可以看出该报文为
ICMP echo request
报文。
第二个分片由
20
字节的
IP
报头和
1480
字节的
ICMP
数据组成。所有的分片中都包含
20
字节的
IP
报头,第二个分片的
IP
报头中包含如下信息。
Protocol = ICMP
Fragment ID = 30338
More Fragments Flag = 1
Fragment Offset = 1480
Data Length = 1480
可以看出该分片的偏移量为
1480
,但是不包含
ICMP
报头,因此无法获知
ICMP
报文类型。
从
tcpdump
监听到的数据中可以看出,除了第一个分片中包含
"ICMP echo request"
报文类型之外,后续的分片中看不到相应的报文类型。对于
TCP
及
UDP
数据也存在类似的情况。只有第一个分片中包含
TCP
、
UDP
及
ICMP
报头,因此对于数据包过滤设备来说,可能只阻断第一个分片,因此需要根据分片
ID
来维持各会话的状态。智能的包过滤系统可以阻断含有相同分片识别号的所有数据包。
最后一个分片由
20
字节的
IP
报头和剩余的
ICMP
数据组成。相应的
IP
报头中包含如下信息。
Protocol = ICMP
Fragment ID = 30338
More Fragments Flag = 0
Fragment Offset = 2960
Data Length = 1048
因为不存在后续的分片,因此
MF
标志位为
0
。
我们观察了一下
4000
字节的
ICMP
数据传输时,分片的整个过程。
基于分片的攻击技术
如上所述,
IP
报文分片是一个正常的过程,但是一些攻击者恰恰利用分片过程中的一些漏洞,迂回防火墙或者入侵检测系统进行各种攻击。
Tiny fragment
攻击
所谓
Tiny fragment
攻击是指通过恶意操作,发送极小的分片来绕过包过滤系统或者入侵检测系统的一种攻击手段。
攻击者通过恶意操作,可将
TCP
报头
(
通常为
20
字节
)
分布在
2
个分片中,这样一来,目的端口号可以包含在第二个分片中。
对于包过滤设备或者入侵检测系统来说,首先通过判断目的端口号来采取允许
/
禁止措施。但是由于通过恶意分片使目的端口号位于第二个分片中,因此包过滤设备通过判断第一个分片
,
决定后续的分片是否允许通过。但是这些分片在目标主机上进行重组之后将形成各种攻击。通过这种方法可以迂回一些入侵检测系统及一些安全过滤系统。目前一些智能的包过滤设备直接丢掉报头中未包含端口信息的分片。
通过大家熟知的
nmap
工具也可以进行一定的
Tiny fragment
攻击。通过
nmap
的
-f
选项可以将
TCP
报头分在多个小碎片中。
[root@linux /root]# nmap -f -sS -p 23 192.168.0.25
Starting nmap V. 2.54BETA1 by [email protected] ( [url]www.insecure.org/nmap/[/url] )
Interesting ports on test.com.cn (192.168.0.25):
Port
State
Service
23/tcp open telnet
Nmap run completed -- 1 IP address (1 host up) scanned in 0 seconds
此时通过
tcpdump
监听的结果如下。
02:57:25.633885 truncated-tcp 16 (frag 19350:16@0+)
02:57:25.634375 linux.test.com > test.com.cn: (frag 19350:4@16)
02:57:25.635071 test.com.cn.telnet > linux.test.com.34326:
-
S 1348389859:1348389859(0) ack 3078700240 win 32696 (DF)
02:57:25.639159 linux.test.com.34326 > test.com.cn.telnet:
-
R 3078700240:3078700240(0)win 0
可以看出通过
nmap
成功执行了
TCP SYN
扫描。但是第一个分片大小为
16
字节,小于
TCP
报头长度
20
字节,而
TCP
报头的剩余
4
字节包含在第二个分片中。