【摘 要】文章通过实例分析IDS规则提出应该如何完善规则以便降低IDS误报率的方法,最后阐述IDS规则的创建方法。
【关键词】IDS规则 规则分析 规则创建 误报率
1 IDS规则实例的分析
当网站允许恶意代码被插入到一个动态创建的网页中时,跨站脚本攻击就发生了。我们来看一个IDS规则:alert tcp any any -> any any (content:"<SCRIPT>";msg:"WEB-MISC cross site scripting attempt";)
规则选项content包含了“<SCRIPT>”字符串,正好可以匹配跨站脚本攻击的特征,跨站脚本攻击会触发这个规则。可是许多其他的正常流量也会触发这个规则,IDS根据该规则发出报警从而产生误报。为了避免这种情况的发生就需要修改这个规则使其仅仅在Web流量中触发:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS(content:"<SCRIPT>"; msg:"WEB-MISC cross site scripting attempt";)
现在,仅在来自Web服务器的相关HTTP会话中检测到〈SCRIPT〉内容时才会触发该规则。当流量开始于一个外部的IP地址($EXTERNAL_NET),并被发送给Web服务器上HTTP服务端口时,该规则才被触发。当正确地标识公司所有的Web服务器和所运行的端口后,跨站脚本规则仅当含有脚本标记的数据流被发送到Web服务器上时才触发。但是,载入这个规则后会发现无论何时有包含JavaScript的请求时都会产生大量的误报。因此需要更进一步地提炼这个规则,找到跨站脚本攻击数据流的唯一特征。
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS(msg:"WEB-MISC cross site scripting attempt"; flow:to_server,established;content:"<SCRIPT>";)
这个校正后的规则使用了flow选项,使用IDS的TCP重建特征来鉴别流量的方向。通过应用特定的flow选项,to_server和established,规则仅仅对从客户端向服务器端发起的会话有效。一个跨站脚本攻击只会发生在这个方向传输的流量上,而反方向上的流量可能是一个包含JavaScript标记的正常的HTTP会话。
现在规则已经可以识别跨站脚本攻击了,且产生误报的可能性大大减少。接着需要利用大小写敏感性确保攻击者不能躲避该规则。content选项是区分大小写的,然而HTML不是,因此攻击者可以通过将脚本标记修改为<ScRiPt>或<script>避开这个规则,为了弥补这一点,应用nocase选项来指定不区分大小写。
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS(msg:"WEB-MISC cross site scripting attempt";flow:to_server,established;content:"<SCRIPT>";nocase;)
2 IDS规则的编写方法
2.1利用网络知识创造新规则
首先需要编写规则头。Web服务器请求响应是一个HTTP数据流,因此规则头的协议部分应使用TCP。要想监控指定的任何外部地址,源地址部分可以使用$EXTERNAL_NET变量。因为我们想让该规则应用于Web服务器请求响应,所以源端口部分应使用$HTTP_PORTS变量来标识与HTTP连接相关的端口列表。如果想监控整个内部网络,目标地址部分应使用$HOME_NET变量。HTTP请求可以使用任何随机选取的高端端口,因此可以将目的端口部分设为any。最后我们希望该规则匹配数据流后报警,那么规则行为部分应设为alert,这样就形成了下面的规则头:alert tcp $EXTERNAL_NET $HTTP_PORTS->$HOME_NET any,接下来指定规则选项。2.2利用流量分析创建新规则
下面通过创建一个监控OpenSSL Slapper蠕虫的规则的例子进行说明。
将嗅探器放在一个防火墙后面,防火墙仅仅开放Slapper使用的那个端口。Slapper是利用了OpenSSL中的一个安全漏洞,因此在防火墙中打开端口443/tcp后开始监控服务器,如果一段时间后,服务器发出一个像“no job control in this shell”这样的响应,就说明服务器遭到Slapper攻击了。记录下遭到攻击的时间,然后使用grep对这段时间tcpdump日志记录的数据进行分析。从这个信息中找出一个特征内容赋给规则选项content表达式,并使该特征与IDS规则库中其他规则content表达式内容不同,即是唯一的。这里可以使用content:”export.TERM=xterm; exec bash –i”来创建该特征。
接着开始写规则头。规则实现的功能应该可以对来自任何外部源、任何端口输入的,目的为Web服务器的HTTPS端口(443),且满足攻击特征的TCP流量进行报警,所以规则头可写为:
alert tcp $EXTERNAL_NET any->$HOME_SERVERS 443,
加上报警消息和版本号后,规则选项为:
(msg:”Slapper attack”;flow:to_server,established;content:”export.TERM=xterm; exec bash –i”;nocase;priority:1;rev:1)
联接规则头和规则选项,完成规则如下:
Alert tcp $EXTERNAL_NET any->$HOME_SERVERS 443(msg:”Slapper attack”; flow:to_server,established;content:”export.TERM=xterm; exec bash –i”; nocase; priority:1; rev:1)
至此就完成了监控Slapper蠕虫的规则。显然,利用流量分析的方法创建新规则,其工作重点在于识别含有确切攻击的正确数据包,并从中找出区别于其他攻击的唯一特征。