Snort rules概述

Snort规则被分成两个逻辑部分:规则头和规则选项。规则头包含规则的动作,协议,源和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。

1. 规则头:

规则动作:
  在snort中有五种动作:alert、log、pass、activate和dynamic.
   1、Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包。
   2、Log-记录这个包。
   3、Pass-丢弃(忽略)这个包。
   4、activate-报警并且激活另一条dynamic规则。
   5、dynamic-保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。
  协议类型:
  Snort当前分析可疑包的ip协议有四种:tcp 、udp、icmp和ip。将来可能会更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。
  地址:
  关键字"any"可以被用来定义任何地址。地址就是由直接的数字型ip地址和一个cidr块组成的。cidr块指示作用在规则地址和需要检查的进入的任何包的网络掩码。/24表示c类网络, /16表示b类网络,/32表示一个特定的机器的地址。
  否定操作符用"!"表示。
  你也可以指定ip地址列表,一个ip地址列表由逗号分割的ip地址和CIDR块组成,并且要放在方括号内“[”,“]”。此时,ip列表可以不包含空格在ip地址之间。
例如:
  alert tcp ![192.168.1.0/24,10.1.1.0/24] any -> [192.168.1.0/24,10.1.1.0/24] 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)
  变量定义:
  var MY_NET 192.168.1.0/24
  alert tcp any any -> $MY_NET any (flags: S; msg: "SYN packet";)
  注:"$" 操作符之后定义变量;
     "?" 和 "-"可用于变量修改操作符;

$var - 定义变量。
  $(var) - 用变量"var"的值替换。
  $(var:-default) - 用变量"var"的值替换,如果"var"没有定义用"default"替换。
  $(var:?message) - 用变量"var"的值替换或打印出错误消息"message"然后退出。
  例如:
var MY_NET $(MY_NET:-192.168.1.0/24)
log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23

端口号:
  端口号可以用几种方法表示,包括"any"端口、静态端口定义、范围、以及通过否定操作符。
  静态端口定义表示一个单个端口号,例如111表示portmapper,23表示telnet,80表示http等等。端口范围用范围操作符":"表示。范围操作符可以有数种使用方法,如下所示:
  log udp any any -> 192.168.1.0/24 1:1024
  记录来自任何端口的,目标端口范围在1到1024的udp流
  log tcp any any -> 192.168.1.0/24 :6000
  记录来自任何端口,目标端口小于等于6000的tcp流
  log tcp any :1024 -> 192.168.1.0/24 500:
  记录来自任何小于等于1024的特权端口,目标端口大于等于500的tcp流
  方向操作符:
  方向操作符"->"表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,还有一个双向操作符"<>"。

2. 规则选项:

