您的位置:首页 > 其它

Fragroute原理详细分析

2006-02-02 21:34 260 查看
Fragroute原理详细分析

1.简介
2002年3月左右,http://www.monkey.org/~dugsong/发布了一个工具fragroute,在入侵检测
领域引起了相当大的震动。有关fragroute的讨论成了3-4月http://online.securityfocus.
com/和snort邮件列表的一个热点。
fragroute能够截取、修改和重写向外发送的报文,实现大部分在了Secure Networks Inser
tion, Evasion, and Denial of Service: Eluding Network Intrusion Detection中叙述的
IDS欺骗技术,包括IP、TCP层的数据包碎片以及数据包数据重叠等。
2.fragroute和fragrouter
其实,早在1999年5月,Dug Song就发布了一个类似的工具--fragrouter。这个工具是网络入
侵检测系统(NIDS)性能测试套件--nidsbench一个部分,顾名思义,fragrouter是一个具有路
由器功能的应用程序,它能够对攻击者发送的攻击流量进行分片处理之后,向攻击目标转发
。其原理如下所示:
攻击流量 分片之后的攻击流量
+-------+ +------------+ +--------+
| hax0r |------->| fragrouter |- - - - - - - - - - ->| victim |
+-------+ +------------+ | +--------+
V
+------+------+
| network IDS |
+-------------+
如果入侵检测系统不能进行IP和TCP分片重组或者重组功能不太完善,将不能发现针对victi
m攻击。从实现的技术来看,fragroute和fragrouter差不多。和fragroute不同的是,它只处
理本地主机发送到远程主机的数据流量,不支持数据包的转发,因此不会在本地主机打开IP
转发功能。
3.网络层和传输控制层IDS欺骗技术
在介绍fragroute之前,首先要介绍一些fragroute实现的技术,这些技术主要是在网络层和
传输控制层。除此之外,还有一些应用应用层的技术,不过,这儿不多做赘述。更多信息,
可以参考Insertion,Evasion and Denial of Service: Eluding Network Intrusion Detec
tion、IDS Evasion Techniques and Tactics、IDS Evasion with Unicode、 A Look At W
hisker's Anti-IDS Tactics和Polymorphic Shellcodes vs. Application IDSs等文档。
3.1.网络层技术
首先讨论网络层(IP)的IDS欺骗技术。互联网协议(Internet Protocol)提供一种无连接和不
可靠的分组投递服务(RFC791)。它会尽最大努力投递IP分组,但是不能保证分组能够正确地
投递到目的地。为了能够更好地理解本文讨论的IDS欺骗技术,我们先看一下IP分组的结构:

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图3-1.IP分组结构

如图3-1所示,每个IP分组的长度都是4个字节的倍数,各个域的意义如下:
" 4位版本号,一般为4。
" 以4个字节为单位的分组头的长度,取值范围5-15(默认值5,无Options选项的时候)。
" 8位的服务类型(Type Of Service,TOS),服务类型的前3位设置分组的优先级,数值越
大,则分组越重要。接下来的3位分别表示延迟、吞吐率和可靠性,如果为0则表示常规服务
,如果为1则表示短延迟、高吞吐率和高可靠性。最后两位没有使用。
" 16字节的总长度,单位是字节,包括分组头和数据的长度。
" 标志符(identification)长度16位,唯一地标识该IP分组。IP分组在传输过程中,期间
可能通过一些子网,这些子网间允许的最大协议数据单元(PDU)可能小于该IP分组的长度。为
了处理这种情况,IP协议为一数据报方式传输的IP分组提供了分片和重组的功能。当一个路
由器分割一个IP分组时,要把IP分组头中的大多数数据段复制到分片中,标志符段是必须复
制的数据段。到达目的地之后,目标主机就是通过这个标志符来确定分片属于哪个IP分组。
" 3位的标志段,低序两位分别控制IP分组是否可以分片(DF位)和是否是最后一个碎片(M
F位),还有一位没有定义。
" 13位的碎片偏移表示IP碎片在原始IP分组中的偏移。
" 生存时间设置分组在互联网中能够经过的跳数。
" 协议(protocol)段指定高层协议的类型,例如:ICMP是1、TCP是6、UDP是17。
" 校验和(checksum)保证IP分组头的完整性。(IP头的校验和只对IP头进行了校验,不包
括数据段)
" 分别为32位的源地址和目的地址。
" 除了以上这些必需项之外,还可能包括一些任选项,例如源路由。
下面,我们将以此为基础讨论如何使用这些IP分组的各个域来欺骗IDS。

