IDS欺骗之Fragroute

发表于:2007-06-23来源:作者:点击数: 标签:
fragroute能够截

   

fragroute能够截取、修改和重写向外发送的报文,实现大部分在了Secure Networks Insertion, Evasion, and Denial of Service: Eluding Network Intrusion Detection中叙述的IDS欺骗技术,包括IP、TCP层的数据包碎片以及数据包数据重叠等。

fragroute和fragrouter 



其实,早在1999年5月,Dug Song就发布了一个类似的工具--fragrouter。这个工具是网络入侵检测系统(NIDS)性能测试套件--nidsbench一个部分,顾名思义,fragrouter是一个具有路由器功能的应用程序,它能够对攻击者发送的攻击流量进行分片处理之后,向攻击目标转发。其原理如下所示:

攻击流量 分片之后的攻击流量

+-------+ +------------+ +--------+

| hax0r | ------->| fragrouter | - - - - - - - - - - ->| victim |

+-------+ +------------+ | +--------+

V

+------+------+

| network IDS |

+-------------+ 

如果入侵检测系统不能进行IP和TCP分片重组或者重组功能不太完善,将不能发现针对victim攻击。

从实现的技术来看,fragroute和fragrouter差不多。和fragroute不同的是,它只处理本地主机发送到远程主机的数据流量,不支持数据包的转发,因此不会在本地主机打开IP转发功能。

网络层和传输控制层IDS欺骗技术 



在介绍fragroute之前,我们首先要介绍一些fragroute实现的技术,这些技术主要是在网络层和传输控制层。除此之外,还有一些应用应用层的技术,不过,在本文中将不多做赘述。如果您希望了解更多信息,可以参考Insertion,Evasion and Denial of Service: Eluding Network Intrusion Detection、IDS Evasion Techniques and Tactics、IDS Evasion with Unicode、 A Look At Whisker's Anti-IDS Tactics和Polymorphic Shellcodes vs. Application IDSs等文档。

1.网络层技术

我们首先讨论网络层(IP)的IDS欺骗技术。互联网协议(Internet Protocol)提供一种无连接和不可靠的分组投递服务(RFC791)。它会尽最大努力投递IP分组,但是不能保证分组能够正确地投递到目的地。为了能够更好地理解本文讨论的IDS欺骗技术,我们先看一下IP分组的结构:

0 4 7 15 31

| | | | |

------------------------------------------|

| Ver|head|type of | total length |

| (4)|len |service | (in bytes) |

|-----------------------------------------|

| identification |0|D|M| fragment |

| | |F|F| offset |

|-----------------------------------------|

| time to | proto | header of |

| live(TTL)| | checksum |

|-----------------------------------------|

| source address(32 bytes) |

|-----------------------------------------|

| destination address(32 bytes) |

|-----------------------------------------|

/ /

option

/ /

|-----------------------------------------|

/ /

data

/ /

|-----------------------------------------|

图1.IP分组结构 

如图1所示,每个IP分组的长度都是4个字节的倍数,各个域的意义如下:

4位版本号,一般为4。

以4个字节为单位的分组头的长度,取值范围5-15(默认值5)。

8位的服务类型(Type Of Service,TOS),服务类型的前3位设置分组的优先级,数值越大,则分组越重要。接下来的3位分别表示延迟、吞吐率和可靠性,如果为0则表示常规服务,如果为1则表示短延迟、高吞吐率和高可靠性。最后两位没有使用。

16字节的总长度,单位是字节,包括分组头和数据的长度。

标志符(identification)长度16位,唯一地标识该IP分组。IP分组在传输过程中,期间可能通过一些子网,这些子网间允许的最大协议数据单元(PDU)可能小于该IP分组的长度。为了处理这种情况,IP协议为一数据报方式传输的IP分组提供了分片和重组的功能。当一个路由器分割一个IP分组时,要把IP分组头中的大多数数据段复制到分片中,标志符段是必须复制的数据段。到达目的地之后,目标主机就是通过这个标志符来确定分片属于那个IP分组。

