文章目录
- 0x01 泪滴攻击原理
- 0x02 IP协议格式
- 0x03 分片实验
- 0x04 泪滴攻击实例
- 0x05 根据TTL值判断攻击的来源
0x01 泪滴攻击原理
针对IP协议的攻击方法,主要有伪造IP地址和发送畸形数据包两种方式。我们在这一章中选择的泪滴攻击就属于发送畸形数据包这种方式,它的设计思路巧妙地利用了IP协议里面的缺陷,因此成为了网络安全里面的一个经典案例。
这种攻击的实现原理是向目标主机发送异常的数据包碎片,使得IP数据包碎片在重组的过程中有重合的部分,从而导致目标系统无法对其进行重组,进一步导致系统崩溃而停止服务的恶性攻击。
考虑到这种攻击是建立在IP协议上,我们先来简单地了解一下IP协议的几个重要内容,包括IP协议数据包的格式、分片方式以及存活时间(TTL) 。
可能受影响的操作系统
- Windows 3.1
- Windows 95和NT
- 2.0.32和2.1.63版本以下的Linux
Windows7和vista的潜在风险
微软的SMB2中发现了一个远程重启漏洞,利用该漏洞的溢出代码已经在互联网上广泛传播,使Windows 7和Windows Vista的用户暴露在泪滴攻击的风险中。
0x02 IP协议格式
wireshark提供的各种数据包样本:https://wiki.wireshark.org/SampleCaptures?action=show&redirect=Sample+Captures
下载泪滴攻击样本 teardrop.cap
IP协议是网络中最繁忙的协议。IP协议是一种best efforts协议,不保证可靠性,数据包可能重复、丢失;无连接协议,同一个连接中的多个报文被独立对待。IP协议主要定义了数据传送的基本单位;执行路由功能;主要规定了主机和路由器应该如何处理数据包;在什么情况下产生错误信息;以及什么情况下应该丢弃数据包。
先介绍现在普遍使用的IPv4,以下是报头格式:
第8和9数据包是一次泪滴攻击的实例,泪滴攻击就是一个数据包分片后,本来应该可以组合到一起,但它组合不到一起去了先看第8个数据包,是个ip数据包
数据报分析版本(4bit):指IP协议的版本,4代表IPv4
首部长度(4bit):占4位,可表示的最大数值为15,因为IP首部固定长度为20字节,因此最小数值为5。单位为4字节,所以这里的长度为5*4字节=20字节。
区分服务(8bit):用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。
总长度(16bit):代表IP数据报的总长度,单位是字节,共16位,因此IP数据报最大长度为2^16-1=65535字节
标识(16bit):用于标识IP数据报。由于在不同的网络环境中的MTU不同,IP数据报有时需要分片,为了正确重组IP数据报,故每个数据报有标识字段。同一个标识的分片组装在一起。
标志(3bit):最低一位为MF(more fragment)标识后面是否还有碎片,中一位DF(don’t fragment)表示该数据报是否允许被分片。这里MF为1,后面还有分片
片偏移(13bit):用于标识该碎片在整个数据报中的位置。相对于用户数据字段的起点,该片从何处开始。片偏移以八个字节为偏移单位,除了最后一个数据报片,每个分片的长度为8字节的整数倍。
生存时间(8位):TTL(time to live)单位是路由次数,表示最多经过多少路由。路由器每次转发数据报就把TTL减一,当TTL减为零食,就丢弃这个数据报。
协议(8bit):携带的数据是何种协议,即该数据应该交付至哪层传输层协议,其中6表示TCP,17表示UDP。
首部检验和(16bit):只检验分组的首部,而不检验数据部分。
源IP(32bit)
目的IP(32bit)
我们比较关注的是分片,生存时间,源地址,目的地址
为什么要分片?
红框中的数据,为1时代表不是最后一个分片,为0时代表是最后一个分片,分片的几个数据包标识号是一样的
这个红框表示分片相对于原始位置的偏移,偏移的单位是8字节,也就是说需要乘8才是最终的偏移量
而泪滴攻击把几个分片后数据包偏移量改小一些,这样两个分片的包会有部分重合,当目标设备接收到这样的数据包后,就无法重新组合,这种构造出畸形数据包的方法就叫泪滴攻击,以前的操作系统会死机,现在一般没有什么作用了,现在一般与泛洪攻击结合起来,泪滴攻击针对的是分片
0x03 分片实验
使用ping命令发送一个长度为4200的icmp数据包
然后使用wireshark抓包,可以看到ICMP数据报的数据部分长度为4200
我们来分析分析ip协议是如何分片的,我们知道标识相同的ip分片属于一个数据包,那么将ip数据包的标识符作为过滤器使用就能找到所有ip数据包
现在全部筛选出来了
现在看看第一个数据报,起始位置0+长度1480
标准以太网帧长度下限为:64 字节
以太网规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。标准以太网帧长度上限为:1518 字节,以太网中帧的大小通常是1514
据RFC894的说明,以太网封装IP数据包的最大长度是1500字节,也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步吗+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的FCS。
最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,其最大值是6+6+2+1500=1514。
关于长度部分可以参考以太网数据帧(802.3)最大与最小长度
再来看看第二个数据包,起始位置1480+长度1480
第三个数据包,起始位置2940+长度1240,最后一个数据包,全部合起来等于4200
所以我们的ICMP数据包在网络层被分为了三部分:1480+1480+1240=4200
0x04 泪滴攻击实例
将第二个数据包的偏移量1480
改小一点,让第二个数据包和第一个数据包数据有重合部分,这样两个分片的包会有部分重合,当目标设备接收到这样的数据包后,就无法重新组合,这种构造出畸形数据包的方法就叫泪滴攻击,以前的操作系统会死机,现在一般没有什么作用了。同理将第三个偏移量改小也可以。
再来看看wireshark官方提供的数据包,第八个数据包的数据长度为36
但是第九个数据包的偏移量却不是36,而是24,这样两个ip数据包就无法正常组装。
0x05 根据TTL值判断攻击的来源
不同的操作系统的默认TTL值是不同的,所以我们可以通过TTL值来判断主机的操作系统,但是当用户修改了TTL值的时候,就会误导我们的判断,所以这种判断方式也不一定准确。下面是默认操作系统的TTL
攻击者的包表面上看来自世界各地,但他的TTL值暴露了所在地,如果是外网过来的一定会变小,但发现所有数据包的TTL值都为64,可以判断攻击者为内网用户。