通过这种方式,每次只投递几个字节的数据,就可能避开字符串匹配入侵检测系统的监视。要监视这种攻击,需要入侵检测系统或者 能够理解、监视网络会话(即使IDS有这种能力,攻击者也可以通过其它的凡是避开监视),或者采用其它的技术监视这种攻击。snort使 用以下规则来监视会话拼接:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-MISC whisker
space splice attack"; content:"|20|"; flags:A+; dsize:1;
reference:arachnids,296; classtype:attempted-recon; reference)
这条规则使snort检测目标为$HTTP_SERVERS 80端口的ACK报文的负载长度是否等于1以及是否包含空格(16进制的20)。使用这条规则可以精确地检测出whisker,但是攻击者只要稍加修改就可以避开这个检测。为了能够检测可能出现的会话拼接攻击,可以对上面这条 snort规则进行扩展,使其检查负载很短的HTTP请求。但是,这样做的副作用是提高了误报警数量,而且在某些情况下攻击者还是能 够避开监视。为了真正有效地检测这种攻击,需要入侵检测系统能够完整地理解网络会话,不过这是非常困难的。应该注意的是目前 大多数系统能够重组会话,在所有的会话数据到达之前,它们会等待一些时间。而等待时间的长短与程序有关。例如,Apache/RedHat 的会话超时时间是6分钟,IIS/Win2K等待的时间非常长。因此,攻击者完全可以每15分钟发送一个字节的会话数据,而IIS还会认为是有效的会话。最新版本的snort能够监视长期的会话和网络层欺骗,例如:小TTL值。
4.碎片攻击
碎片攻击和会话拼接(session splicing)有点类似。直到最近,很多入侵检测系统在进行字符串匹配之前不能准确地重组碎片。现在这种 情况有了改观,所有的入侵检测系统都能够进行某些重组。不过,还是有很多方法可以避开入侵检测系统的监视。碎片重组的问题是 在进行字符串匹配以前,入侵检测系统必须在内存中缓存所有的碎片,然后进行重组。而且,他还需要直到、碎片在目的主机会如何 重组。Thomas Ptacek and Timoth Newsham于1998年写的Insertion,Evasion and Denial of Service: Eluding Network Intrusion Detection描述了许多基于网络的碎片躲避和其它类型的躲避技术。碎片攻击包括:碎片覆盖、碎片重写、碎片超时和针对网络拓扑的碎片技术(例如使用小的 TTL)等。下面,我们将详细讨论。
4.1.碎片覆盖
所谓碎片覆盖就是发送碎片覆盖先前碎片中的数据。例如:
碎片1 GET x.idd
碎片2 a.?(缓冲区溢出数据)
第二个碎片的第一个字符覆盖第一个碎片最后一个字符,这两个碎片被重组之后就变成了GET x.ida?(缓冲区溢出数据)。实际情况远非这么简单。
4.2.碎片数据覆盖
这种方法和上面的碎片覆盖有些类似,只不过是覆盖全部的碎片数据,例如:
碎片1 GET x.id
碎片2 一些随机的字符
碎片3 a.?(缓冲区溢出数据)
这些碎片在经过目标系统的重组之后,碎片3将完全覆盖碎片2,重组之后的数据变成GET x.ida?(缓冲区溢出数据)。如果入侵检测系统的重组方式和目标系统不同,就无法重组出“GET x.ida?(缓冲区溢出数据)”,因此就检测不出这个攻击。
4.3.碎片超时
这种攻击依赖于入侵检测系统在丢弃碎片之前会保存多少时间。大多数系统会在60秒之后将丢弃不完整的碎片流(从收到第一个碎片开 始计时)。如果入侵检测系统保存碎片的时间小于60秒,就会漏掉某些攻击。例如:
碎片1(设置了MF位) GET foo.id
碎片2(59秒之后发出) a?(缓冲区溢出数据)
如果IDS保存起始碎片的时间不到60秒,就会漏过攻击。幸运的是,如果配置没有错误,现在的网络入侵检测系统能够检测此类攻击。
这种技术结合其它的网络技术(例如:TTL值)将更有威胁。如果入侵检测系统和被监视的系统不在同一个网段,攻击者就可以在TTL上做手脚。有的单位由于经费的限制,不能在自己的每个子网都部署IDS节点,只在网络的出入口部署一套IDS,监视所有的网络流量。这种情况下,如果被攻击的主机在其它的子网,攻击数据包到目标系统的跳数就大于到IDS的跳数。攻击者可以伪造碎片的TTL,使某些碎片刚好能够到达,而无法到达目标系统,例如:
碎片序号 负载 TTL(假设攻击者到目标的跳数是5,到IDS的跳数是3)
1 GET foo.id 5
2 evasion.html 3
3 a?(缓冲区溢出数据) 5
从这些碎片中,IDS重组的数据是“GET foo.idevasion.html a?(缓冲区溢出数据)”或者“GET foo.idevasion.html”(如果IDS的超时时间小于60秒)。通过这种方式,攻击者成功地在IDS中插入了垃圾数据。
5.碎片和snort特征码
下面我们把上述攻击和某些snort特征码进行比较。对于.ida缓冲区溢出攻击,默认的snort特征码几乎无法捕获任何通过碎片发动的攻击(如果使用了frag2预处理模块,snort可以截获碎片超时攻击)。下面是针对.ida缓冲区溢出攻击的snort检测规则:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-IIS ISAPI
.ida attempt"; uricontent:".ida?"; nocase; dsize:>239; flags:A+;
reference:arachnids,552; classtype:web-application-attack;
reference:cve,CAN-2000-0071;sid:1243;rev:2;)
另外,snort还有一条检测小碎片的规则,一旦发现太小的碎片,就会触发这条规则:
alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:"MISC Tiny
Fragments";fragbits:M;dsize: < 25; classtype:bad-unknown;sid:522)
但是,这样还是不能检测某些攻击。还是以ida缓冲区溢出为例,这个攻击实际上和请求的URI无关,因此攻击者可以在前面加入一些垃圾数据以避免触发碎片检测规则。
碎片1 GET reallylongstringtoevadedetect.i
碎片2 da?(缓冲区溢出数据)
这些技术并非只针对snort。Cisco Secure IDS也能够进行碎片重组,并且能够对上述碎片攻击进行报警。
实际上,碎片攻击要复杂的多,尤其是涉及到TTL和碎片覆盖。如果想更为深入地了解这方面技术,请参考Network Intrusion Detection: Evasion, Traffic Normalization, and End-to-End Protocol Semantics。
检测碎片攻击也非常困难。使IDS的碎片超时时间至少为60秒,增加对异常碎片的报警,最重要的是系统管理人员要对碎片攻击的潜在威胁有清醒的认识。2002年四月,Dug Song发布了Fragroute,引发了不小的震动。很快,snort社团发布了能够对碎片攻击进行更好检测的snort1.8.6版。
6.拒绝服务
还有一种比较野蛮的方法就是拒绝服务。拒绝服务可以针对检测设备本身和管理设备。Stick、snot和其它一些测试工具能够是入侵检测设备产生大量的报警。使用这些工具,可以达成如下目标:
消耗检测设备的处理能力,是真正的攻击逃过检测。
塞满硬盘空间,使检测设备无法记录日志。
使检测设备产生超出其处理能力的报警。
使系统管理人员无法研究所有的报警。
挂掉检测设备。
对IDS来说,这类工具无迹可寻,因此非常难以对付。
结论
本文我们讨论了一些常用的IDS躲避技术及其对策。其中有些技术需要攻击者具有熟练的攻击技巧,而有写技术却无需太多的技巧。而fragroute之类的工具出现,大大降低了攻击者采用某些技术的难度,使防御的一方总是处于被动。