规则选项组成了snort入侵检测引擎的核心,既易用又强大还灵活。所有的snort规则选项用分号";"隔开。规则选项关键字和它们的参数用冒号":"分开。例如:

  • msg - 在报警和包日志中打印一个消息。
  • flags -检查tcp flags的值。
  • content - 在包的净荷中搜索指定的样式。
    Content关键字的选项数据比较复杂;它可以包含混合的文本和二进制数据。二进制数据一般包含在管道符号中("|"),表示为字节码(bytecode)。字节码把二进制数据表示为16进制数字,是描述复杂二进制数据的好方法。例如:content: "|90C8 C0FF FFFF|/bin/sh";
    字符 : ; \ "在content选项内容中出现时必须被转义(有两个方法:1.用前导“\”字符 2. 使用字节的二进制表示方式,比如用“|3A|”表示“:”):
    内容匹配项的默认是区分大小写的;
  • offset - content选项的修饰符,设定开始搜索的位置 。
  • depth - content选项的修饰符,设定搜索的最大深度。
  • nocase - 指定对content字符串大小写不敏感。
  • distance - content选项的修饰符,设定模式匹配间的最小间距;
    distance关键字是content关键字的一个修饰词,确信在使用content时模式匹配间至少有N个字节存在。它被设计成在规则选项中和其他选项联合使用。
    格式:distance: ;
    例子:
    alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; distance: 1;)
  • within - content选项的修饰符,设定模式匹配间的最大间距;
    within关键字是content关键字的一个修饰词,确保在使用content时模式匹配间至多有N个字节存在。它被设计成在规则选项中和distance选项联合使用。
    格式:within: ;
    例子:
    alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; within: 10;)
  • byte_test - 数字模式匹配。
    把数据包净载中特定位置的字串转换为数值类型与指定的值进行比较。
    格式:byte_test: , , , [[relative],[big],[little],[string],[hex],[dec],[oct]]
  • bytes_to_convert 从数据包取得的字节数。
  • operator 对检测执行的操作 (<,>,=,!)。
  • value 和转换后的值相测试的值。
  • offset 开始处理的字节在负载中的偏移量。
  • relative 使用一个相对于上次模式匹配的相对的偏移量。
  • big 以网络字节顺序处理数据(缺省)。
  • little 以主机字节顺序处理数据。
  • string 数据包中的数据以字符串形式存储。
  • hex 把字符串数据转换成十六进制数形式。
  • dec 把字符串数据转换成十进制数形式。
  • oct 把字符串数据转换成八进制数形式。
    例子:
    alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"AMD procedure 7 plog overflow "; content: "|00 04 93 F3|"; content: "|00 00 00 07|"; distance: 4; within: 4; byte_test: 4,>, 1000, 20, relative;)
  • uricontent - 用于匹配正规化处理后URI字段。
    这个关键字允许只在一个请求的URI(URL)部分进行搜索匹配。它允许一条规则只搜索请求部分的攻击,这样将避免服务数据流的错误报警。关于这个关键字的参数的描述可以参考content关键字部分。这个选项将和HTTP解析器一起工作。(只能搜索第一个“/”后面的内容)。
    例如:uricontent:".emf";
  • Flow
    这个选项要和TCP流重建联合使用。它允许规则只应用到流量流的某个方向上。这将允许规则只应用到客户端或者服务器端。这将能把内网客户端流览web页面的数据包和内网服务器所发送的数据包区分开来。这个确定的关键字能够代替标志:A+ 这个标志在显示已建立的TCP连接时都将被使用。
    选项:
    to_client 触发上服务器从A到B的响应。
    to_server 触发客户端上从A到B的请求。
    from_client 触发客户端上从A到B的请求。
    from_server 触发服务器上从A到B的响应。
    established 只触发已经建立的TCP连接。
    stateless 不管流处理器的状态都触发(这对处理那些能引起机器崩溃的数据包很有用。
    no_stream 不在重建的流数据包上触发。
    only_stream 只在重建的流数据包上触发。
    格式:flow:[to_client|to_server|from_client|from_server|established|stateless|no_stream|only_stream]
    reference - 外部攻击参考ids。
    这个关键字允许规则包含一个外面的攻击识别系统。这个插件目前支持几种特定的系统,它和支持唯一的URL一样好。这些插件被输出插件用来提供一个关于产生报警的额外信息的连接。
  • sid - snort规则id。
    这个关键字被用来识别snort规则的唯一性。这个信息允许输出插件很容易的识别规则的ID号。
    sid 的范围是如下分配的:
    <100 保留做将来使用
    100-1000,000 包含在snort发布包中

1000,000 作为本地规则使用

  • rev - 规则版本号。
    这个关键字是被用来识别规则修改的。修改,随同snort规则ID,允许签名和描述被较新的信息替换。
  • classtype - 规则类别标识。
    这个关键字把报警分成不同的攻击类。通过使用这个关键字和使用优先级,用户可以指定规则类中每个类型所具有的优先级。
  • pcre:
    pcre选项允许用户使用与PERL语言相兼容的正则表达式。相关正则表达式的具体细节参看PCRE的Web站点:http://www.pcre.org
    pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUB]";
    在表达式后的修饰符设置编译正则表达式的一些标志。
    Perl兼容的修饰符:
    |i| 对大小不敏感
    |s| 在点转义符号中包含换行符, 一般情况下被匹配的缓冲区是作为一个大字符串
    |m| 的,和$分别匹配串头和串尾。当设置了m修饰符,和$匹配跟紧跟换行符和紧先导于换行符的情况
    |x| 要匹配的模式中的空格符被忽略,除非是被转义过的或在一个字符集中。
    PCRE兼容的修饰符:
    |A| 模式必须在缓冲区的开头匹配到(同^) 设置指定的$必须匹配到缓冲区末尾。如果不用E |
    |E| 修饰符,$则可能只匹配到串尾之前换行符。
    |G| 在默认情况下不使用“贪婪”模式,只有在模式后面跟了“?”字符的情况下贪婪。
    Snort特定的修饰符:
    |R| 此匹配相对于前一个匹配成功串尾开始(类似于distance:0)
    |U| 匹配解码后的URI缓冲区(类似于uricontent
    |B| 不使用解码后的缓冲区(类似于rawbytes)
    修饰符R和B不能同时使用。
    例如: alert ip any any -> any any (pcre:"/BLAH/i";)
    例子:
alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"WEB-CLIENT PNG large colour depth download attempt"; flow:from_server,established; content:"|89|PNG|0D 0A 1A 0A|"; content:"IHDR"; within:8; byte_test:1,>,16,8,relative;classtype:attempted-user; sid:3134; rev:3;reference:url,www.microsoft.com/technet/security/bulletin/MS05-009.mspx; )
alert tcp $EXTERNAL_NET any -> $HOME_NET 139 (msg:"NETBIOS SMB Trans Max Param/Count DOS attempt"; flow:established,to_server; content:"|00|"; depth:1; content:"|FF|SMB%"; within:5; distance:3; byte_test:1,!&,128,6,relative; pcre:"/^.{27}/sR"; content:"|00 00 00 00|"; within:4; distance:5;reference:url,www.corest.com/common/showdoc.php?idx=262;classtype:protocol-command-decode; sid:2101; rev:15;)
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"SPYWARE-PUT Hijacker shop at home select installation in progress"; flow:to_server,established; uricontent:"GRInstallCL.asp"; nocase; uricontent:"E="; nocase; uricontent:"MID="; nocase; uricontent:"Refer="; nocase; uricontent:"WGR="; nocase; uricontent:"Prev="; nocase; uricontent:"sGUID="; nocase; classtype:misc-activity; sid:5810; rev:1;)

