在上一章中了解了一种针对网络层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 为例
    image.png
    选择第8个数据包,在数据包信息面板中查看它的详细信息
    image.png
    image.png

    1. 版本——占4位,值IP协议的版本目前的IP协议版本为4
    2. 首部长度——占4位,这里的值为20bytes
    3. 总长度的是56字节
    4. 标识——占16位,它是一个计数器,用来产生数据包的标识
    5. 片偏移(16位)——较长的分组在发片后某片在原分组中的相对位置,片偏移以8个字节为偏移单位
    6. 生存时间(8位)——记为TTL,表示数据包再网络中可通过的路由器数的最大值
    7. 协议(8位)字段——指出此数据包携带的数据使用何种协议以便目的主机的IP层将数据部分上交哪个处理进程
    8. 源IP地址——表示数据包从哪里发出
    9. 目的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的原因
    如果一辆车装不满的时候,就需要分装到几辆车
    image.png
    0x00f2(242)是IP数据包的标识,同一个数据包的各个分片的标识是一样的,目的端会根据这个标准来判断IP分片算法属于同一个IP数据报
    分成两个部分,前面3位是第一部分为标志位,其中有一位用来表示是否有更多的分片,如果是最后一个分片,改标志位为0,否则为1.后面13位为第二部分表示分片在原始数据的偏移。

    16位标识 3位标志位 13位偏移
    用来区分是否为同一数据报的分片 标识算法有更多分片 分片在原始数据的位移

    正常分片过程
    打开命令符窗口,在里面发送一个大小为4200Bytes的ICMP请求,使用wireshark捕获
    ping -n 1 -l 4200 www.baidu.com
    image.png
    分成3个数据包,前面两个数据包的长度都是 1514Bytes,最后一个数据包的长度为1282Bytes
    打开第一个数据包查看
    image.png
    标识号为54115,标志位为1,偏移量为0
    打开第二个数据包查看
    image.png
    标识号为54115,标志位为1,偏移量为1480
    打开第三个数据包查看
    image.png
    标识号为54115,标志位为0,偏移量为2960
    分片的全部信息
    image.png

    泪滴攻击
    泪滴(teardrop)攻击是基于数据分片传送进行的攻击手段。在 IP 报头中有一个偏移字段和一个分片标志(MF),如果 MF 标志设置为 1,则表明这个 IP 包是一个大 IP 包的片断,其中偏移字段指出了这个片断在整个 IP 包中的位置。例如,对一个 4200Bytes 的 IP包进行分片(MTU 为 1480),则 3 个片断中偏移字段的值依次为:0、1480、2960。这样接收端就可以根据这些信息成功的组装该 IP 包。而如果一个攻击者打破这种正常情况,把偏移字段设置成不正确的值,即可能出现重合或断开的情况,就可能导致目标操作系统崩溃。比如,把上述偏移设置为 0、1000、2000。
    图中阴影部分的就是两个数据包有重合的地方,目标设备在接收到这种分片之后就无法重新组合成一个数据包,这就是所谓的泪滴攻击。这种攻击方式在以前曾经给计算机用户带来了很大的困扰,但是对如今的操作系统基本无
    image.png

    Wireshark 的着色规则
    在我们使用 Wireshark 进行工作的时候,可以在数据包列表面板处看到各种类型的数
    据包都以不同的颜色显示出来。
    image.png

    根据 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