• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

恶意代码技术理论:Sonrt规则

恶意代码技术理论 云涯 来源:Snort 用户手册 3年前 (2021-07-01) 2353次浏览

1 Sonrt规则概述

在1998年,Martin Roesch用C语言开发了开放源代码的IDS入侵检测系统Snort。直至今天,Snort已发展成为一个具有多平台、实时流量分析、网络IP数据包记录等特性的强大的网络入侵检测/防御系统,即NIDS/NIPS。当Snort作为NIDS模式运行时,可以分析网络传输的数据包,它发现可疑流量时就会根据事先定义好的规则发出报警。

官网:https://www.snort.org/

中文手册:http://www.kaiyuanba.cn/content/network/snort/Snortman.htm

英文手册:https://paginas.fe.up.pt/~mgi98020/pgr/writing_snort_rules.htm

GUI:https://sourceforge.net/projects/secureideas/   和  http://sguil.sourceforge.net/

Snort有三种工作模式

  • 嗅探器:仅仅是从网络上读取数据包并作为连续不断的流显示在终端上
  • 数据包记录器:把数据包记录到硬盘上
  • 网络入侵检测系统:网路入侵检测模式是最复杂的,而且是可配置的。我们可以让snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。

1.1 嗅探器

所谓的嗅探器模式就是snort从网络上读出数据包然后显示在你的控制台上。

如果你只要把TCP/IP包头信息打印在屏幕上,只需要输入下面的命令:./snort -v

如果要在看应用层数据:./snort -vd

还要显示数据链路层的信息:./snort -vde

1.2 数据包记录器

如果要把所有的包记录到硬盘上,你需要指定一个日志目录,snort就会自动记录数据包:./snort -dev -l ./log,当然,./log目录必须存在,否则snort就会报告错误信息并退出。

当snort在这种模式下运行,它会记录所有看到的包将其放到一个目录中,这个目录以数据包目的主机的IP地址命名,例如:192.168.10.1

如果你只指定了-l命令开关,而没有设置目录名,snort有时会使用远程主机的IP地址作为目录,有时会使用本地主机IP地址作为目录名。为了只对本地网络进行日志,你需要给出本地网络:./snort -dev -l ./log -h 192.168.1.0/24,这个命令告诉snort把进入C类网络192.168.1的所有包的数据链路、TCP/IP以及应用层的数据记录到目录./log中。

如果你的网络速度很快,或者你想使日志更加紧凑以便以后的分析,那么应该使用二进制的日志文件格式。所谓的二进制日志文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包记录到一个单一的二进制文件中:./snort -l ./log -b

1.3 网络入侵检测系统

snort最重要的用途还是作为网络入侵检测系统(NIDS),使用下面命令行可以启动这种模式: ./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf

snort.conf是规则集文件。snort会对每个包和规则集进行匹配,发现这样的包就采取相应的行动。如果你不指定输出目录,snort就输出到/var/log/snort目录。

snort有6种报警机制:full、fast、socket、syslog、smb(winpopup)和none。其中有4个可以在命令行状态下使用-A选项设置。这4个是:

  • -A fast:报警信息包括:一个时间戳(timestamp)、报警消息、源/目的IP地址和端口。
    -A full:是默认的报警模式。
    -A unsock:把报警发送到一个UNIX套接字,需要有一个程序进行监听,这样可以实现实时报警。
    -A none:关闭报警机制。

2 编些Snort规则

  • 大多数snort规则都写在一个单行上,或者在多行之间的行尾用/分隔。
  • Snort规则被分成两个逻辑部分:规则头和规则选项。
    • 规则头包含规则的动作,协议,源和目标ip地址与网络掩码,以及源和目标端口信息;
    • 规则选项部分包含报警消息内容和要检查的包的具体部分。

例如:  alert tcp any any -> 192.168.1.0/24 111 (content:”|00 01 86 a5|”; msg: “mountd access”;)

规则头: alert tcp any any -> 192.168.1.0/24 111

规则选项:(content:”|00 01 86 a5|”; msg: “mountd access”;)

规则选项中的规则关键字:content  、msg

注意,不是所有规则都必须包含规则选项部分,选项部分只是为了使对要收集或报警,或丢弃的包的定义更加严格。

2.1 规则头

规则的头包含了定义一个包的  whowherewhat信息,以及当满足规则定义的所有属性的包出现时要采取的行动

2.1.1  规则动作

“规则动作”告诉snort在发现匹配规则的包时要干什么。在snort中有五种动作:

  • alert
  • log
  • pass
  • activate
  • dynamic

1. alert – 使用选择的报警方法生成一个警报,然后记录(log)这个包。

2. log – 记录这个包

3. pass – 丢弃这个包

4. activate – 报警并激活另一条dynamic规则

5. dynamic – 保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。

6. Activate 和 dynamic 规则将被tagging 所代替。在snort的将来版本,Activate 和 dynamic 规则将完全被功能增强的tagging所代替。

