zoukankan      html  css  js  c++  java
  • IP分片攻击

    本文简单介绍了IP分片原理,并结合Snort抓包结果详细分析常见IP碎片攻击的原理和特征,
    最后对阻止IP碎片攻击给出一些建议。希望对加深理解IP协议和一些DoS攻击手段有所帮助。


    1. 为什么存在IP碎片
    -=-=-=-=-=-=-=-=-=-=-=
    链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一
    个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包
    要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操
    作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为150
    0
    字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是
    1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。

    IP首部包含了分片和重组所需的信息:

       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |          Identification         |R|DF|MF|     Fragment Offset     |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |<-------------16-------------->|<--3-->|<---------13---------->|

    Identification:发送端发送的IP数据包标识字段都是一个唯一值,该值在分片时被复制到
                     每个片中。
    R:保留未用。
    DF:Don't Fragment,“不分片”位,如果将这一比特置1 ,IP层将不对数据报进行分片。
    MF:More Fragment,“更多的片”,除了最后一片外,其他每个组成数据报的片都要把比特
    置1。
    Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。

    另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。

    每一IP分片都各自路由,到达目的主机后在IP层重组,请放心,首部中的数据能够正确完成
    分片的重组。你不禁要问,既然分片可以被重组,那么所谓的碎片攻击是如何产生的呢?


    2. IP碎片攻击
    -=-=-=-=-=-=-=-=-=-=-=
    IP首部有两个字节表示整个IP数据包的长度,所以IP数据包最长只能为0xFFFF,就是65535字
    节。如果有意发送总长度超过65535的IP碎片,一些老的系统内核在处理的时候就会出现问题

    导致崩溃或者拒绝服务。另外,如果分片之间偏移量经过精心构造,一些系统就无法处理,
    导致死机。所以说,漏洞的起因是出在重组算法上。下面我们逐个分析一些著名的碎片攻
    击程序,来了解如何人为制造IP碎片来攻击系统。


    3. ping o' death
    -=-=-=-=-=-=-=-=-=-=-=
    ping o' death是利用ICMP协议的一种碎片攻击。攻击者发送一个长度超过65535的Echo Req
    uest
    数据包,目标主机在重组分片的时候会造成事先分配的65535字节缓冲区溢出,系统通常
    会崩溃或挂起。ping不就是发送ICMP Echo Request数据包的吗?让我们尝试攻击一下吧!
    不管IP和ICMP首部长度了,数据长度反正是多多益善,就65535吧,发送一个包:

    # ping -c 1 -s 65535 192.168.0.1
    Error: packet size 65535 is too large. Maximum is 65507

    不走运,看来Linux自带的ping不允许我们做坏事。:(

    65507是它计算好的:65535-20-8=65507。Win2K下的ping更抠门,数据只允许65500大小。
    所以你必须找另外的程序来发包,但是目前新版本的操作系统已经搞定这个缺陷了,所以你

    是继续往下阅读本文吧。

    顺便提一下,记得99年有“爱国主义黑客”(“红客”的前辈)发动全国网民在某一时刻开
    始ping某美国站点,试图ping死远程服务器。这其实是一种ping flood攻击,用大量的Echo
    Request包减慢主机的响应速度和阻塞目标网络,原理和ping o' death是不一样的,这点要
    分清楚。


    4. jolt2
    -=-=-=-=-=-=-=-=-=-=-=
    jolt2.c是在一个死循环中不停的发送一个ICMP/UDP的IP碎片,可以使Windows系统的机器死
    锁。我测试了没打SP的Windows 2000,CPU利用率会立即上升到100%,鼠标无法移动。

    我们用Snort分别抓取采用ICMP和UDP协议发送的数据包。

    发送的ICMP包:
    01/07-15:33:26.974096 192.168.0.9 -> 192.168.0.1
    ICMP TTL:255 TOS:0x0 ID:1109 IpLen:20 DgmLen:29
    Frag Offset: 0x1FFE    Frag Size: 0x9
    08 00 00 00 00 00 00 00 00                        .........

    发送的UDP包:
    01/10-14:21:00.298282 192.168.0.9 -> 192.168.0.1
    UDP TTL:255 TOS:0x0 ID:1109 IpLen:20 DgmLen:29
    Frag Offset: 0x1FFE    Frag Size: 0x9
    04 D3 04 D2 00 09 00 00 61                        ........a

    从上面的结果可以看出:
    * 分片标志位MF=0,说明是最后一个分片。
    * 偏移量为0x1FFE,计算重组后的长度为 (0x1FFE * 8) + 29 = 65549 > 65535,溢出。
    * IP包的ID为1109,可以作为IDS检测的一个特征。
    * ICMP包:
       类型为8、代码为0,是Echo Request;
       校验和为0x0000,程序没有计算校验,所以确切的说这个ICMP包是非法的。
    * UDP包:
       目的端口由用户在命令参数中指定;
       源端口是目的端口和1235进行OR的结果;
       校验和为0x0000,和ICMP的一样,没有计算,非法的UDP。
       净荷部分只有一个字符'a'。

    jolt2.c应该可以伪造源IP地址,但是源程序中并没有把用户试图伪装的IP地址赋值给src_a
    ddr,
    不知道作者是不是故意的。

    jolt2的影响相当大,通过不停的发送这个偏移量很大的数据包,不仅死锁未打补丁的Windo
    ws
    系统,同时也大大增加了网络流量。曾经有人利用jolt2模拟网络流量,测试IDS在高负载
    流量下的攻击检测效率,就是利用这个特性。


    5. teardrop
    -=-=-=-=-=-=-=-=-=-=-=
    teardrop也比较简单,默认发送两个UDP数据包,就能使某些Linux内核崩溃。Snort抓取的结
    果如下:

    第一个:
    01/08-11:42:21.985853 192.168.0.9 -> 192.168.0.1
    UDP TTL:64 TOS:0x0 ID:242 IpLen:20 DgmLen:56 MF
    Frag Offset: 0x0    Frag Size: 0x24
    A0 A8 86 C7 00 24 00 00 00 00 00 00 00 00 00 00   .....$..........
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
    00 00 00 00                                       ....

    * MF=1,偏移量=0,分片IP包的第一个。
    * 结构图:

       |<-------20-------->|<------8------>|<---------------28---------------->|
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         IP          |       UDP       |                Data                 |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


    第二个:
    01/08-11:42:21.985853 192.168.0.9 -> 192.168.0.1
    UDP TTL:64 TOS:0x0 ID:242 IpLen:20 DgmLen:24
    Frag Offset: 0x3    Frag Size: 0x4
    A0 A8 86 C7                                       ....

    * MF=0,偏移量=0x3,偏移字节数为 0x3 * 8 = 24,最后一个分片。
    * 结构图:

       |<-------20-------->|<--4-->|
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         IP          | Data   |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    如果修改源代码,第二片IP包的偏移量也可以为0x4,偏移字节数就是 0x4 * 8 = 32。

    下面的结构图表示了接收端重组分片的过程,分别对应于偏移字节数为24和32两种情况:

       |<-------20-------->|<------8------>|<---------------28---------------->|
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         IP          |       UDP       |                Data                 |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                           |
                           |                                 +-+-+-+-+
                           |<------------- 24 ------------->| Data   |
                           |                                 +-+-+-+-+
                                                            |<--4-->|

                           |
                           |                                            +-+-+-+-+
                           |<------------------- 32 ------------------>| Data   |
                           |                                            +-+-+-+-+
                                                                       |<--4-->|

    可以看出,第二片IP包的偏移量小于第一片结束的位移,而且算上第二片IP包的Data,也未
    超过第一片的尾部,这就是重叠现象(overlap)。老的Linux内核(1.x - 2.0.x)在处理这
    种重叠分片的时候存在问题,WinNT/95在接收到10至50个teardrop分片时也会崩溃。你可以
    阅读teardrop.c的源代码来了解如何构造并发送这种数据包。


    6. 如何阻止IP碎片攻击
    -=-=-=-=-=-=-=-=-=-=-=
    * Windows系统请打上最新的Service Pack,目前的Linux内核已经不受影响。
    * 如果可能,在网络边界上禁止碎片包通过,或者用iptables限制每秒通过碎片包的数目。
    * 如果防火墙有重组碎片的功能,请确保自身的算法没有问题,否则被DoS就会影响整个网络

    * Win2K系统中,自定义IP安全策略,设置“碎片检查”。


    7. 更多资料
    -=-=-=-=-=-=-=-=-=-=-=
    [1] TCP/IP Illustracted Volume 1 : The Protocols
    [2] Microsoft Security Bulletin MS00-029:
         http://www.microsoft.com/technet/security/bulletin/ms00-029.asp
    [3] BugTraq Mailing List, "Analysis of jolt2.c(MS00-029)":
         http://www.securityfocus.com/archive/1/62011
    [4] http://www.attrition.org/security/denial/w/teardrop.dos.html
    [5] http://packetstormsecurity.org/0005-exploits/jolt2.c
    [6] http://packetstormsecurity.org/Exploit_Code_Archive/teardrop.c

  • 相关阅读:
    CodeForces gym Nasta Rabbara lct
    bzoj 4025 二分图 lct
    CodeForces 785E Anton and Permutation
    bzoj 3669 魔法森林
    模板汇总——快读 fread
    bzoj2049 Cave 洞穴勘测 lct
    bzoj 2002 弹飞绵羊 lct裸题
    HDU 6394 Tree 分块 || lct
    HDU 6364 Ringland
    nyoj221_Tree_subsequent_traversal
  • 原文地址:https://www.cnblogs.com/buffer/p/1908149.html
Copyright © 2011-2022 走看看