IP碎片攻击-程序员宅基地

技术标签: 技术普及  

IP碎片攻击指的是一种计算机程序重组的漏洞。

 

1. 为什么存在IP碎片

链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。

我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。

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

Identification R DF MF fragment Offset

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 Request数据包,目标主机在重组分片的时候会造成事先分配的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死远程服务器。这其实是一种Pingflood攻击,用大量的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_addr,不知道作者是不是故意的。

jolt2的影响相当大,通过不停的发送这个偏移量很大的数据包,不仅死锁未打补丁的Windows系统,同时也大大增加了网络流量。曾经有人利用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包的第一个。

* 结构图:

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,最后一个分片。

* 结构图:

IP Data

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

0x4 * 8 = 32。

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

和32两种情况:

IP UDP Data

Data

Data

可以看出,第二片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安全策略,设置"碎片检查"。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AIwenIPgeolocation/article/details/107954172

智能推荐

蓝桥杯练习系统(入门)-程序员宅基地

文章浏览阅读530次。1 A+Bimport java.util.Scanner;/** * Created by m1786 on 2017/3/3. */public class Main{ public static void main(String args[]){ int a,b; Scanner sc=new Scanner(Sy

机器学习面试题(转载)-程序员宅基地

文章浏览阅读807次。机器学习笔试题

error C4430: missing type specifier - int assumed. Note: C++ does not ...(转)-程序员宅基地

文章浏览阅读958次。error C4430: missing type specifier - int assumed. Note: C++ does not ...(转) 2011-07-06 23:37:58| 分类:编程 |举报|字号 订阅AdapterBase.cppWINVER not defined. Defaulting to 0x0502 (Wi

微信小程序如何把图片上传至服务器_扫码上传图片到指定服务器-程序员宅基地

文章浏览阅读9.2k次,点赞11次,收藏56次。wx.chooseImage({ // count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: function (res) { // 返回选定照片的本地文件路径列表,tempFilePath可以_扫码上传图片到指定服务器

HTTP Status 500 - Servlet.init() for servlet DispatcherServlet threw exception-程序员宅基地

文章浏览阅读3.3k次。车祸现场一type Exception reportmessage Servlet.init() for servlet DispatcherServlet threw exceptiondescription The server encountered an internal error that prevented it from fulfilling this request....

Spring Cloud Config目录遍历漏洞(CVE-2019-3799)预警-程序员宅基地

文章浏览阅读1.2k次。近日,Spring官方团队在最新的安全更新中披露了一则Spring Cloud Config目录遍历漏洞(CVE-2019-3799)。漏洞官方定级为 High,属于高危漏洞。该漏洞本质是允许应用程序通过spring-cloud-config-server模块获取任意配置文件,攻击者可以构造恶意URL实现目录遍历漏洞的利用。Spring产品介绍Spring是一个Java/Java EE/...._cve-2019-3799

随便推点

百度/微信小程序自动化测试_百度小程序自动化测试-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏17次。目 录:1. 小程序自动化方案 1.1 小程序的基本构成 1.2 原生组件定位之UiSelector 1.2.1 原生组件定位之UiSelector 1.2.2 web元素定位 1.3 小程序自动化准备 1.3.1 安装appium 1.3.2 安装adb tools 1.3.3 chromedriver.exe版本 1.3.4..._百度小程序自动化测试

matlab批量绘图,Matlab批量绘图代码-程序员宅基地

文章浏览阅读1k次。问题说明为了在同一个图片中生成8个小图,使用同一个mat文件,批量绘图以及命名。matlab代码%% 计算折合转速-3种% load('RESULT2.mat', 'RESULT2');%载入结果文件load('RESULT2.mat');% result=zeros(144,4);result=result2;%result=RESULT2;n=[12630 11367 10104];%三种原始..._matlab批量绘图

英国旅游--庄园酒店-程序员宅基地

文章浏览阅读445次。绝代庄园妖娆一梦 英格兰旅游攻略http://www.sh51766.com/shows/show_2435.htmlhartwell-house 庄园酒店http://www.hartwell-house.com/英国旅游住宿推荐英国旅游住宿推荐 — 酒店价格:双人房的价格从50英镑到400英镑不等,含早餐。很多大型酒店在周末和淡季..._庄园式酒店

连接oracle数据库及遇到的问题-程序员宅基地

文章浏览阅读1.5k次。今天连接了一下oracle数据库,遇到了几个问题:1.出现如下的错误java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111) at oracle.jdbc.driver.DatabaseError.throwSqlException

SharedPreferences调用导致的ANR分析-程序员宅基地

文章浏览阅读7.4k次。转自:http://blog.chinaunix.net/uid-29506893-id-5761774.htmlANR文件提取的有用片段如下:----- pid 13431 at 2016-09-14 11:46:10 -----Cmd line: com.android.settingsat java.lang.Object.wait(Native Me

关于屏幕分辨率问题-程序员宅基地

文章浏览阅读693次。常见手机屏幕分辨率128x128、128x160、240x320(常见2.0、2.2、2.4、2.8寸屏手机使用)以前的功能机时代就是这么多320x240(常见2.4寸屏手机使用)240x400(常见3.0寸屏手机使用)320x480(主流屏常见3.2、3.5寸屏手机)360x640(诺基亚常见)480x800(常见4.0寸屏使用)480x854(常见3.7寸屏使用)960x540(..._屏幕分辨率: 360x800