7.Activate 和 dynamic规则对 :

  • Actevate规则除了类似一条alert规则外,当一个特定的网络事件发生时还能告诉snort加载一条规则。
  • Dynamic规则和log规则类似,但它是当一个activate规则发生后被动态加载的。
  • activate tcp !$HOME_NET any -> $HOME_NET 143 (flags: PA; content: “|E8C0FFFFFF|/bin”; activates: 1; msg: “IMAP buffer overflow!”;)
    dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by: 1; count: 50;)

 

2.1.2 协议 

Snort当前分析可疑包的ip协议有四种:tcp 、udp、icmp和ip。将来可能会更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。

2.1.3 IP地址

给定规则的ip地址和端口号信息。关键字”any”可以被用来定义任何地址。

Snort没有提供根据ip地址查询域名的机制。地址就是由直接的数字型ip地址和一个cidr块组成的。/24表示c类网络,/16表示b类网络,/32表示一个特定的机器的地址。

否定运算符(!)告诉snort匹配除了列出的IP地址外的其他地址。例如以下就是匹配除本地网络外的所有流,进行报警。

alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: “|00 01 86 a5|”; msg: “external mountd access”;)

也可以指定地址列表,要放到方括号内([])如下所示:

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”;)

2.1.4 端口号

端口号可以用几种方法表示,包括”any”端口、静态端口定义、范围、以及通过否定操作符.”

  • any”端口是一个通配符,表示任何端口;
  • 静态端口号例如80;
  • 端口范围用范围操作符“:”表示,例如80:1024,就是80到1024端口之间的所有端口
    • 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流
  • 否定操作符(!)代表除该端口范围内的其他端口,例如:log tcp any any -> 192.168.1.0/24 !6000:6010

2.1.5 方向操作符

方向操作符”->”表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是来自的源主机,方向操作符右边的ip地址和端口信息是目标主机。

双向操作符”<>”,代表把地址/端口号对既作为源,又作为目标来考虑。这对于记录/分析双向对话很方便。例如:

log !192.168.1.0/24 any <> 192.168.1.0/24 23

2.2 规则选项

规则选项组成了snort入侵检测引擎的核心,既易用又强大还灵活。所有的snort规则选项用分号”;”隔开。

规则选项关键字和它们的参数用冒号”:”分开。一共有42个规则选项关键字。

 

msg – 在报警和包日志中打印一个消息 告诉记录和报警引擎,记录或报警一个包的内容的同时打印的消息。格式是msg:””;
logto – 把包记录到用户指定的文件中而不是记录到标准输出 这在把来自诸如nmap活动,http cgi扫描等等的数据组合到一起时很方便。,格式:logto:”filename”;
ttl – 检查ip头的ttl的值 用于设置一个要检查的存活期的值。这个选项关键字用于检测traceroute。格式:ttl:
tos 检查IP头中TOS字段的值 允许验证IP头中TOS字段为一个特殊的值。只有匹配时才执行成功。格式:tos:
id – 检查ip头的分片id值 为了各种目的设置这个域的值,例如一些黑客常使用31337。格式:id:
ipoption 查看IP选项字段的特定编码 Ipoption选项会查找使用中的某个特别IP选项,比如源路由。格式:ipoption:option

rr – Record route(记录路由)
eol – End of list (列表结尾)
nop – No op (无所作为)
ts – Time Stamp (时间戳)
sec – IP security option (IP安全选项)
lsrr – Loose source routing (松散源路由)
ssrr – Strict source routing (严格源路由)
satid – Stream identifier (流标示符)

fragbits 检查IP头的分段位 检测IP头中的分段和保留位字段的值,共有三个位能被检测,保留位RB(Reserved Bit ), 更多分段位MF(More Fragments ), 和不分段位DF(Don’t Fragment)。使用下面的值来代表这些位,R-RB,M-MF,D-DF。你也可以使用修饰语对特殊的位来指出合理的匹配标准:* + 所有标记匹配特殊位外加任何其他*;*-任何标记匹配如果任何位被设置为*;!如果指定位没有设置就没有标记匹配。格式:fragbits:   ,例如:alert tcp !$HOME_NET any -> $HOME_NET any (fragbits: R+; msg: “Rerserved bit set!”;)
dsize – 检查包的净荷尺寸的值 用于检查包的净荷的大小。它可以设置成任意值,可以使用大于/小于符号来指定范围。格式:dsize: [<>][<>];
content – 在包的净荷中搜索指定的样式 它允许用户设置规则在包的净荷中搜索指定的内容并根据内容触发响应。大小写敏感。Content关键字的选项数据比较复杂;它可以包含混合的文本和二进制数据。二进制数据一般包含在管道符号中(”|”),表示为字节码(bytecode)。格式:content: [!] “”;  例子:alert tcp any any -> 192.168.1.0/24 143 (content: “|90C8 C0FF FFFF|/bin/sh”; msg: “IMAP buffer overflow!”;)
offset – content选项的修饰符,设定开始搜索的位置  这个关键字修饰符指定模式匹配函数从包净荷开始处开始搜索的偏移量。这个规则选项关键字必须和content规则选项一起使用。格式:offset:
depth – content选项的修饰符,设定搜索的最大深度 它设置了内容模式匹配函数从他搜索的区域的起始位置搜索的最大深度。例子:alert tcp any any -> 192.168.1.0/24 80 (content: “cgi-bin/phf”; offset: 3; depth: 22; msg: “CGI-PHF access”;),净荷头不超过22字节。
nocase – 指定对content字符串大小写不敏感 例子:alert tcp any any -> 192.168.1.0/24 21 (content: “USER root”; nocase; msg: “FTP root user access attempt”;)
flags -检查tcp flags的值 这个规则检查tcp标志。