正则表达式元字符的解释:
\: 转移字符,将后一个字符标记为一个特殊字符
^:匹配输入字串的开始位置
$:匹配输入字串的结束位置
*:匹配前面的子表达式0次或多次
+:匹配前面的子表达式1次或多次
?:匹配前面的子表达式0次或1次
{n,m}:匹配至少n次,至多m次
.:匹配到除"\n"之外的所有单个字符
[]:表示一个字符集,可以单个列出,如[amk$];也可以加一个"-"表示一个字符范围,如[a-z];匹配任意一个字符即可;也可以用补集来匹配不在区间范围内的字符。其做法是把""作为类别的首个字符;其它地方的""只会简单匹配 ""字符本身,例如[5] 将匹配除 "5" 之外的任意字符。
例如:
pcre:"/X-Mailer\x3A[\r\n]*mPOP\s+Web-Mail/smi";
pcre:"/Host\x3A[\r\n]*e2give.com/smi";
pcre:"/User-Agent\x3A[\r\n]*NSISDL/smi";
pcre:"/Host\x3A[\r\n]*push\x2Ecom/smi";
...
注:\x 后为十六进制转义值
\r 匹配一个回车符
\n 匹配一个换行符
\s 匹配任何空白字符
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。

摘自百度文库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,948评论 1 13
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,650评论 24 1,002
  • 前言 防火墙可以比喻为办公室门口的警卫,用来检查进出者的身份。而入侵检测系统就像是网上的警报器,当发现入侵者时,指...
    小天是我见过最单纯善良的人阅读 32,536评论 1 15
  • 初恋的铭心,大概是即使知道结局会是无疾而终,仍旧甘愿飞蛾扑火。 如果加上禁忌的束缚,就会更加凸显这种矛盾挣扎。 1...
    F_zutter阅读 492评论 3 3