3位的标志段,低序两位分别控制IP分组是否可以分片(DF位)和是否是最后一个碎片(MF位),还有一位没有定义。

13位的碎片偏移表示IP碎片在原始IP分组中的偏移。

生存时间设置分组在互联网中能够经过的跳数。

协议(protocol)段指定高层协议的类型,例如:ICMP是1、TCP是6、UDP是17。

校验和(checksum)保证IP分组头的完整性。

分别为32位的源地址和目的地址。

除了以上这些必需项之外,还可能包括一些任选项,例如源路由。

下面,我们将以此为基础讨论如何使用这些IP分组的域来欺骗IDS。

(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中插入无用信息。

最后攻击者常用的IP包头域是DF,这个位表示如果这个IP分组超过了转发设备允许的最大长度,是否可以分片。如果IP分组的DF标志被设置为1,就表示这个分组不能被分片,当它超过了转发设备的允许的最大长度时,就会被丢弃。因此,如果NIDS允许的最大数据包长度大于其监视的系统,我们就可以使包含垃圾信息的分组大小介于两者之间,从而在IDS中插入垃圾信息。

这些技术在原理上看起来比较容易,但是在实际应用过程中,需要对目标网络和系统的情况有非常深刻的了解才能实施,否则成功的几率非常小:)。

IP选项

错误的校验和问题不难解决,只要使IDS对错误校验和的分组采用与其它系统相同的处理方式就可以了。IP分组的选项域也可以被攻击者用来给IDS插入垃圾信息。对于IP选项,各种系统的处理方式差别很大,因此很容易使攻击者诡计得逞。

攻击者最为常用的IP选项就是严格源路由(strict source routed)选项。一般情况下,如果自己的地址没有出现在IP分组的源路由表中,系统就会丢弃收到的IP分组。有些系统可以配置为自动丢弃包含严格源路由选项的IP分组。这就给IDS的处理带来了很大的困难。