格式:flags: [,mask value];例子:alert any any -> 192.168.1.0/24 any (flags: SF,12; msg: “Possible SYN FIN scan”;)

在snort中有9个标志变量:

F – FIN (LSB in TCP Flags byte)
S – SYN
R – RST
P – PSH
A – ACK
U – URG
2 – Reserved bit 2
1 – Reserved bit 1 (MSB in TCP Flags byte)
0 – No TCP Flags Set

在这些标志之间还可以使用逻辑操作符:
+ ALL flag, 匹配所有的指定的标志外加一个标志。
* ANY flag, 匹配指定的任何一个标志。
! NOT flag, 如果指定的标志不在这个数据包中就匹配成功。
保留位可以用来检测不正常行为,例如IP栈指纹攻击或者其他可疑的行为。

seq – 检查tcp顺序号的值 基本上,它探测一个包是否有一个静态的顺序号集,因此很少用。它是为了完整性而包含进来的。格式:seq:
ack – 检查tcp应答(acknowledgement)的值 这个规则的一个实用的目的是:检查nmap tcp ping,nmap tcp ping把这个域设置为0,然后发送一个tcp ack flag置位的包来确定一个网络主机是否活着。例子:alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: “NMAP TCP ping”;)
window 测试TCP窗口域的特殊值 这个选项检查静态窗口大小,此外别无他用。
itype – 检查icmp type的值 应该注意的是,type字段的取值可以超过正常范围,这样可以检查用于拒绝服务或flooding攻击的非法type值的ICMP包。
icode – 检查icmp code的值
icmp_id – 检查ICMP ECHO ID的值 许多秘密通道(covert channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。
icmp_seq – 检查ICMP ECHO 顺序号的值
content-list 在数据包载荷中搜索一个模式集合
session – 记录指定会话的应用层信息的内容 用于从TCP会话中抽取用户数据。要检查用户在telnet,rlogin,ftp或websessions中的用户输入,这个规则选项特别有用。Session规则选项有两个可用的关键字作为参数:printable或all。例子log tcp any any <> 192.168.1.0/24 23 (session: printable;)

Printable关键字仅仅打印用户可以理解或者可以键入的数据。

All关键字使用16进制值来表示不可打印的字符。

rpc – 监视特定应用/进程调用的RPC服务 这个选项查看RPC请求,并自动将应用(Application)、过程(procedure)和程序版本(programversion)译码,如果所有三个值都匹配的话,该规则就显示成功。

例子
alert tcp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:”RPC getport (TCP)”;)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:”RPC getport (UDP)”;)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100083,*,*; msg:”RPC ttdb”;)

resp – 主动反应(切断连接等) FlexResp代码允许Snort主动地关闭恶意的连接。该插件合法的参数如下:

rst_snd – 向发送方发送TCP-RST数据包
rst_rcv – 向接受方发送TCP-RST数据包
rst_all – 向收发双方发送TCP_RST数据包
icmp_net – 向发送方发送ICMP_NET_UNREACH
icmp_host – 向发送方发送ICMP_HOST_UNREACH
icmp_port – 向发送方发送ICMP_PORT_UNREACH
icmp_all – 向发送方发送上述所有的ICMP数据包

content_list 允许多内容字符串被放在一个单独的内容匹配选项中 被匹配的字符串被存放在指定的文件中,而且每个字符串要单独占用一行。否则他们就等同于一个content字符串。这个选项是react关键字的基础。例如

下面是一个文件的内容:
# adult sites
“porn”
“porn”
“adults”
“hard core”
“www.pornsite.com”

react – 响应动作(阻塞web站点) 基本的反应是阻塞一些引人注意的站点的用户的访问。响应代码允许snort积极的关掉有冒犯行为的访问和/或发送一个通知给浏览者。这个通知可以包含你自己的注释。这个选项包括如下的基本修饰词:

block——关闭连接并且发送一个通知
warm——发送明显的警告信息
基本修饰词可以和如下的附加修饰词组合使用:
msg——把msg选项的内容包含进阻塞通知信息中
proxy——使用代理端口发送通知信息
大量的附加修饰词由逗号隔开,react 关键字将被放在选项的最后一项。

