在上一章中了解了一种针对网络层ARP协议的攻击技术,在这一章中我们将会就网络层中另一个常用的协议IP展开分析。几乎每一个对网络有所了解的人都知道IP地址,IP可以说是整个网络中最为重要的一个协议。互联网上的每一个设备都需要通过IP地址来标识自己的身份。
同样在IP协议中也没有任何的安全机制,所以它也经常被攻击者所利用。虽然现在随着操作系统的不断完善,很多针对IP协议的手段已经不再能对网络和设备造成任何的威胁了,但是它们都设计的十分巧妙,我们通过对其进行学习和研究,可以帮助我们更好的掌握网络安全方面的知识。
泪滴攻击(TearDrop)的相关理论
- 针对 IP 协议的攻击方法,主要有伪造 IP 地址和发送畸形数据包两种方式。我们在这一章中选择的泪滴攻击就属于发送畸形数据包这种方式,它的设计思路巧妙地利用了 IP协议里面的缺陷,因此成为了网络安全里面的一个经典案例。
- 这种攻击的实现原理是向目标主机发送异常的数据包碎片,使得 IP 数据包碎片在重组的过程中有重合的部分,从而导致目标系统无法对其进行重组,进一步导致系统崩溃而停止服务的恶性攻击。
- 考虑到这种攻击是建立在 IP 协议上,我们先来简单地了解一下 IP 协议的几个重要内容,包括 IP 协议数据包的格式、分片方式以及存活时间(TTL)。
IP协议的格式
我们先来了解 IP 协议数据包的格式,读者可以访问 https://wiki.wireshark.org/ SampleCaptures/,这里面包含有 Wireshark 官方提供的各种数据包样本。这一章我们以其中的 teardrop.cap 为例
选择第8个数据包,在数据包信息面板中查看它的详细信息
- 版本——占4位,值IP协议的版本目前的IP协议版本为4
- 首部长度——占4位,这里的值为20bytes
- 总长度的是56字节
- 标识——占16位,它是一个计数器,用来产生数据包的标识
- 片偏移(16位)——较长的分组在发片后某片在原分组中的相对位置,片偏移以8个字节为偏移单位
- 生存时间(8位)——记为TTL,表示数据包再网络中可通过的路由器数的最大值
- 协议(8位)字段——指出此数据包携带的数据使用何种协议以便目的主机的IP层将数据部分上交哪个处理进程
- 源IP地址——表示数据包从哪里发出
- 目的IP地址——表示数据包将要发向哪里
最为关心的几个部分则是片偏移、生存时间、源IP地址和目的IP地址
IP分片
刚刚在讲到 IP 协议格式的时候,提到的片偏移就是用来实现对数据包进行分片的。可是为什么数据包要分片呢,把所有信息放在一个数据包中不是更方便?这其实是和一个名为 MTU(最大传输单元)的值有关。我们知道数据包的最外面要添加一个以太网的帧头,并包装成一个数据帧之后才能传输。由于以太网传输电气方面的限制,以太网帧的大小都有限制每个以太网帧最小也要 64Bytes,最大不能超过 1518bytes。刨去以太网帧的帧头(DMAC 目的地址 MAC48bit=6Bytes+SMAC,源 MAC 地址 48bit=6Bytes+Type 域 2bytes)14Bytes 和帧尾 CRC 校验部分 4Bytes(这个部分有时候也被称作 FCS),那么剩下承载上层协议的地方也就是 Data 域最大就只能有 1500Bytes,这个值我们就把它称之为 MTU。这也就是我们几乎所有设备的 MTU 值都为 1500的原因
如果一辆车装不满的时候,就需要分装到几辆车
0x00f2(242)是IP数据包的标识,同一个数据包的各个分片的标识是一样的,目的端会根据这个标准来判断IP分片算法属于同一个IP数据报
分成两个部分,前面3位是第一部分为标志位,其中有一位用来表示是否有更多的分片,如果是最后一个分片,改标志位为0,否则为1.后面13位为第二部分表示分片在原始数据的偏移。
16位标识 | 3位标志位 | 13位偏移 |
---|---|---|
用来区分是否为同一数据报的分片 | 标识算法有更多分片 | 分片在原始数据的位移 |
正常分片过程
打开命令符窗口,在里面发送一个大小为4200Bytes的ICMP请求,使用wireshark捕获
ping -n 1 -l 4200 www.baidu.com
分成3个数据包,前面两个数据包的长度都是 1514Bytes,最后一个数据包的长度为1282Bytes
打开第一个数据包查看
标识号为54115,标志位为1,偏移量为0
打开第二个数据包查看
标识号为54115,标志位为1,偏移量为1480
打开第三个数据包查看
标识号为54115,标志位为0,偏移量为2960
分片的全部信息
泪滴攻击
泪滴(teardrop)攻击是基于数据分片传送进行的攻击手段。在 IP 报头中有一个偏移字段和一个分片标志(MF),如果 MF 标志设置为 1,则表明这个 IP 包是一个大 IP 包的片断,其中偏移字段指出了这个片断在整个 IP 包中的位置。例如,对一个 4200Bytes 的 IP包进行分片(MTU 为 1480),则 3 个片断中偏移字段的值依次为:0、1480、2960。这样接收端就可以根据这些信息成功的组装该 IP 包。而如果一个攻击者打破这种正常情况,把偏移字段设置成不正确的值,即可能出现重合或断开的情况,就可能导致目标操作系统崩溃。比如,把上述偏移设置为 0、1000、2000。
图中阴影部分的就是两个数据包有重合的地方,目标设备在接收到这种分片之后就无法重新组合成一个数据包,这就是所谓的泪滴攻击。这种攻击方式在以前曾经给计算机用户带来了很大的困扰,但是对如今的操作系统基本无
Wireshark 的着色规则
在我们使用 Wireshark 进行工作的时候,可以在数据包列表面板处看到各种类型的数
据包都以不同的颜色显示出来。
根据 TTL 值判断攻击的来源
我们在对攻击数据包的ip层进行分析时,还有一个很重要的字段:TTL。TTL的作用是限制IP数据包在计算机网络中存在的时间。TTL的最大值是255。TTL字段由IP数据包的发送者设置,在IP数据包从源主机到目的主机的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的值减1,然后再将IP包转发出去
不同的操作系统的默认 TTL 值是不同的,所以我们可以通过 TTL 值来判断主机的操作系统,但是当用户修改了 TTL 值的时候,就会误导我们的判断,所以这种判断方式也不一定准确。下面是默认操作系统的 TTL。
WINDOWS NT/2000 TTL | 128 |
---|---|
WINDOWS 95/98 TTL | 32 |
UNIX TTL | 255 |
LINUX TTL | 64 |
WIN7 TTL | 64 |