• 当前位置:首页>>编程开发A>>安全防御>>Snort 2.x数据区搜索规则选项的改进
  • Snort 2.x数据区搜索规则选项的改进
  • 创建时间:2005-09-27
    文章属性:原创
    文章提交:stardust (stardust_at_xfocus.org)

    Snort 2.x的规则选项与2.0以前的版本相比有了相当大的改进,有必要介绍和分析一下。

    首先翻译一下Snort使用手册中相关的规则选项说明。由于这个手册写的极烂,很多地方意思表述重复冗长,用词不准确,而且还有些明显的错误,应该仔细说明的地方反而没有说明,叙述顺序上也混乱的很,还有让人不可理解的是手册中的示例规则本来就是简单的文本竟然采用了图片的格式,简直就是一个垃圾手册的范例,所以在翻译时没有完全参照,而是融入和补充了我认为正确的说法,还调整了一下某些选项说明的顺序。这个文档写于一年多前,当时的原文链接为 http://www.snort.org/docs/snort_manual/node14.html ,对于当前的网站,对应的链接差不多是 http://www.snort.org/docs/snort_manual/node21.html

    ----------------------------------------------------------------------------------------
    2.5.1 content选项

    content选项是Snort提供的多个选项中比较重要的一个。它可以使用户搜索数据包净载中特定的内容并相引发相应的动作。当执行一个content选项匹配时,程序调用Boyer-Moore模式匹配例程检查包内容中是否包含了此内容,如果选项中指定的数据正好包含在数据包的净载中,那么检查返回成功,规则中其他的选项会继续得以执行。需要小心的是默认的content选项匹配是关心大小写的。

    选项中指定的数据可能会比较复杂;它可能包含混和的文本和二进制数据。二进制数据通常用管道(|)符号括起来并以字节码的方式指定。字节码是以十六进制的格式表示的,这样可以很方便地描述复杂的二进制数据。示例的Snort规则中就包含了混合的文本及二进制数据。

    在一条规则可以指定多个content选项,这样可以使规则尽可能少地出现误报的情况。

    如下字符在content选项内容中出现时必须被转义(如何转义至少在这个手册里的此节没说,我补充一下,有两个方法:1. 使用前导“\”字符 2. 使用字节的二进制表示方式,比如用“|3A|”表示“:”):

    : ; \ "

    如果content选项内容之前放置了“!”字符,则表示在数据中不包含选项内容时引发报警。

    2.5.1.1 格式

    content: [!] "<content string>";

    content选项可以带有多个修饰选项。修饰选项可以影响紧接之前的content选项的工作方式,这些修饰选项如下:

    1.
    nocase
    2.
    rawbytes
    3.
    depth
    4.
    offset
    5.
    distance
    6.
    within

    2.5.1.2 示例

    alert tcp any any -> any 139 (content:"|5c 00|P||00|I|00|P|00|E|00 5c|";)
    混和了二进制数据和文本的content选项内容

    alert tcp any any -> any 80 (content:!"GET";depth:3;nocase;)
    取反匹配,此规则匹配数据包净载的前三个字节不是“GET”的情况

    2.5.2 nocase修饰选项

    nocase选项修饰紧接之前的content选项,使之在匹配时忽略大小写。

    2.5.2.1 格式

    nocase;

    2.5.2.2 示例

    alert tcp any any -> any 21 (msg:"FTP ROOT"; content:"USER root"; nocase;)
    带有nocase修饰选项的content规则

    2.5.3 rawbytes修饰选项

    rawbytes选项修饰紧接之前的content选项,使之只匹配最原始的数据,忽略那些预处理器所做的解码。

    2.5.3.1 格式

    rawbytes;

    2.5.3.2 示例

    alert tcp any any -> any 21 (msg: "Telnet NOP"; content: "|FF F1|"; rawbytes;)
    上面的示例使content选项匹配最原始的网络流量,而不是经过telnet解码器解码后的数据。

    2.5.4 depth修饰选项

    depth选项修饰紧接之前的content选项,允许用户指定在数据区中搜索特定模式的深度。如果设置depth等于5,则表示在数据包净载中从某个起点(如果没有下面论及的另一个offset修饰选项,则默认为数据区净载的开头)开始的5个字节中匹配content选项内容指定的模式。

    2.5.4.1 格式

    depth: <字节数>;

    2.5.5 offset修饰选项

    offset选项修饰紧接之前的content选项,允许用户指定从数据包净载的哪个字节开始进行匹配。如果设置offset等于5,Snort会在数据区净载的前5个字节以后开始搜索content选项内容指定的模式。

    2.5.5.1 格式

    offset: <字节数>;

    alert tcp any any -> any 80 (content: "cgi-bin/phf"; offset:4; depth:20;)
    组合使用了content,offset,depth选项的规则,从数据包净载的第5个字节开始的20字节内查找“cgi-bin/phf”字串。

    2.5.6 distance

    distance选项修饰紧接之前的content选项,允许用户指定相对于上一个content选项匹配成功的串尾再加多少字节开始搜索distance所修饰的这个content选项指定的匹配内容。此修饰选项与offset类似,只不过是相对于上一个content选项匹配成功的串尾而不是相对于数据区净载的开头。

    2.5.6.1 格式

    distance: <字节数>;

    2.5.6.2 示例

    alert tcp any any -> any any (content:"ABC"; content: "DEF";distance:1;)
    此规则示例匹配的目的相当于正则表达式:/ABC.{1}DEF/

    2.5.7 within

    within选项修饰紧接之前的content选项,允许用户指定从上一个content选项匹配成功的串尾加上distance选项指定的字节数开始多少字节内搜索当within所修饰的这个content选项指定的匹配内容。此修饰选项与depth类似,只不过是相对于上一个content选项匹配成功的串尾加distance选项指定的字节数而不是相对于数据区净载的开头。

    2.5.7.1 格式

    within: <字节数>;

    2.5.7.2 示例

    alert tcp any any -> any any (content:"ABC"; content: "EFG"; within:10;)

    2.5.8 uricontent

    uricontent选项用于匹配正规化处理后URI字段。这意味着如果你写规则试图去匹配那些可能会被正规化处理掉的数据,比如常见用于遍历目录的“%2f”串,那么匹配就会失败。

    举例如下,URI:
    /scripts/..%c0%af../winnt/system32/cmd.exe?/c+ver
    会被正规化为:
    /winnt/system32/cmd.exe?/c+ver

    /cgi-bin/aaaaaaaaaaaaaaaaaaaaaaaaaa/..%252fp%68f?
    会被正规化为:
    /cgi-bin/phf?

    用uricontent选项写规则的时候必须指定匹配正规化以后的内容,不能包含遍历目录的字串,因为这些会被正规则化掉。如果想匹配正规化以前的数据请使用content选项。

    uricontent与HTTP检测预处理器结合使用。

    2.5.8.1 格式

    uricontent:[!]<content string>;

    2.5.9 isdataat选项

    此选项用于确认在指定的位置有多少字节的数据,有修饰选项指定相对于上一个content选项匹配成功的串尾开始。

    2.5.9.1 格式

    isdataat:<int>[,relative];

    2.5.9.2 示例

    alert tcp any any -> any 111 (content:"PASS"; isdataat:50,relative; content:!"|0a|"; distance:0;)
    此规则在数据区净载中搜索“PASS”字串,然后再确认至少在后面还有50字节的数据,并且不包含换行符。

    2.5.10 pcre选项

    pcre选项允许用户使用与PERL语言相兼容的正则表达式。相关正则表达式的具体细节参看PCRE的Web站点:http://www.pcre.org

    2.5.10.1 格式

    pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUB]";

    在表达式后的修饰符设置编译正则表达式的一些标志。

    Perl兼
  • 上一篇:Bro NIDS的安装与配置
    下一篇:bugscam分析