3.1.1.搀杂无效数据的技术
使用这种技术,攻击者在其发出的攻击数据中,搀杂一些能被IDS接受却不能被攻击目标接受
的数据,从而影响IDS的正常检测。一般攻击者主要通过使用错误的包头域或者IP选项错误的
数据包实现这个目的。
" 错误的包头域
这是最早被攻击者采用的一种攻击方式。攻击者构造坏的IP包头域,使攻击目标能够丢弃这
个包,而让NIDS能够接受这个数据包,从而在NIDS接收的数据中插入无效的数据。不过,这
种技术有两个问题。路由器一般会丢弃这种数据包,因此这种技术很难用于远程攻击,除非
IDS和攻击者是在同一个LAN中。另外一个问题是IDS是否能够以攻击者设想的方式解释具有坏
包头的数据包。例如,如果使用错误的IP包头的大小,会使IDS无法定位传输控制层的位置,
因此,不是每个IP包头的域都是可以使用的。一般使用校验和、TTL和不可分片(DF)等包头域

校验和域的错误很容易被IDS忽视。有的IDS为了提高性能一般不对数据包进行校验和检查,
因此不会丢弃校验和错误的数据包。但是,绝大多数系统的TCP/IP协议栈都会丢弃校验和错
误的IP数据包。
TTL(Time To Live)也是一个可以利用的包头域,它表示一个IP分组从源地址到达目的地址最
多可以经过多少跳(hop),一个在互联网上传输的IP分组,每经过一个路由器它的TTL就会减
一,如果这个分组在到达目的地址之前,TTL变成0,就会被丢弃。根据这个原理,如果IDS和
目标系统不在同一个网段上,我们可以构造IP分组的TTL域,使分组刚好能够到达IDS,而不
能到达目标系统,从而在IDS中插入无用信息,不过目前NIDS一般检测仅仅检测针对和NIDS部
署在同一子网中的主机的攻击,利用TTL域进行攻击的可能性不大。
最后攻击者常用的IP包头域是DF,这个位表示如果这个IP分组超过了转发设备允许的最大长
度,是否可以分片。如果IP分组的DF标志被设置为1,就表示这个分组不能被分片,当它超过
了转发设备的允许的最大长度时,就会被丢弃。因此,如果NIDS允许的最大数据包长度大于
其监视的系统,我们就可以使包含垃圾信息的分组大小介于两者之间,从而在IDS中插入垃圾
信息。
这些技术在原理上看起来比较容易,但是在实际应用过程中,需要对目标网络和系统的情况
有非常深刻的了解才能实施,否则成功的几率非常小。

