上一篇《基于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 fyodor@insecure.org ( www.insecure.org/nmap/ )
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字节包含在第二个分片中。