(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消耗掉所有内存。目标系统必须有处理这种情况的能力。一些系统会根据TTL,丢弃碎片。IDS必须以和目标系统相同的方式处理碎片。如果IDS接收被监视的主机丢弃的碎片流,就会被攻击者插入垃圾数据;如果IDS丢弃被监视系统接受的数据,就可能遗漏攻击数据流量。

碎片重叠问题

目前,主要有两种技术用于逃避检测设备的监视。第一种就是使用尽可能小的碎片,例如:每个碎片只有8个字节(碎片最小8个字节),而每个碎片中都没有足够的信息,从而逃过检测。但是,现在的包过滤设备一般会主动丢弃这种碎片,入侵检测设备也会发出碎片攻击的报警,因此这种逃避方式很难奏效。

另外一种方式就是碎片重叠。在IP分组中有一个13位的域(fragment offset),标识每个碎片在原始IP分组中的偏移。构造错误的碎片偏移值,可能造成碎片的重叠,如图:

|<--- offset=0 size=256 ---->|

+-----------------------+----+

| | | frag1

| | |

+-----------------------+----+

+----+----------------------+

| | | frag2

| | |

+----+----------------------+

|<-- offset=248,size=256 -->|

图2

图2中,frag1负载的数据偏移值为0(也就是第一个碎片),大小是256,而第二个碎片frag2的数据偏移是248,造成了两个碎片的部分数据重叠。这样会使某个碎片的数据覆盖掉另一个碎片的重叠数据。而哪一个碎片重叠部分的数据被覆盖由操作系统决定。例如,如果frag1先于frag2到达,在NT/Y2K和solaris2.6中,frag1的数据会覆盖frag2的重叠数据;而在Linux中,frag2的数据会覆盖frag1的数据。而如果两个碎片不按正常顺序到达,也就是frag2先于frag1到达,在NT/Y2K和solaris2.6中,frag2的数据会覆盖frag1的重叠数据;而在Linux中,frag1的数据会覆盖frag2的数据。这些细节在使用fragroute之前一定要弄清楚。

究竟是后面到达的碎片覆盖先到达的重叠数据,还是后到达碎片的重叠数据被覆盖可以使用fragroute软件包中的一个工具fragtest进行判断。fragroute的配置选项ip_frag size [new|old]用于IP碎片覆盖方式的配置,new表示后到达的碎片覆盖先到碎片的重叠数据,old表示后到达的碎片覆盖先到碎片的重叠数据。这两个选项是fragroute配置选项中比较难以理解的。

对于碎片重叠,如果网络入侵检测系统的处理方式不同,就会造成漏报。例如,使用运行于Linux之上的snort作为网络入侵检测系统,而攻击者的攻击目标是Y2K系统。

2.网络层问题

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

0 15 31

| | |

|--------------------+------------------------|

| source port | destination port |

|---------------------------------------------|

| sequence number |

|---------------------------------------------|

| acknowledge number |

|-------------+------+------------------------|

| data | | code | window |

|offset| | | |

|--------------------+------------------------|

| checksum | urgent pointer |

|--------------------+------------------------|

| option | padding |

|--------------------+------------------------|

/ /

data

/ /

|---------------------------------------------|

图2.TCP报文结构

每个TCP报文由两个部分组成:包头和数据。TCP包头包括如下域:

16字节的源端口和目的端口。

32字节的序列号和应答号。

4位数据偏移,标识包头的打消,单位是4个字节。

6位编码位,确定报文的类型和目的。从左到右依次是:URGENT、ACK、PSH、RST、SYN和FIN。

2字节的窗口段。标识发送该报文的TCP实体在相反的阐述方向上能够棘手的字节数。

2字节的校验和用于最基本的差错控制。

选项域用于处理其它情况。例如:定义通信过程中的最大报文长度,保护序列号的时间戳以及用于告诉网络通讯的窗口放大因子等。

填充域用于使包头的大小是4个字节的倍数。

(1).插入垃圾数据

在前面我们讨论了使用IP协议向IDS插入垃圾数据。由于TCP协议的处理更为复杂,因此有很多情况可以使系统丢弃收到的TCP报文。如果IDS和受监视的系统使用不同的处理方式,就可能被攻击者利用,在IDS中插入垃圾数据,干扰IDS的检测。

TCP包头的畸形域

某些IDS产品虽然支持TCP会话重组,但是如果它们在没有检查就重组TCP会话,就可能被攻击者利用在检测数据中插入垃圾信息。

一个容易被忽视的是TCP包头的编码段(code),这六位标志TCP报文的类型和内容。这些编码位可以进行组合,而某些组合是无效的,例如:把所有的编码位都打开,这些类型的报文应该被丢弃。而且某些系统不接收没有ACK位的TCP报文。

另一个经常被忽视的TCP包头域是校验和域。所有的系统都会丢弃校验和错误的TCP报文,但是某些入侵检测系统却并不检查这个域,从而能够被攻击者利用。

TCP选项

IDS应该能够处理TCP选项,但是和IP选项不同,TCP选项要复杂的多,而且经常会出现新的TCP选项。另外一个很难处理TCP选项的原因是某些TCP选项只在某些连接状态下出现。对于包含坏TCP选项的TCP报文,某些系统会拒绝,而另一些系统会忽略坏TCP选项。网络入侵检测系统很难判断被监视系统的处理方式,给攻击者以可乘之机。

RFC1323提出了两个TCP选项(窗口放大和时间戳选项),用于提高高速环境TCP传输的效率和可靠性。和以前的规定不同,这两个新的选项可能出现在非SYN报文段中。有的TCP实现会拒绝包括选项的非SYN报文段,而有些系统会忽略这样的选项继续处理。这为IDS造成了很大的困难,如果IDS不能采取和受监视系统相同的处理方式,就会被攻击者插入垃圾数据。

RFC1323定义的另一个概念是PAW(protection against wrapped sequence numbers,序列号回卷保护)。如果使用窗口放大(window scale)选项,每个TCP连接的窗口最大可以是65535*2^14,而TCP连接的序列号是32位的,所以很快就会发生序列号回卷。为了阻止某个序列号为n的报文段,在序列号回卷到n时重新出现,RFC1323提出了PAWS,使用时间戳避免这种情况的出现。如果一个报文段的时间戳早于某个时间值,就会被丢弃。攻击者会手工制作低时间戳的报文段干扰入侵检测系统的检测,这类TCP报文段一般会兼容PAWS系统丢弃。如果IDS不知道被监视系统是否支持PAWS,就会被攻击者插入垃圾数据。

(2).TCP流重组问题

对于入侵检测系统,最艰巨的任务是重组通过TCP连接交换的数据。TCP协议提供了足够的信息帮助目标系统判断数据的有效性和数据在连接中的位置。TCP协议的重传机制可以确保数据准确到达,如果在一定的时间之内没有收到接受方的响应信息,发送方会自动重传数据。但是,由于监视TCP会话的入侵检测系统是被动的监视系统,因此无法使用TCP重传机制。如果数据传输过程中,发生顺序被打乱或者报文丢失的情况,将加大其检测难度。更严重的是,重组TCP数据流需要进行序列号跟踪,但是如果在传输过程中丢失了很多报文,就可能使入侵检测系统无法进行序列号跟踪。如果没有恢复机制,就可能使入侵检测系统不能同步监视TCP连接。不过,即使入侵检测系统能够恢复序列号跟踪,也照样能够被攻击。

基本的重组问题

某些入侵检测系统不使用序列号跟踪,它们按照收到数据的顺序重组TCP流,攻击者只要把报文的顺序打乱,或者在数据流中加入目标系统根本不会接受的垃圾数据,就可以是这种入侵检测系统失效。

高级重组问题

即使入侵检测系统能够跟踪TCP连接的序列号,也照样无法保证某个报文段(即使序列号是正确的)能够被目标系统接受。有很多问题可能是目标系统丢弃需要正确的数据。最基本的就是IP和TCP插入问题,除此之外,还存在一些高层的问题也会是序列号正确的数据被丢弃。

最主要的问题是入侵检测系统必须知道被监视系统宣布的窗口大小。TCP包头的窗口域标识TCP连接接收方能够接收的数据数量,能够防止发送方向自己的缓冲区发送太多数据。如果收到的数据数量超过窗口的大小,这些数据就会被丢弃。而且,入侵检测系统对窗口的化的反应比受监视系统的反应要慢些。如果在两者不一致的期间有报文到达就会造成问题。

另外,攻击者发送一些序列号相同而负载不同的报文也会对入侵检测系统的TCP流重组造成问题,这些序列号相同的报文包头的各个域完全相同(除了校验和域)。很显然,接收方只会处理所有序列号相同的报文中的一个,其它的都会被丢弃。但是,一般没有足够的信息让入侵检测系统判断究竟哪个报文是有效的。而且,有些入侵检测系统经常会接受无效的数据,攻击者可以先发送一些肯定会接收方系统拒绝的报文段,经过很小的延迟之后发出有效的数据,会造成入侵检测系统后推序列号而无法接收有效的数据。

数据重叠

和IP碎片一样,TCP报文段也可能非顺序到达,也存在重叠数据覆盖问题。而且,究竟是新到数据覆盖先到数据也由接收方操作系统决定。例如,在NT4.0系统中,先到的报文段会覆盖后到报文段的重叠数据;而Linux系统则相反。如果入侵检测系统和受监视系统的处理方式不同,就会造成漏报。

fragroute的配置选项tcp_seg size [new|old]可用于数据重叠和报文段大小的配置。很遗憾,目前还没有出现专门的工具来判断目标系统数据覆盖的方式。(完)

原文转自:http://www.ltesting.net