例如:alert tcp any any <> 192.168.1.0/24 80 (content: “bad.htm”; msg: “Not for children!”; react: block, msg;)

reference – 外部攻击参考ids 这个关键字允许规则包含一个外面的攻击识别系统。

例子:
alert tcp any any -> any 7070 (msg: “IDS411/dos-realaudio”; flags: AP; content: “|fff4 fffd 06|”; reference: arachNIDS,IDS411;)
alert tcp any any -> any 21 (msg: “IDS287/ftp-wuftp260-venglin-linux”; flags: AP; content: “|31c031db 31c9b046 cd80 31c031db|”; reference: arachNIDS,IDS287; reference: bugtraq,1387; reference: cve,CAN-2000-1574; )

sid – snort规则id 这个关键字被用来识别snort规则的唯一性。

sid 的范围是如下分配的:<100 保留做将来使用
100-1000,000 包含在snort发布包中
>1000,000 作为本地规则使用

rev – 规则版本号
classtype – 规则类别标识 这个关键字把报警分成不同的攻击类。通过使用这个关键字和使用优先级,用户可以指定规则类中每个类型所具有的优先级
priority – 规则优先级标识号 这个关键字给每条规则赋予一个优先级
uricontent – 在数据包的URI部分搜索一个内容 这个关键字允许只在一个请求的URI(URL)部分进行搜索匹配。它允许一条规则只搜索请求部分的攻击,这样将避免服务数据流的错误报警
tag – 规则的高级记录行为 这个关键字允许规则记录不仅仅是触发这条规则的那个数据包。一旦一条规则被触发,来自这个主机的数据包将被贴上“标签”。被贴上标签的数据流将被记录用于随后的响应代码和提交攻击流量的分析。

session 记录触发这条规则的会话的数据包
host 记录激活tag规则的主机的所有数据包(这里将使用[direction]修饰词
count Count 指定一个单位的数量。这个单位由给出。
metric
packets 标记主机/会话的个数据包。
seconds 标记主机/会话的秒。

例子:
alert tcp !$HOME_NET any -> $HOME_NET 143 (flags: A+; content: “|e8 c0ff ffff|/bin/sh”; tag: host, 300, packets, src; msg: “IMAP Buffer overflow, tagging!”;)
alert tcp !$HOME_NET any -> $HOME_NET 23 (flags: S; tag: session, 10, seconds; msg: “incoming telnet session”;)

ip_proto – IP头的协议字段值 Ip_proto关键字允许检测IP协议头。这些协议可以是由名字标识的。

例子: alert ip !$HOME_NET any -> $HOME_NET any (msg: “IGMP traffic detected”; ip_proto: igmp;)

sameip – 判定源IP和目的IP是否相等 例子:alert ip $HOME_NET any -> $HOME_NET any (msg: “SRC IP == DST IP”; sameip;)
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 不在重建的流数据包上触发(对dsize 和 stream4 有用。
only_stream 只在重建的流数据包上触发。格式:
flow:[to_client|to_server|from_client|from_server|established|stateless|no_stream|only_stream]}例子:
alert tcp !$HOME_NET any -> $HOME_NET 21 (flow: from_client; content: “CWD incoming”; nocase; msg: “cd incoming detected”; )
alert tcp !$HOME_NET 0 -> $HOME_NET 0 (msg: “Port 0 TCP traffic”; flow: stateless;)

Fragoffset  这个关键字允许把IP分段偏移值和一个十进制数相比较 为了抓到一个IP会话的第一个分段,你可以使用这个fragbits关键字并且和fragoffset:0 选项一起查看更多的分段选项。格式:fragoffset:[<|>]例子:
alert ip any any -> any any (msg: “First Fragment”; fragbits: M; fragoffset: 0;)
Rawbytes  Rawbytes关键字允许规则查看telnet 解码数据来处理不常见的数据 这将使得telnet 协议代码独立于预处理程序来检测。这是对前面的content 的一个修饰。格式:rawbytes;例子:alert tcp any any -> any any (msg: “Telnet NOP”; content: “|FF F1|”; rawbytes;)
stateless – 忽略刘状态的有效性
regex – 通配符模式匹配

 

distance – 强迫关系模式匹配所跳过的距离 是content关键字的一个修饰词,确信在使用content时模式匹配间至少有N个字节存在。它被设计成在规则选项中和其他选项联合使用。格式:distance: ;例子:alert tcp any any -> any any (content: “2 Patterns”; content: “ABCDE”; content: “EFGH”; distance: 1;)
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;)

alert tcp $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;)

byte_jump – 数字模式测试和偏移量调整 选项用来取得一定数量的字节,并把它们转换成数字形式,跳过一些字节以进一步进行模式匹配。这就允许相对模式匹配在网络数据中进行数字值匹配。

格式:
byte_jump: , [[relative],[big],[little],[string],[hex],[dec],[oct],[align]]bytes_to_convert 从数据包中选出的字节数。
offset 开始处理的字节在负载中的偏移量。
relative 使用一个相对于上次模式匹配的相对的偏移量。
big 以网络字节顺序处理数据(缺省)。
little 以主机字节顺序处理数据。
string 数据包中的数据以字符串形式存储。
hex 把字符串数据转换成十六进制数形式。
dec 把字符串数据转换成十进制数形式。
oct 把字符串数据转换成八进制数形式。
align 以32位为边界对转换的字节数对齐,即转换的字节数为4的倍数。例子:
alert udp any any -> any 32770:34000 (content: “|00 01 86 B8|”; content: “|00 00 00 01|”; distance: 4; within: 4; byte_jump: 4, 12, relative, align; byte_test: 4, >, 900, 20, relative; msg: “statd format string buffer overflow”;)

 

3 预处理程序

用户和程序员能够将模块化的插件方便地融入Snort之中。预处理程序代码在探测引擎被调用之前运行,但在数据包译码之后。通过这个机制,数据包可以通过额外的方法被修改或分析。

3.1 preprocessor关键字

使用preprocessor关键字加载和配置预处理程序。

  • preprocessor :  例子:preprocessor minfrag: 128
  • HTTP Decode:HTTP Decode用于处理HTTP URI字符串并且将串中的数据转化为可读的ASCII字串。HTTP对于一些特性定义了一个十六进制编码方法,例如字符串%20被解释成一个空格。Web服务器被设计成能够处理无数的客户端并且支持多种不同的标准。
    • 格式:http_decode: [unicode] [iis_alt_unicode][double_encode] [iis_flip_slash] [full_whitespace]
    • 例子:preprocessor http_decode: 80 8080 unicode iis_flip_slash iis_alt_unicode

3.2 Portscan Detector

Snort Portscan预处理程序的用处:

向标准记录设备中记录从一个源IP地址来的端口扫描的开始和结束。如果指定了一个记录文件,在记录扫描类型的同时也记录目的IP地址和端口。端口扫描定义为在时间T(秒)之内向超过P个端口进行TCP连接尝试,或者在时间T(秒)之内向超过P个端口发送UDP数据包。端口扫描可以是对任一IP地址的多个端口,也可以是对多个IP地址的同一端口进行。现在这个版本可以处理一对一和一对多方式的端口扫描,下一个完全版本将可以处理分布式的端口扫描(多对一或多对多)。端口扫描也包括单一的秘密扫描(stealthscan)数据包,比如NULL,FIN,SYNFIN,XMAS等。如果包括秘密扫描的话,端口扫描模块会对每一个扫描数据包告警。为避免这种情况,可以在Snort标准发行版中的scan-lib文件里把有关秘密扫描数据包的小节注释掉,这样对每次扫描就只记录一次。如果使用外部记录特性,可以在记录文件中看到(端口扫描的?)技术和类型。

该模块的参数如下:

  • network to monitor – 监视端口扫描的目标网络以network/CIDR表示。
  • number of ports – 在探测期间访问的端口数目。
  • detection period – 以秒计数的端口访问时间限制。
  • logdir/filename – 告警信息存放的目录/文件名,告警也可以写入标准的告警文件

格式:portscan:

例子:preprocessor portscan: 192.168.1.0/24 5 7 /var/log/portscan.log

3.3 Portscan Ignorehosts

如果用户的服务器(比如NTP,NFS和DNS服务器)会妨碍端口扫描的探测,可以通知portscan模块忽略源自这些主机的TCP SYN和UDP端口扫描。该模块的参数为IPs/CIDR的列表。

格式:portscan-ignorehosts:

例子:preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24

3.4 Frag2

Frag2是一个新的IP碎片重组预处理器。Frag2的内存使用和碎片时间超时选项是可配置的。不给出参数,frag2将使用缺省的内存量(4MB)和时间超时值(60秒)。这个时间值用来决定一个没有重组的分段将被丢弃的时间长度。

格式:preprocessor frag2: [memcap ], [timeout ], [min_ttl ], [detect_state_problems

  • timeout 在状态表中保存一个不活跃的流的最大时间值,如果发现活动就重新刷新对话并且这个会话被自动拾起。缺省值是30秒。
  • memcap 内存消耗的最大值,如果超出这个值,frag2就强制削减那些不活跃的会话,缺省值是4MB。detect_state_problems turns on alerts for events such as overlapping fragments
  • min_ttl 设置frag2接受的最小ttl值。
  • detect_state_problems 发现重叠分段时报警。
  • ttl_limit 设置ttl的极限值,它可以避免报警。 (初始化段 TTL +/- TTL Limit)

例子:preprocessor frag2: memcap 16777216, timeout 30

3.5 Stream4

Stream4模块使snort 具有TCP流从新组装和状态分析能力。强壮的流重组能力使得snort能够忽视无“状态”攻击,例如,stick粘滞位攻击。Stream4也能够给大量用户提供超过256个TCP同步连接。Stream4缺省配置时能够处理32768个TCP同步连接。Stream4有两个可配置的模块,stream4preprocessor 和相关的 stream4_reassemble 插件。

stream4_reassemble有如下选项:

preprocessor stream4: [noinspect], keepstats [machine|binary], [timeout ], [memcap ], [detect_scans], [detect_state_problems], [disable_evasion_alerts], [ttl_limit ]

  • noinspect 关闭状态监测能力。
  • keepstats [machine|binary] 保持会话统计,如果是“machine”选项就从机器以平坦的模式读入,如果是“binary”选项就用统一的二进制模式输出。
  • timeout 在状态表中保存一个不活跃的流的最大时间值,如果发现活动就重新刷新对话并且这个会话被自动拾起。缺省值是30秒。
  • memcap 内存消耗的最大值,如果超出这个值,frag2就强制削减那些不活跃的会话,缺省值是8MB。
  • detect_scans 打开portscan 的报警能力。
  • detect_state_problems 打开流事件报警能力,例如,没有RST的数据包、带有数据的SYN包和超出窗口序列号的包。
  • disable_evasion_alerts 关闭事件报警能力,例如,TCP重叠。
  • ttl_limit 设置ttl的极限值。

3.6 Stream4_Reassemble

preprocessor stream4_reassemble: [clientonly], [serveronly],[noalerts], [ports ]

  • clientonly 对一个连接的客户端提供重组
  • serveronly 对一个连接的服务器端提供重组
  • noalerts 对于插入和逃避攻击事件不发出报警
  • ports – 一个空格分隔的执行重组的端口列表,all将对所有的端口进行重组。缺省对如下端口重组: 21 23 25 53 80 110 111 143 和 513

 

注: 在配置文件中仅仅设置stream4和stream4_reassemble 命令而没有参数,它们将会使用缺省的参数配置。Stream4引入了一个新的命令行参数:-z 。在TCP流量中,如果指定了 –z 参数,snort将只对那些通过三次握手建立的流以及那些协作的双向活动的流(即,一些流量走一个方向而其他一些除了一个RST或FIN外走相反方向)检测报警。当设置了-z 选项后snort就完全忽略基于TCP的stick/snot攻击。

3.7 Conversation

Conversation 预处理器使Snort 能够得到关于协议的基本的会话状态而不仅仅是由spp_stream4处理的TCP状态。目前它使用和stream4相同的内存保护机制,所以它能保护自己免受DOS攻击。当它接收到一个你的网络不允许的协议的数据包时,它也能产生一个报警信息。要做到这一点,请在IP协议列表中设置你允许的IP协议,并且当它收到一个不允许的数据包时,它将报警并记录这个数据包。

preprocessor conversation: [allowed_ip_protocols ], [timeout ], [alert_odd_protocols], [max_conversations ]

3.8 Portscan2

这个模块将检测端口扫描。它要求包含Conversation预处理器以便判定一个会话是什么时间开始的。它的目的是能够检测快速扫描,例如,快速的nmap扫描。

preprocessor portscan2: [scanners_max ], [targets_max ], [target_limit ], [port_limit ], [timeout ]

  • scaners_max 一次所支持的扫描一个网络的主机数
  • targets_max 分配代表主机的节点的最大数
  • target_limit 在一个扫描触发前,一个扫描器所允许扫描的最大的主机数
  • port_limit 在一个扫描触发前,一个扫描器所允许扫描的最大的端口数
  • timeout 一个扫描行为被忘记的秒数

3.9 Telnet Decode

telnet_decode 预处理器使snort能够标准化telnet会话数据的控制协议字符。它把数据包规格和成单独的数据缓存,这样原始数据就能够通过rawbytes content 修饰词来记录或者检验了。缺省情况下,它运行在21, 23, 25, 和119端口.

preprocessor telnet_decode:

3.10 RPC Decode

Rpc_decode 预处理器将RPC的多个碎片记录组合成一个完整的记录。它是通过将数据包放在标准缓存中来做到这一点的。如果打开stream4预处理器功能。它将只处理客户端的流量。它缺省运行在 111和 32771端口。

preprocessor rpc_decode: [ alert_fragments ] [no_alert_multiple_requests] [no_alert_large_fragments] [no_alert_incomplete]

3.11 Perf Monitor

这个模块是用来评估snort各方面性能的一个工具。它的输出格式和参数格式都是变化的,在这里就不给出注释了。

3.12 Http Flow

使用这个模块可以忽略HTTP头后面的HTTP服务响应。

 

4 输出插件

输出插件使得Snort在向用户提供格式化输出时更加灵活。输出插件在Snort的告警和记录子系统被调用时运行,在预处理程序和探测引擎之后。规则文件中指令的格式非常类似于预处理程序。使用output输出:output alert_syslog: LOG_AUTH LOG_ALERT

4.1 alert_syslog参数

向syslog设备发送告警。该插件也允许用户指定记录设备,优先于Snort规则文件中的设定,从而在记录告警方面给用户更大的灵活性。

例如:output alert_syslog: LOG_AUTH LOG_ALERT

可用关键字如下:

选项(Options)

  • LOG_CONS
  • LOG_NDELAY
  • LOG_PERROR
  • LOG_PID

设备(Facilities)

  • LOG_AUTH
  • LOG_AUTHPRIV
  • LOG_DAEMON
  • LOG_LOCAL0
  • LOG_LOCAL1
  • LOG_LOCAL2
  • LOG_LOCAL3
  • LOG_LOCAL5
  • LOG_LOCAL6
  • LOG_LOCAL7
  • LOG_USER

优先级(Priorities)

  • LOG_EMERG
  • LOG_ALERT
  • LOG_CRIT
  • LOG_ERR
  • LOG_WARNING
  • LOG_NOTICE
  • LOG_INFO
  • LOG_DEBUG

4.2 alert_fast参数

将报警信息快速的打印在指定文件的一行里。它是一种快速的报警方法,因为不需要打印数据包头的所有信息。

例子:output alert_fast: alert.fast

4.3  alert_full参数

打印数据包头所有信息的报警。这些报警信息写到缺省的日志目录(/var/log/snort)或者写到命令行指定的目录。在日志目录内,每个IP都创建一个目录。产生报警的数据包被解码后写到这个目录下的文件里。这些文件的创建将大大降低snort的性能。所以这种输出方法对大多数不适用,但那些轻量级的网络环境还是可以使用的。

例子:output alert_full: alert.full

4.4 alert_smb参数

这个插件将把WinPopup报警信息发送给NETBIOS命名的机器上的一个文件。并不鼓励使用这个插件,因为它以snort权限执行了一个外部可执行二进制程序,通常是root权限。那个工作站上接受报警信息的文件每行存放一条报警信息。

例子;output alert_smb: workstation.list

4.5 alert_unixsock参数

打开一个UNIX套接字,并且把报警信息发送到那里。外部的程序/进程会在这个套接字上侦听并实时接收这些报警数据。

例子:output alert_unixsock

4.6 log_tcpdump参数

log_tcpdump插件将数据包记录到tcpdump格式的文件中。这便于使用已有的多种检查tcpdump格式文件的工具,来对收集到的流量数据进行后处理工作。该插件只接受一个参数,即输出文件名。

例子:output log_tcpdump: snort.log

4.7 database参数

该插件由Jed Pickel提供将Snort数据记录到Postgres SQL数据库中。更多的有关安装和配置该插件的信息可以在Incident.org (http://www.incident.org/snortdb)找到。这个插件的参数是数据库名称和一个参数列表。参数由格式parameter = argument来指定。

可用参数如下:

  • host – 连接主机。如果指定了一个非零字串,就使用TCP/IP通讯。如果不指定主机名,就会使用Unix domain socket连接。
  • port – 连接服务器主机的端口号,或者是Unix-domain连接的socket文件名扩展。
  • dbname – 数据库名。
  • user – 数据库中身份认证用的用户名。
  • password – 如果数据库要求口令认证,就使用这个口令。
  • sensor_name 为snort指定一个你自己的名字。如果你不指定,这里就自动产生一个。
  • encoding 因为数据包负载和选项都是二进制的,所以没有一个轻便简单的方法把它存储在数据库中。没有使用BLOBS,因为它们在穿越数据库时不是那么轻便的。所以,我们提供了一个encoding 选项给你。你可以从下面的选项中选择。它们有各自的优缺点。
  • hex (default) 把二进制数据表示成十六进制字符串
  • storage requirements – 二进制的二倍容量
  • searchability – 很好用
  • human readability – 不是很好读除非你很滑稽,要求邮件处理。
  • base64 把二进制数据表示成以64为基的字符串。
  • storage requirements二进制的1.3倍容量。
  • searchability – 没有邮件处理是不可能的。
  • human readability –不易读,要求邮件处理。
  • ascii 把二进制数据表示成 ascii 码字符串。这是唯一的可以释放数据的选项。非ascii码数据用… 代替。即使你选择了这个选项,ip和tcp选项数据还将用十六进制表示,因为那些数据用ascii码标上没有任何意义。
  • storage requirements – 稍微比二进制大,因为避免了一些字符(&,<,>)。
  • searchability – 对于搜索文本字符串很好用,而搜索二进制串是不可能的。
  • human readability – 很好用。
  • detail 你想存储多少细节数据,有如下选项:
  • full (缺省值)记录一个引起报警数据包的所有的细节(包括ip/tcp选项和负载)。
    • fast 只记录少量数据。如果选择了这个选项,你将削减了潜在的分析能力,但这仍是一些应用的最佳选项。这将记录下面的字段(timestamp, signature, source ip, destination ip, source port, destination port, tcp flags, and protocol)

此外,还必须定义一个记录方法和数据库类型。有两种记录方法,log和alert。设置为log类型,将启动这个程序的数据库记录功能。如果你设置为log类型,输出链表将调用这个插件。设置为alert类型,将启动这个程序的数据库报警输出功能。
当前共有四种数据库类型:MySQL, PostgreSQL, Oracle, 和 unixODBC-兼容数据库。

output database: log, mysql, dbname=snort user=snort host=localhost password=xyz

4.8 CSV参数

CSV输出插件可以将报警数据以一种方便的形式输出到一个数据库。这个插件要求两个参数,一个全路径文件名和输出模式选项。下面是模式选项列表。如果模式选项缺省,就按模式选项列表中的顺序输出。

timestamp
msg
proto
src
srcport
dst
dstport
ethsrc
ethdst
ethlen
tcpflags
tcpseq
tcpack
tcplen
tcpwindow
ttl
tos
id
dgmlen
iplen
icmptype
icmpcode
icmpid
icmpseq

例子:
output alert_CSV: /var/log/alert.csv default
output alert_CSV: /var/log/alert.csv timestamp, msg

4.9 Unified参数

Unified输出插件被设计成尽可能快的事件记录方法。它记录一个事件到一个报警文件和一个数据包到一个日志文件。报警文件包含一个事件的主要信息(ips, protocol, port, message id)。日志文件包含数据包信息的细节(一个数据包考贝及相关的事件ID)。

这两个文件都是以spo_unified.h文件中描述的二进制形式写的。以unix秒为单位的时间将附加到每个文件的后面写出。

例子:

output alert_unified: snort.alert
output log_unified: snort.log

4.10 Log Null参数

有时创建这样的规则是必要的,即在某些情况下能够发出报警而不记录数据包。当使用log_null插件时就相当于命令行的-N选项,但这个插件可以工作在一个规则类型上。

ruletype info {
type alert
output alert_fast: info.alert
output log_null
}

5 自己动手编写好的规则

5.1 

当编写snort规则时,首先考虑的是效率和速度。好的规则要包含content选项。

在第一阶段就作一个集合模式匹配。一个content选项越长,这个匹配就越精确。如果一条规则不包含content选项,它们将使整个系统慢下来。

当编写规则时,尽量要把目标定位在攻击的地方(例如,将目标定位在1025的偏移量等等)而不仅仅是泛泛的指定(如,在这匹配脚本代码)。Content规则是大小写敏感的(除非你使用了nocase选项)。不要忘记content是大小写敏感的和大多数程序的命令都是大写字母。FTP就是一个很好的例子。考虑如下的规则:

alert tcp any any -> 192.168.1.0/24 21 (content: “user root”; msg: “FTP root login”;)
alert tcp any any -> 192.168.1.0/24 21 (content: “USER root”; msg: “FTP root login”;)

上面的第二条规则能检测出大多数的自动以root登陆的尝试,而第一条规则就不行。Internet 守护进程在接受输入时是很随便的。在编写规则时,很好的理解协议规范将降低错过攻击的机会。

5.2 

加速含有内容选项的规则

探测引擎运用规则的顺序和它们在规则中的书写顺序无关。内容规则选项总是最后一个被检验。利用这个事实,应该先运用别的快速规则选项,由这些选项决定是否需要检查数据包的内容。例如:在TCP会话建立起来后,从客户端发来的数据包,PSH和ACK这两个TCP标志总是被置位的。如果想检验从客户端到服务器的有效载荷,利用这个事实,就可以先进行一次TCP标志检验,这比模式匹配算法(patternmatchalgorithm)在计算上节约许多。使用内容选项的规则要加速的一个简便方法就是也进行一次标志检验。基本思想是,如果PSH和ACK标志没有置位,就不需要对数据包的有效载荷进行检验。如果这些标志置位,检验标志而带来的计算能力消耗是可以忽略不计的。

alert tcp any any -> 192.168.1.0/24 80 (content: “cgi-bin/phf”; flags: PA; msg: “CGI-PHF probe”;)

6 各个平台使用snort

6.1 windows平台使用snort

看这个视频就行:https://www.youtube.com/watch?v=naLbhKW62nY

1. 在snort/bin目录执行snort.exe运行程序

snort.exe -W 检测网卡对应ID

2. 将生成好的规则,放到/snort/rules里

3. 配置/snort/etc/snort.conf

第一处:Step #1的var RULE_PATH处

第二处:config logdir处

第三处:dynamicpreprocessor directory处

第四处:local.rules是自定义规则,如果其他名称,则要修改local。下面的用不到就注释掉

4. snort.exe -i 6 -c ../etc/snort.conf -T  检测规则,失败会有提示,成功也会有提示

其中-i是网卡,6是通过snort.exe -W检测确认的

5. snort.exe -i -c ../etc/snort.conf  -A fast  运行snort进行检测,匹配会放到log目录日志里。

 


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:恶意代码技术理论:Sonrt规则
喜欢 (2)