" IP选项
错误的校验和问题不难解决,只要使IDS对错误校验和的分组采用与其它系统相同的处理方式
就可以了。IP分组的选项域也可以被攻击者用来给IDS插入垃圾信息。对于IP选项,各种系统
的处理方式差别很大,因此很容易使攻击者诡计得逞。
攻击者最为常用的IP选项就是严格源路由(strict source routed)选项。一般情况下,如果
自己的地址没有出现在IP分组的源路由表中,系统就会丢弃收到的IP分组。有些系统可以配
置为自动丢弃包含严格源路由选项的IP分组。这就给IDS的处理带来了很大的困难。
3.1.2.IP碎片
当路由器准备将IP分组发送到网络上,而该网络又无法将这个IP分组一次全部发送时,路由
器必需将分组分成小块,使其长度能够满足这一网络对分组大小的限制,这些分割出来的小
块就叫做碎片(fragmentation)。IP分组可以独立地通过不同的路径转发,使得碎片只有到达
目的主机之后才可能汇集到一块,而且碎片不一定按照次序到达。到达目的主机后,目的主
机会重组IP分片。
当一个路由器分割一个IP分组时,要把IP分组头的大多数字段值复制到每个碎片中,其中16
位的标志符字段是必须复制的段,它能够唯一地标志一个IP分组,使目的主机能够判断每个
碎片所属的IP分组,而且每个碎片中都有偏移值,用来标记碎片在IP分组中的位置。
由于目标系统能够重组IP分片,因此需要网络入侵检测系统具有重组IP碎片的能力。如果网
络入侵检测系统没有重组IP碎片的能力,将无法检测通过IP碎片进入的攻击数据。不过,现
在的网络入侵检测产品基本都具有良好的IP分片重组能力,因此基本的IP碎片问题不会给网
络入侵检测系统造成太大的麻烦。但是,像碎片重叠之类的技术仍然会带来很大的问题。
下面详细介绍使用IP碎片欺骗网络入侵检测系统的原理。
" 基本的重组问题
IP碎片通常会按照顺序到达目的地,最后的碎片的MF位为0(表示这是最后一个碎片)。不过,
IP片有可能不按照顺序到达,目标系统必须能够重组碎片。但是,如果网络入侵检测系统总
是假设IP碎片是按照顺序到达就会出现漏报的情况。攻击者可以打乱碎片的到达顺序,达到
欺骗IDS的目的。
除此之外还有一个问题,IDS必须把IP碎片保存到一个缓冲区里,等所有的碎片到达之后重组
IP分组。如果攻击者不送出所有的碎片,就可能使那些缓存所有碎片的IDS消耗掉所有内存,
不过当前的NIDS一般都有定时机制,这种情况可以通过超时事件来处理,但是超时事件的引
入又带入了新的问题,这些问题此处不赘述。目标系统必须有处理这种情况的能力。还有一
些系统会根据TTL,丢弃碎片。IDS必须以和目标系统相同的方式处理碎片,然而一个子网中
通常存在不同系统,这一点很难做到。如果IDS接收被攻击的主机丢弃的碎片流,就会被攻击
者插入垃圾数据;如果IDS丢弃被监视系统接受的数据,就可能遗漏攻击数据流量。(这一点
其实我有点想不通,等vogs回来问问他^_^,这里的IDS接收被攻击的主机丢弃的碎片流是指
IDS和被攻击主机接收的碎片流不一致,比如IDS接收的是老的碎片而被攻击主机接收的是新
的碎片等。)。
" 碎片重叠问题(linux favor new;windows favor old)
目前,主要有两种技术用于逃避检测设备的监视。第一种就是使用尽可能小的碎片,例如:
每个碎片只有8个字节(碎片最小8个字节,8个字节是指数据段的长度,不过每个IP包的第一
个分片好像最小是24个字节,我记得在那边看到过不过不肯定了),而每个碎片中都没有足够
的信息,从而逃过检测。但是,现在的包过滤设备一般会主动丢弃这种碎片(softfirewall
是不是也是这样做的呢??),入侵检测设备也会发出碎片攻击的报警,因此这种逃避方式
很难奏效。
另外一种方式就是碎片重叠。在IP分组中有一个13位的域(fragment offset),标识每个碎片
在原始IP分组中的偏移。构造错误的碎片偏移值,可能造成碎片的重叠,如图:
|<--- offset=0 size=256 ---->|
+-----------------------+----+
| | | frag1
+-----------------------+----+
+----+----------------------+
| | | frag2
+----+----------------------+
|<-- offset=248,size=256 -->|
图3-2

图3-2中,frag1负载的数据偏移值为0(也就是第一个碎片),大小是256,而第二个碎片frag
2的数据偏移是248,造成了两个碎片的部分数据重叠。这样会使某个碎片的数据覆盖掉另一
个碎片的重叠数据。而哪一个碎片重叠部分的数据被覆盖由操作系统决定。例如,如果frag
1先于frag2到达,在NT/Y2K和solaris2.6中,frag1的数据会覆盖frag2的重叠数据;而在Li
nux中,frag2的数据会覆盖frag1的数据。而如果两个碎片不按正常顺序到达,也就是frag2
先于frag1到达,在NT/Y2K和solaris2.6中,frag2的数据会覆盖frag1的重叠数据;而在Lin
ux中,frag1的数据会覆盖frag2的数据。这种差异性造成了NIDS检测的困难性。
究竟是后面到达的碎片覆盖先到达的重叠数据,还是后到达碎片的重叠数据被覆盖可以使用
fragroute软件包中的一个工具fragtest进行判断。fragroute的配置选项ip_frag size [ne
w|old]用于IP碎片覆盖方式的配置,new表示后到达的碎片覆盖先到碎片的重叠数据,old表
示后到达的碎片覆盖先到碎片的重叠数据。这两个选项是fragroute配置选项中比较难以理解
的。
对于碎片重叠,如果网络入侵检测系统的处理方式不同,就会造成漏报。例如,使用运行于
Linux之上的snort作为网络入侵检测系统,而攻击者的攻击目标是Y2K系统。

