MENU

初探:Snort入侵检测系统

April 10, 2019 • Read: 236 • 网络安全阅读设置

0. Snort:一种入侵检测工具

对于大多数系统和网络管理员来说,Snort 是一种常见的、熟悉的工具。遗憾的是,Web 程序员并不这样认为。如果提到 Snort,他们就将它与 tracerouteipconfig 等技术混同起来,认为那不是 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 编写规则

Snort规则的格式

自主编写规则:

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, protected_content 、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
Last Modified: September 23, 2019
Archives QR Code
QR Code for this page
Tipping QR Code