IDS欺骗之Fragroute
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]可用于数据重叠和报文段大小的配置。很遗憾,目前还没有出现专门的工具来判断目标系统数据覆盖的方式。(完)