3.2.网络层问题
TCP用于在不可靠的网络上为两台主机之间提供有序可靠的数据投递服务。实现其可靠性传输
的基础是序列号和应答号。TCP包头结构如下:

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图3-2.TCP报文结构

每个TCP报文由两个部分组成:包头和数据。TCP包头包括如下域:
" 16字节的源端口和目的端口。
" 32字节的序列号和应答号。
" 4位数据偏移(也即是首部长度),标识包头的打消,单位是4个字节。
" 6位标志位,确定报文的类型和目的。从左到右依次是:URGENT、ACK、PSH、RST、SYN
和FIN。
" 2字节的窗口段。标识发送该报文的TCP实体在相反的传输方向上能够接受的字节数。
" 2字节的校验和用于最基本的差错控制。
" 选项域用于处理其它情况。例如:定义通信过程中的最大报文长度,保护序列号的时间
戳以及用于告诉网络通讯的窗口扩大因子等。
" 填充域用于使包头的大小是4个字节的倍数。
3.2.1.插入垃圾数据
在前面我们讨论了使用IP协议向IDS插入垃圾数据。由于TCP协议的处理更为复杂,因此有很
多情况可以使系统丢弃收到的TCP报文。如果IDS和受监视的系统使用不同的处理方式,就可
能被攻击者利用,在IDS中插入垃圾数据,干扰IDS的检测。
" TCP包头的畸形域
某些IDS产品虽然支持TCP会话重组,但是如果它们在没有检查就重组TCP会话,就可能被攻击
者利用在检测数据中插入垃圾信息。
一个容易被忽视的是TCP包头的标志位字段,这六位标志TCP报文的类型和内容。这些标志位
可以进行组合,而某些组合是无效的,例如:把所有的标志位都打开,这些类型的报文应该
被丢弃(在我们的NIDS中有状态转换检测可以检测一定的这种标志位异常,不过有可能不完
全,这些不完全怎么完善)。而且某些系统不接收没有ACK位的TCP报文。
另一个经常被忽视的TCP包头域是校验和域。所有的系统都会丢弃校验和错误的TCP报文,但
是某些入侵检测系统(为了提高性能)却并不检查这个域,从而能够被攻击者利用。
" TCP选项
IDS应该能够处理TCP选项,但是和IP选项不同,TCP选项要复杂的多,而且经常会出现新的T
CP选项。另外一个很难处理TCP选项的原因是某些TCP选项只在某些连接状态下出现。对于包
含坏TCP选项的TCP报文,某些系统会拒绝,而另一些系统会忽略坏TCP选项。网络入侵检测系
统很难判断被监视系统的处理方式,给攻击者以可乘之机。
RFC1323提出了两个TCP选项(窗口放大和时间戳选项),用于提高高速环境TCP传输的效率和可
靠性。和以前的规定不同,这两个新的选项可能出现在非SYN报文段中(窗口扩大选项好像仅
仅可以出现在SYN报文中吧,TCP/IP详解卷1上是这么说的)。有的TCP实现会拒绝包括选项的
非SYN报文段,而有些系统会忽略这样的选项继续处理(RFC好像规定这两个选项只可以出现
在SYN报文段中)。这为IDS造成了很大的困难,如果IDS不能采取和受监视系统相同的处理方
式,就会被攻击者插入垃圾数据。
RFC1323定义的另一个概念是PAW(protection against wrapped sequence numbers,序列号
回卷保护)。如果使用窗口放大(window scale)选项,每个TCP连接的窗口最大可以是65535*
214,而TCP连接的序列号是32位的,所以很快就会发生序列号回卷。为了阻止某个序列号为
n的报文段,在序列号回卷到n时重新出现,RFC1323提出了PAWS,使用时间戳避免这种情况的
出现。如果一个报文段的时间戳早于某个时间值,就会被丢弃。攻击者会手工制作低时间戳
的报文段干扰入侵检测系统的检测,这类TCP报文段一般会兼容PAWS系统丢弃。如果IDS不知
道被监视系统是否支持PAWS,就会被攻击者插入垃圾数据。
3.2.2.TCP流重组问题
对于入侵检测系统,最艰巨的任务是重组通过TCP连接交换的数据。TCP协议提供了足够的信
息帮助目标系统判断数据的有效性和数据在连接中的位置。TCP协议的重传机制可以确保数据
准确到达,如果在一定的时间之内没有收到接受方的响应信息,发送方会自动重传数据。但
是,由于监视TCP会话的入侵检测系统是被动的监视系统,因此无法使用TCP重传机制。如果
数据传输过程中,发生顺序被打乱或者报文丢失的情况,将加大其检测难度。更严重的是,
重组TCP数据流需要进行序列号跟踪,但是如果在传输过程中丢失了很多报文,就可能使入侵
检测系统无法进行序列号跟踪。如果没有恢复机制,就可能使入侵检测系统不能同步监视TC
P连接。不过,即使入侵检测系统能够恢复序列号跟踪,也照样能够被攻击。
" 基本的重组问题
某些入侵检测系统不使用序列号跟踪,它们按照收到数据的顺序重组TCP流,攻击者只要把报
文的顺序打乱,或者在数据流中加入目标系统根本不会接受的垃圾数据,就可以是这种入侵
检测系统失效。(现在这样的重组方式还使用吗??)
" 高级重组问题
即使入侵检测系统能够跟踪TCP连接的序列号,也照样无法保证某个报文段(即使序列号是正
确的)能够被目标系统接受。有很多问题可能是目标系统丢弃需要正确的数据。最基本的就是
IP和TCP插入问题,除此之外,还存在一些高层的问题也会是序列号正确的数据被丢弃。
最主要的问题是入侵检测系统必须知道被监视系统宣布的窗口大小。TCP包头的窗口域标识T
CP连接接收方能够接收的数据数量,能够防止发送方向自己的缓冲区发送太多数据。如果收
到的数据数量超过窗口的大小,这些数据就会被丢弃。而且,入侵检测系统对窗口的化的反
应比受监视系统的反应要慢些。如果在两者不一致的期间有报文到达就会造成问题。(我们
的NIDS有滑动窗口检测功能,但是怎么使用这个功能还不是很明确,在用网上当下来的一个
测试IDS的tcpreplay数据测试的时候我们的IDS检测到了滑动窗口的异常。)。
另外,攻击者发送一些序列号相同而负载不同的报文也会对入侵检测系统的TCP流重组造成问
题,这些序列号相同的报文包头的各个域完全相同(除了校验和域)。很显然,接收方只会处
理所有序列号相同的报文中的一个,其它的都会被丢弃。但是,一般没有足够的信息让入侵
检测系统判断究竟哪个报文是有效的。而且,有些入侵检测系统经常会接受无效的数据,攻
击者可以先发送一些肯定会接收方系统拒绝的报文段,经过很小的延迟之后发出有效的数据
,会造成入侵检测系统后推序列号而无法接收有效的数据。
" 数据重叠
和IP碎片一样,TCP报文段也可能非顺序到达,也存在重叠数据覆盖问题。而且,究竟是新到
数据覆盖先到数据也由接收方操作系统决定。例如,在NT4.0系统中,先到的报文段会覆盖后
到报文段的重叠数据;而Linux系统则相反。如果入侵检测系统和受监视系统的处理方式不同
,就会造成漏报。
fragroute的配置选项tcp_seg size [new|old]可用于数据重叠和报文段大小的配置。很遗憾
,目前还没有出现专门的工具来判断目标系统数据覆盖的方式,不过fragroute的附带工具f
ragtest可以做一定的探测。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: