0x00 snort 简介
Snort (开源) 基于 libpcap,它是一种基于特征检测的入侵检测系统。
一、体系结构
Snort 由四大模块组成:数据包嗅探模块、预处理模块、检测模块、报警/日志模块
1. 数据包嗅探模块
负责监听网络数据包,对网络进行分析。
2. 预处理模块
进行数据包检查,从中定位数据的"行为",如端口扫描,IP 碎片等,然后对数据包进行预处理后传给检测模块进行检测。
3. 检测模块
Snort 的核心模块。接收预处理器传来的数据,使用检查引擎通过之前定义的规则对数据包进行检擦,如果发现与定义规则相匹配的数据包,则就通知报警模块。
4. 报警/日志模块
接收检测模块的输出,如果检测模块触发报警,这条报警信息则会通过网络、UNIXsocket、WindowsPopup(SMB)、SNMP 协议的 trap 命令传送给日志文件,或者传递给第三方插件(如 SnortSam),报警信息也可以被记录到数据库中。
5. 模块间协同工作方式
二、三种工作模式
1.嗅探器模式
【常用命令】:snort -dev
该模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上,直到用户按下Ctrl+C 键终止。然后 Snort 会显示统计信息。也可将网卡设置为混杂模式,这样就可以读取并解析共享信道中的网络数据包。该模式下 Snort 也可以将这些信息记录到日志文件中,随后可以用 Snort 或者 tcpdump 查看。
2.数据包记录器模式
【常用命令】:snort -b
该模式是把数据包记录到硬盘上。
3.网路入侵检测模式
该模式最复杂,可配置,需要载入规则库才能工作,运行该模式通常情况下会在命令行指定一个配置文件。工作大概为 Snort 分析网络数据流,并匹配用户定义的一些规则,然后根据检测结果采取一定的动作。不过该模式下 Snort 并不记录所有捕获的包,而是将包与规则对比,仅当包与某个规则匹配的时候,才会记录日志或产生报警。如果包并不与任何一个规则匹配,那么它将会被悄悄丢弃,并不做任何记录。
0x01 预处理
预处理器在调用检测引擎之前,在数据包被解码之后运行。通过这种机制,Snort 可以以一种 out of band 的方式对数据包进行修改或分析。预处理器可以使用 preprocessor 关键词来加载和配置。
常用到的预处理器
Httpdecode - 预处理器:
把 HttpURL 字符串转换为清晰的 Ascii 字符串。
Stream - 预处理器:
为 Snort 提供了 TCP 数据包重组的功能。在配置的端口上,对 TCP 数据包的细小片段进行重组,使之成为完整的 TCP 数据包。
Frag2 - 预处理器:
为 Snort 提供了 IP 分片重组的功能。将所有分片重新构造成一个完整的数据包,再将这个包传给检测引擎,以定位分片攻击。
Portscan - 端口扫描器:
把由单个源 IP 地址发起的端口扫描从开始到结束的全过程记录到标准日志。
0x02 snort 规则
一、基本描述
Snort 使用一种简单的规则描述语言,这种描述语言易于扩展,功能也比较强大。Snort规则是基于文本的,规则文件按照不同的组进行分类,比如,文件 ftp.rules 包含了 FTP 攻击内容。Snort 规则都写在一个单行上,或者在多行之间的行尾用 / 分隔。Snort规则被分成两个逻辑部分:规则头和规则选项。
[规则范例]
alert tcp any any -> 192.168.64.0/24 80 (content:"|00 01 86 a5|"; msg: "mountd access";)
规则头:alert tcp any any -> 192.168.64.0/24 80
规则选项:alert
协议:tcp
源信息:any any
目的信息:192.168.64.0/24 80
规则体:(content:"|00 01 86 a5|"; msg: "mountd access";)
关键字:content、msg
关键字的匹配:|00 01 86 a5|、mountd access
[规则的基本结构]
规则头:|规则动作|协议|源信息|目的信息|
规则体:| 规则选项 |
二、规则头
规则头包括:数据包的源信息和目的信息,以及规则动作。规则动作告诉 Snort 在发现匹配规则的包时要干什么。
1. Snort 预置的 5 种规则动作类型
[规则动作类型]
pass 选项: 忽略当前的包,继续分析后继捕获的包。
log 选项: 按照自己配置的格式记录包。
alert 选项: 按照自己配置的格式记录包,然后进行报警。
dynamic 选项: 保持一种潜伏状态,直到 activate 类型的规则将其触发,之后它将像 log 动作一样记录数据包。
activate 选项: 规则被触发时生成报警,并启动相关的 dynamic 类型规则。
[除此之外,用户还可以定制自己的类型。]
2. 协议
[当前支持的 ip 协议]
TCP
UDP
ICMP
IP
3. ip
[ip 表示方式]
any: 表示任何端口
单个 ip: 例:192.168.64.1
地址块: 例:192.168.64.0/24
地址列表: 例:[192.168.64.1,192.168.64.2] [192.168.64.0/24,192.168.65.0/24]
否定操作符: 例:!192.168.64.1 表示除该地址外,地址块也可以
端口
[端口的表示方式]
any: 用 any 表示,表示任何端口
单个端口: 例: 80、21、22 等
范围端口: 例: 1:200 表示 1-200 端口
否定操作符: 例: !22 表示除 22 端口,除一个端口范围也可以
方向操作符
[方向表示符]
-> : 表示规则所施加的流的方向。
< >: 告诉 snort 把地址 / 端口号对既作为源,又作为目标来考虑。
三、规则体(规则选项)
Snort 的规则定义中可以没有规则体。它的作用是在规则头信息的基础上进一步分析,有了它才能确认复杂的攻击。规则体由若干个被分别隔开的片断组成,每个片断定义了一个选项和相应的选项值。一部分选项是对各种协议的详细说明,包括IP、ICMP和TCP协议,其余的选项是:规则触发时提供给管理员的参考信息,被搜索的关键字,Snort 规则的标识和大小写不敏感选项。
【具体可参考第四篇参考文章(5.2 规则选项章节)】
0x03 snort 使用
一、安装
【Cetos下】[官网:Snort ]
[安装依赖]
yum -y install gcc flex bison zlib zlib-devel libpcap libpcap-devel pcre pcre-devel libdnet libdnet-devel tcpdump openssl openssl-devel
yum -y install epel-release
yum -y install nghttp2
[安装 LuaJIT 库] // 解决找不到该库的问题
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -xzvf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make
[安装 daq ]
wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz //版本有可能更新,如果出现错误请从官网自行寻找地址
tar -xzvf daq-2.0.6.tar.gz
cd daq-2.0.6
./configure --enable-sourcefire
make & make install
[安装 snort ]
wget https://www.snort.org/downloads/snort/snort-2.9.15.tar.gz
tar -xzvf snort-2.9.15.tar.gz
cd snort-2.9.15
./configure --enable-sourcefire
make & make install
二、命令
[命令格式]
snort [-options] <filter options>
[命令参数]
-A <alert>:设置报警方式为 full,fast 或 none。
在 full 方式下,snort 将传统的报警信息格式写入报警文件,报警内容比较详细。
在 fast 方式下,snort 只将报警时间,报警内容,报警 IP 地址和端口号写入文件。
在 none 方式下,系统将关闭报警功能。
-b:以 tcpdump 的格式将数据包记入日志。
所有的数据包将以二进制格式记录到 snort.log 文件中。
这个选项提高了 snort 的操作速度,因为直接以二进制存储,省略了转换为文本文件的时间。
-B <mask>:将 IP 地址信息抹掉,并且以 CIDR mask 记录数据包。
-c <rules>:使用配置文件 rules 。
文件内容主要控制系统哪些包需要记入日志,哪些包需要报警,哪些包可以忽略等。
-C:只输出有字符的攻击载荷。
-d:抓取应用层的数据包。
-D:在后台(daemon)模式下运行 snort。
-e:显示和记录数据链路层信息。
-F <bpf>:指定 bpf 过滤器。
-g <gname> : 初始化 Snort 后以组 ID(group ID)运行。
-G <0xid>: 设置日志标识符。
-h <hn>:设置为 hn 内部网络。
当使用这个开关时,所有从外部的流量将会有一个方向箭头指向右边,所有从内部的流量将会有一个左箭头。
这个选项没有太大的作用,但是可以使显示的包的信息格式比较容易察看。
-i <if>:设置监听接口为 <if>。
-I:报警时附加上接口信息。
-l <ld>:将日志输出到 ld 目录下。
-L <file>:将日志保存为 tcpdump 文件(file)。
-M:将消息记录到 syslog (不是警报)。
-m <umask>:设置 Snort 输出文件权限。
-n <cnt>:接收到 cnt 个数据包后退出。
-N:关闭日志功能,报警功能仍然工作。
-O:混淆已记录的 IP 地址
-p:关闭混杂模式的嗅探( sniffing )。
这个选项在网络严重拥塞时十分有效。
-P <snap>:设置数据包的显式的 snaplen (默认值:1514)
-q:安静模式,不要显示标志和状态报告
-Q:启用内联模式操作,当在线运行时,从 iptables / IPQ 中读取数据包。
-r <tf>:snort 读取并处理 tcpdump 生成的文件(tf)。
-s:将报警信息记录到系统日志,日默认的设备是 LOG_AUTHPRIV 和 LOG_ALERT 。可以修改 snort.conf 文件修改其配置。
-S <n=v>:设置规则文件变量 n 等于值 v。
-t <dir>:初始化后设置 Snort 根目录为 dir
-T:测试和报告当前 Snort 配置
-u <uname>:初始化后以改变 Snort uid 为用户名 uname uid。
-U:使用 UTC 作为时间戳
-v:将包信息显示到终端时,采用详细模式。
这种模式存在一个问题:它的显示速度比较慢,如果你是在IDS网络中使用snort,最好不要采用详细模式,否则会丢失部分包信息。
-V:显示版本号,并退出。
-x:如果出现Snort配置问题,则退出。
-X:从链路层开始转储原始数据包数据。
-y:在警报和日志文件中包括年份的时间戳。
-Z <file>:设置幸能监视器路径。
0x04 参考链接
😉 1.Snort入侵检测系统简介
😉 2.snort的安装、配置和使用
😉 3.snort原理、搭建与应用
😃 4.SNORT入侵检测系统 [力推本文]
😃 5.Centos7下安装SNORT
😃 6.安装及配置SNORT