0. Snort:一种入侵检测工具
对于大多数系统和网络管理员来说,Snort 是一种常见的、熟悉的工具。遗憾的是,Web 程序员并不这样认为。如果提到 Snort,他们就将它与 traceroute
和 ipconfig
等技术混同起来,认为那不是 Web 开发人员应该管的。
然而,Snort 绝不仅仅是一种管理员的工具。它是一种入侵检测系统 —— 而不仅仅是工具。尽管主要通过命令行使用,但 Web 程序员以及管理员也可轻松访问它。
1. 安装
https://www.snort.org/downloads
运行环境: Centos 7
# 安装数据采集器
yum install deq
打印如下,则安装成功
[root@mx03 ~]# snort --daq-list
Available DAQ modules:
pcap(v3): readback live multi unpriv
ipfw(v3): live inline multi unpriv
dump(v3): readback live inline multi unpriv
afpacket(v5): live inline multi unpriv
# 安装snort 本次通过rpm方式进行安装
wget https://www.snort.org/downloads/snort/snort-2.9.12-1.centos7.x86_64.rpm
sudo rpm -ivh snort-2.9.12-1.centos7.x86_64.rpm
运行snort如果遇到错误:
snort: error while loading shared libraries: libdnet.1: cannot open shared object file: No such file or directory
则执行如下命令新增软链接即可:
cd /usr/lib64 ln -s libdnet.so.1.0.1 libdnet.1
2. 编写规则
Snort的三大关键功能:
- 包嗅探:Snort 可以针对它所在的机器监视进入和出去的包。它还可以监视它所运行的网络中大量正在传输的包。这是 Snort 最基本的功能,以包的形式检测和观察网络通信量是所有其他功能的基础。
- 包记录:Snort 不仅可以实时监视包,还可以记录这些包。日志功能可以使您手动或自动处理这些包,并记录已发生的事件。不论是否正在清理旧包来检测入侵,或是 Snort 根据所记录的内容发出软件警告,包记录功能使 Snort 从一个实时工具转到一个可以以不同形式持久存储数据的工具。
- 入侵检测:从很大程度上讲,入侵检测实际上就是结合了包嗅探和记录功能,并在其上添加一层自动智能层。一个入侵检测系统(即 IDS)具有一个包含网络状态信息的规则集,可以针对网络中可疑的状态进行监视并发出响应。
2.1 修改默认snort配置文件
因为默认配置文件会出现相当多的路径问题,所以将路径定义成绝对路径
# Path to your rules files (this can be a relative path)
# Note for Windows users: You are advised to make this an absolute path,
# such as: c:\snort\rules
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
# If you are using reputation preprocessor set these
# Currently there is a bug with relative paths, they are relative to where snort is
# not relative to snort.conf like the above variables
# This is completely inconsistent with how other vars work, BUG 89986
# Set the absolute path appropriately
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules
*为了测试方便,我们将snort默认的如下include .rules全部删除**
548 include $RULE_PATH/app-detect.rules
549 include $RULE_PATH/attack-responses.rules
550 include $RULE_PATH/backdoor.rules
551 include $RULE_PATH/bad-traffic.rules
552 include $RULE_PATH/blacklist.rules
553 include $RULE_PATH/botnet-cnc.rules
554 include $RULE_PATH/browser-chrome.rules
555 include $RULE_PATH/browser-firefox.rules
556 include $RULE_PATH/browser-ie.rules
557 include $RULE_PATH/browser-other.rules
558 include $RULE_PATH/browser-plugins.rules
559 include $RULE_PATH/browser-webkit.rules
560 include $RULE_PATH/chat.rules
561 include $RULE_PATH/content-replace.rules
562 include $RULE_PATH/ddos.rules
563 include $RULE_PATH/dns.rules
564 include $RULE_PATH/dos.rules
565 include $RULE_PATH/experimental.rules
566 include $RULE_PATH/exploit-kit.rules
567 include $RULE_PATH/exploit.rules
568 include $RULE_PATH/file-executable.rules
569 include $RULE_PATH/file-flash.rules
570 include $RULE_PATH/file-identify.rules
571 include $RULE_PATH/file-image.rules
572 include $RULE_PATH/file-multimedia.rules
573 include $RULE_PATH/file-office.rules
574 include $RULE_PATH/file-other.rules
575 include $RULE_PATH/file-pdf.rules
...
2.2 编写规则
自主编写规则:
alert tcp 188.119.65.53 any -> any 22 (msg:"SSH PACKET FOUND";sid:26287)
reject icmp any any <> 188.119.65.53 any (msg:"ICMP PING";sid:8886288)
# ssh链接 30秒内失败2次的
alert tcp any any -> 209.141.35.131 22 (msg:"Possible SSH brute forcing!"; flags: S+; threshold: type both, track by_src, count 2, seconds 30; sid:10000001; rev: 1;)
# 记录 IGMP 报文
alert ip any any -> any any (ip_proto:igmp;)
# 记录源 IP 与目的 IP 相同报文
alert ip any any -> any any (sameip;)
# 记录客户端发出的小于 6 Byte 的 TCP 流
alert tcp any any -> any any (stream_size:client,<,6;)
#ssh 入侵检测
alert tcp any any -> 209.141.35.131 22 (msg: "BLEEDING-EDGE Potential SSH Scan OUTBOUND"; flags: S; flowbits: set,ssh.brute.attempt; threshold: type threshold, track by_src, count 3, seconds 30; classtype: attempted-recon; reference:url,en.wikipedia.org/wiki/\ Brute_force_attack; sid: 2003068; rev:2;)
Action字段:
1、Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包。
2、Log-记录这个包。
3、Pass-丢弃(忽略)这个包。
4、activate-报警并且激活另一条dynamic规则。
5、dynamic-保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。
Options字段:
Snort 的 Rule Options 主要有以下四类:
- general,提供 Rule 的基本信息,并不对流量产生任何行为。
- payload,对数据流的有效载荷进行查找,可进行多数据关联查找。
- non-payload,非数据载荷查找。
- post-detection,对检测出的特定的规则进行关联触发。
通用选项(General)
载荷选项(Payload)
关键字
Snort 的 Payload 选项的关键字(Key)非常丰富,主要分为三大类
- 查找关键字:对数据流进行内容查找,包括: content, protectedcontent 、byte[test/jump] 及 isdata
- 协议关键字:Preprocessor 解析协议相关的选项查找
- 修饰关键字:修饰查找行为的关键字,主要包括:nocase, rawbytes, depth, offset, distance, within, http_[cookie/header/method/uri] 等等
非载荷选项(Non-Payload)
关键字
Non-Payload 的关键字用于匹配 IP 层、传输层协议的关键字段,主要包括:
- fragoffset,匹配 IP 报文中分片 offset 字段
fragoffset:[!|<|>]<number>;
- ttl,匹配 IP 首部的 TTL 字段,支持比较
ttl:[<, >, =, <=, >=]<number>;
,支持数值范围ttl:[<number>]-[<number>];
- tos,匹配 IP 首部 tos 字段
tos:[!]<number>;
- id,匹配 IP ID 字段,
id:<number>;
- ipopts,匹配 IP 首部的选项,
ipopts:<rr|eol|nop|ts|sec|esec|lsrr|lsrre|ssrr|satid|any>;
- fragbits,匹配 IP 首部的分片标识,支持使用
+/*/!
进行逻辑组合fragbits:[+*!]<[MDR]>;
- dsize,匹配/测试 报文的载荷长度,
dsize:min<>max;
与dsize:[<|>]<number>;
- flags,匹配 TCP 的 Flag 字段,支持使用
+/*/!
进行逻辑组合,flags:[!|*|+]<FSRPAUCE0>[,<FSRPAUCE>];
- flowbits,匹配/设置 TCP 的 Flag 字段,用于跟踪 TCP 协议 Sesion 状态
flowbits:[set|setx|unset|toggle|isset|isnotset|noalert|reset][, <bits/bats>][, <GROUP_NAME>];
bits ::= bit[|bits]
bats ::= bit[&bats]
- seq,匹配 TCP 的序列号,
seq:<number>;
- ack,匹配 TCP 的 ACK 序列号,
ack:<number>;
- windows,匹配 TCP 的窗口大小,
window:[!]<number>;
- itype,匹配 ICMP 的 type 字段,
itype:min<>max;
与itype:[<|>]<number>;
- icode,匹配 ICMP 的 code 字段,
icode:min<>max;
与icode:[<|>]<number>;
- icmp_id,匹配 ICMP 的 ID 值,
icmp_id:<number>;
- icmp_seq,匹配 ICMP 的序列号,
icmp_seq:<number>;
- rpc,匹配 SUNRPC 请求信息,
rpc:<application number>, [<version number>|*], [<procedure number>|*]>;
- ip_proto,匹配 IP 的协议字段,
ip_proto:[!|>|<] <name or number>;
- sameip,匹配源 IP 与目的 IP 相同的流
- stream_reassemable,对 TCP 流的重组流进行设置,
stream_reassemble:<enable|disable>, <server|client|both>[, noalert][, fastpath];
- stream_size,匹配指定长度的 TCP 流,
stream_size:<server|client|both|either>, <operator>, <number>;
下载官方规则:https://www.snort.org/downloads
2.3 运行snort
sudo snort -c snort.conf -A console -i eth0
发表评论