开源系统中构建纵深入侵检测及防御体系技术剖析

入侵检测简介

Intrusion Detection System(入侵检测系统)顾名思义,便是对入侵行为的发觉,其通过对计算机网络或计算机系统中的若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。通常说来,其具有如下几个功能:

  • 监控、分析用户和系统的活动。
  • 核查系统配置和漏洞。
  • 评估关键系统和数据文件的完整性。
  • 识别攻击的活动模式并向网管人员报警。
  • 对异常活动的统计分析。
  • 操作系统审计跟踪管理,识别违反政策的用户活动。

按照技术以及功能来划分,入侵检测系统可以分为如下几类:

  1. 基于主机:系统分析的数据是计算机操作系统的事件日志、应用程序的事件日志、系统调用、端口调用和安全审计记录。主机型入侵检测系统保护的一般是所在的主机系统。是由代理(agent)来实现的,代理是运行在目标主机上的小的可执行程序,它们与命令控制台(console)通信。
  2. 基于网络:系统分析的数据是网络上的数据包。网络型入侵检测系统担负着保护整个网段的任务,基于网络的入侵检测系统由遍及网络的传感器(sensor)组成,传感器是一台将以太网卡置于混杂模式的计算机,用于嗅探网络上的数据包。
  3. 混合型:基于网络和基于主机的入侵检测系统都有不足之处,会造成防御体系的不全面,综合了基于网络和基于主机的混合型入侵检测系统既可以发现网络中的攻击信息,也可以从系统日志中发现异常情况。

纵深入侵检测及防御体系

在实际的入侵检测及防御体系的构件中,有的以网络为主,进行网络威胁的发现和封堵;有的以主机防御为主,主要保证主机不遭受入侵。如果光针对其中一方面进行构建的话,则会存在偏差,建议综合多方面的信息,进行纵深的综合性防御,这样才能起到很好的效果。

在开源系统中,例如 Linux 操作系统中,从应用到内核层面上提供了 3 种入侵检测系统来对网络和主机进行防御,它们分别是网络入侵检测系统 Snort、主机入侵检测系统 LIDS 以及分布式入侵检测系统 SnortCenter。其中,

  • Snort 专注于在网络层面进行入侵检测;
  • LIDS 则侧重于在主机层面进行入侵检测和防御;
  • SnortCenter 则是为了在分布式环境中提升入侵检测的实时性和准确性的一种分布式检测机制。

本文将依据这 3 种入侵系统,就如何配置、部署和使用对他们进行详细介绍。

网络入侵检测层面:Snort

一般市面上的介绍都把 Snort 说的好像是纯个人开发的开源玩具一样,其实它很实用,而且有一家名叫 Sourefire 的上市公司在负责研发和升级工作。这个工具本身是免费的。而且可以在任何操作系统上运行,包括 Windows 和 Linux,但是个人认为它的配置过程还是比较复杂。

基本原理

Snort 有三种工作模式:嗅探器、数据包记录器、网络入侵检测系统:

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

嗅探器模式

嗅探器模式就是 snort 从网络上读出数据包然后显示在用户的控制台上。有关该模式的命令选项比较多,主要的有如下几种:

  • 如果用户只要把 TCP/IP 包头信息打印在屏幕上,输入下面的命令即可:

#./snort -v

  • 如果用户要看到应用层的数据,可以使用命令:

#./snort -vd

  • 如果需要显示数据链路层的信息,使用下面的命令:

#./snort – vde

数据包记录器

如果要把所有的包记录到硬盘上,用户只需要指定一个日志目录,snort 就会自动记录数据包,使用下述命令即可:

1
#./snort -dev -l ../snort_log

当然,snort_log 目录必须存在,否则 snort 就会报告错误信息并退出。当 snort 在这种模式下运行,它会记录所有看到的包将其放到一个目录中。如果用户只指定了 -l 命令开关,而没有设置目录名,snort 有时会使用远程主机的 IP 地址作为目录,有时会使用本地主机 IP 地址作为目录名。为了只对本地网络进行日志,用户需要给出本地网络的 IP 地址,如下所示:

1
#./snort -dev -l ./ snort_log -h 192.168.1.0/24

这个命令告诉 snort 把进入 C 类网络 192.168.1 的所有包的数据链路、TCP/IP 以及应用层的数据记录到目录 snort_log 中。

网络入侵检测系统

snort 最重要的用途还是作为网络入侵检测系统(NIDS),使用下面命令行可以启动这种模式:

1
#./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf

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

在 NIDS 模式下,有很多的方式来配置 snort 的输出。在默认情况下,snort 以 ASCII 格式记录日志,使用 full 报警机制。如果使用 full 报警机制,snort 会在包头之后打印报警消息。如果不需要日志包,可以使用 -N 选项。

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

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

另外,使用 -s 选项可以使 snort 把报警消息发送到 syslog,默认的设备是 LOG_AUTHPRIV 和 LOG_ALERT,例如:使用默认的日志方式(以解码的 ASCII 格式)并且把报警发给 syslog:

1
#./snort -c snort.conf -l ./log -s -h 192.168.1.0/24

snort 还可以使用 SMB 报警机制,通过 Samba 把报警消息发送到 Windows 主机,如下使用二进制日志格式和 SMB 报警机制:

1
#./snort -c snort.conf -b -M WIN_LOG

安装 Snort

虽然这几年 Snort 一直在推陈出新,但是安装 Snort 总体来说还是具有一定的技术含量。安装的命令如下所示 , 首先需要确定机器上已经安装了 zlib、libpcap、MYSQL、Apache、PHP 和其他多种底层开发工具和开发库:

1
2
3
4
5
6
7
8
9
10
安装 Snort RPM 包
 
  [root@localhost ~]# rpm -ivh snort-2.8.6-1.RH5.i386.rpm
  Preparing... ########################################### [100%]
  1:snort ########################################### [100%]
 
安装 mysql 数据库
  [root@localhost ~]# rpm -ivh snort-mysql-2.8.6-1.RH5.i386.rpm
  Preparing... ########################################### [100%]
  1:snort-mysql ########################################### [100%]

配置 Snort

配置 Snort 的步骤比较多,主要有如下几个步骤:

(1)首先需要修改 snort 的配置文件 snort.conf,如下命令所示:

1
[root@localhost ~]# vim /etc/snort/snort.conf
图 1. snort 配置文件
图 1. snort 配置文件

(2)配置规则:在配置文件中有两类规则:alert 和 log,我们在下面加一条即可。

1
2
3
4
# output database: alert, < db_type >, user=< username > \
password=< password > test dbname=< name > host=< hostname >
# output database: log, < db_type >, user=< username > \
password=< password > test dbname=< name > host=< hostname >

比如我们加这么一条:

1
#output database: log, mysql, user=root password=xxxxxx dbname=snort host=localhost

(3)使规则生效, 把下面前面的 # 去掉即可:

1
2
3
4
5
6
7
8
9
10
11
# include $RULE_PATH/web-attacks.rules
# include $RULE_PATH/backdoor.rules
# include $RULE_PATH/shellcode.rules
# include $RULE_PATH/policy.rules
# include $RULE_PATH/porn.rules
# include $RULE_PATH/info.rules
# include $RULE_PATH/icmp-info.rules
  #include $RULE_PATH/virus.rules
# include $RULE_PATH/chat.rules
  #include $RULE_PATH/multimedia.rules
# include $RULE_PATH/p2p.rules

(4)创建 Snort 的数据库,如下述命令所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@localhost ~]# mysql -u root -p
Enter password:
## 输入密码,登陆 mysql,创建 snort 的数据库
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 5.0.22
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database snort;
Query OK, 1 row affected (0.00 sec)
 
mysql> use snort;
Database changed
 
mysql> grant create, insert, select ,delete,update on snort.* to snort;
Query OK, 0 rows affected (0.01 sec)
 
mysql>grant create, insert, select ,delete,update on snort.* to snort@localhost;
Query OK, 0 rows affected (0.00 sec)
 
mysql> set password for 'snort'@'localhost' = password('123456');
Query OK, 0 rows affected (0.00 sec)
 
mysql> set password for 'snort'@'%' = password('123456');
Query OK, 0 rows affected (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

具体步骤如图 2 所示:

图 2. 创建 snort 数据库具体操作步骤
图 2. 创建 snort 数据库具体操作步骤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> use snort;
Database changed
mysql> source /usr/share/snort-2.8.6/schemas/create_mysql
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.04 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
mysql>

这样 snort 数据库里面就已经导入了数据的表了

1
2
3
mysql> quit
Bye
##

到这里,snort 数据库就建立好了

(5)创建 Snort 访问的用户,使用如下命令:

1
2
3
4
[root@localhost schemas]# htpasswd -c /etc/httpd/conf/htpasswd apacheman
New password:
Re-type new password:
Adding password for user apacheman

配置 httpd,并开启该服务

1
2
3
[root@localhost schemas]# vim /etc/httpd/conf/httpd.conf
[root@localhost schemas]# chown apache.apache /etc/httpd/conf/htpasswd
[root@localhost schemas]# etc/init.d/httpd restart

拷贝 snort 的规则库

1
2
3
tar zxvf snortrules-snapshot-2.8.tar.gz
 
cp rules/* /etc/snort/rules

把规则库都复制到 snort 的 rules 文件夹下。

显示 snort 规则库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@localhost base]# cd /var/www/html
[root@localhost base]# tar zxvf adodb465.tgz
 
[root@localhost html]# mv jpgraph-2.1.1 jpgraph
[root@localhost html]# mv base-1.2.6 base
[root@localhost html]# cd base
[root@localhost base]# ls
admin                   base_graph_form.php   base_qry_sqlcalls.php  contrib
base_ag_common.php      base_graph_main.php   base_stat_alerts.php   docs
base_ag_main.php        base_hdr1.php         base_stat_class.php    help
base_common.php         base_hdr2.php         base_stat_common.php   images
base_conf.php.dist      base_main.php         base_stat_ipaddr.php   includes
base_db_common.php      base_maintenance.php  base_stat_iplink.php   index.php
base_db_setup.php       base_payload.php      base_stat_ports.php    languages
base_denied.php         base_qry_alert.php    base_stat_sensor.php   scripts
base_footer.php         base_qry_common.php   base_stat_time.php     setup
base_graph_common.php   base_qry_form.php     base_stat_uaddr.php    sql
base_graph_display.php  base_qry_main.php     base_user.php          styles
 
[root@localhost base]#  cp base_conf.php.dist base_conf.php
 
vim base_conf.php
 
$DBlib_path = "/var/www/html/adodb";
$alert_dbname = 'snort';
$alert_host = 'localhost';
$alert_port = '';
$alert_user = 'snort';
$alert_password = '123456';
 
/* Archive DB connection parameters */
$archive_exists = 0; # Set this to 1 if you have an archive DB
$archive_dbname = 'snort';
$archive_host = 'localhost';
$archive_port = '';
$archive_user = 'snort';
$archive_password = '123456';
 
$ChartLib_path = "/var/www/html/jpgraph/src";

配置的部分结果如图 3 所示:

图 3. snort 规则具体配置
图 3. snort 规则具体配置

(6)启动 mysql 数据库

1
2
[root@localhost base]# service mysqld start
[root@localhost base]# service httpd start
图 4. BASE 引擎
图 4. BASE 引擎

进入图 4 所示的 Setup page 链接。

图 5. BASE 引擎配置界面
图 5. BASE 引擎配置界面

点击 Create BASE AG 按钮,如图 6 所示:

图 6. BASE 具体配置
图 6. BASE 具体配置

生成角色和用户等信息,如图 7 所示:

图 7. BASE 角色和用户信息
图 7. BASE 角色和用户信息

这个时候 snort 还没开始工作,但是已经可以访问了,如图 8 所示。用户名输入 apacheman,密码输入 xxxxxx。

图 8. 访问 snort
图 8. 访问 snort
图 9. 访问 snort 出错
图 9. 访问 snort 出错

遇到图 9 所示的这种出错情况的话,很有可能是 acid_conf.php 文件没有修改。我们把文件中的 $alert_dbname = "snort_log"; 改成 $alert_dbname = "snort";

图 10. 成功访问 snort
图 10. 成功访问 snort

如图 10 所示,现在可以访问了。我们执行:

1
/usr/sbin/snort -i eth0 -c /etc/snort/snort.conf -D

编写 Snort 规则

snort 规则一般是一行一条,规则头包含规则的动作,协议,源和目标 ip 地址与网络掩码,以及目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。

规则动作

对于匹配特定规则的数据包,snort 有如下 5 种处理动作:

  • alert:使用选择的报警方法生成一个警报,然后记录(log)这个包
  • log:记录这个包
  • pass:丢弃(忽略)这个包
  • activate:报警并且激活另一条 dynamic 规则
  • dynamic:保持空闲直到被一条 activate 规则激活,被激活后就作为一条 log 规则执行

除了上述 5 个动作外,用户还可以定义自己的规则类型并且附加一条或者更多的输出模块给它,然后就可以使用这些规则类型作为 snort 规则的一个动作。举个如下的例子:

1
2
log tcp 192.168.0.0/24 any -> 192.168.1.0/24 22 (content:"|00 01 00 d2|"; \
msg: " military incursion";)

上面规则的意思是:192.168.0.0 这个网段到 192.168.1.0 网段任何一个 22 端口的 tcp 流量,只要里面有符合的十六进制内容,就记录 military incursion。

协议

每条规则的第二项就是协议项。当前,snort 能够分析的协议是:IP、TCP、UDP 和 ICMP。将来,可能提供对 ARP、ICRP、GRE、OSPF、RIP、IPX 等协议的支持。

IP 地址

规则头下面的部分就是 IP 地址和端口信息。关键词 any 可以用来定义任意的 IP 地址。snort 不支持对主机名的解析。所以地址只能使用数字 /CIDR 的形式。/24 表示一个 C 类网络;/16 表示一个 B 类网络;而 /32 表示一台特定的主机地址。例如:

1
192.168.1.0/24 表示从 192.168.1.1 到 192.168.1.255 的地址。

在规则中,可以使用使用否定操作符(negationoperator)对 IP 地址进行操作。它告诉 snort 除了列出的 IP 地址外,匹配所有的 IP 地址。否定操作符使用 ! 表示。

下面这条规则中的 IP 地址表示:所有 IP 源地址不是内部网络的地址,而目的地址是内部网络地址。

1
2
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";\
msg:"external mountd access")(使用 IP 地址否定操作符的规则)

也可以定义一个 IP 地址列表(IP list)。IP 地址列表的格式如下:

1
[IP 地址 1/CIDR,IP 地址 /CIDR,....]

需要注意的是:每个 IP 地址之间不能有空格。例如:

1
2
alert tcp ![192.168.1.0/24,10.1.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" )

端口号

在规则中,可以有几种方式来指定端口号,包括:any、静态端口号(staticport)定义、端口范围,以及使用非操作定义。any 表示任意合法的端口号;静态端口号表示单个的端口号,例如:111(portmapper)、23(telnet)、80(http)等。使用范围操作符可以指定端口号范围。有几种方式来使用范围操作符 : 达到不同的目的,例如:

1
2
3
4
5
6
// 记录来自任何端口,其目的端口号在 1 到 1024 之间的 UDP 数据包
log udp any any -> 192.168.1.0/24 1:1024
// 记录来自任何端口,其目的端口号小于或者等于 6000 的 TCP 数据包
log tcp any any -> 192.168.1.0/24 :600
// 记录源端口号小于等于 1024,目的端口号大于等于 500 的 TCP 数据包
log tcp any :1024 -> 192.168.1.0/24 500

还可以通过使用逻辑非操作符 ! 对端口进行非逻辑操作(portnegation)。逻辑非操作符可以用于其他的规则类型(除了 any 类型 , 道理很简单)。例如,如果要日志除了 X-window 系统端口之外的所有端口,可以使用下面的规则:

1
log tcp any any -> 192.168.1.0/24 !6000:60 10 (对端口进行逻辑非操作)

方向操作符(direction operator)

方向操作符表示数据包的流向。它左边是数据包的源地址和源端口,右边是目的地址和端口。此外,还有一个双向操作符 <>, 它使 Snort 对这条规则中,两个 IP 地址 / 端口之间双向的数据传输进行记录分析。

1
2
// 下面的规则表示对一个 telnet 对话的双向数据传输进行记录:
log !192.168.1.0/24 any <> 192.168.1.0/24 23 (使用双向操作符的 snort 规则)

activate/dynamic 规则

activate/dynamic 规则对扩展了 snort 功能。使用 activate/dynamic 规则对,能够使用一条规则激活另一条规则。当一条特定的规则启动,如果想要 snort 接着对符合条件的数据包进行记录时,使用 activate/dynamic 规则对非常方便。除了一个必需的选项 activates 外,激活规则(activate rule)非常类似于报警规则(alert rule)。动态规则(dynamic rule)和日志规则(log rule)也很相似,不过它需要一个选项:activated_by。动态规则还需要另一个选项:count。当一个激活规则启动,它就打开由 activate/activated_by 选项之后的数字指示的动态规则,记录 count 个数据包。下面是一条 activate/dynamic 规则对的规则:

1
2
3
activate tcp !$HOME_NET any -> $HOME_NET 143 (flagsA;content:"|E8C0FFFFFF |in|;\
  activates:1;<msg:"IMAP buffer overflow!" )
(activate/dynamic 规则对 )

上述规则使 snort 在检测到 IMAP 缓冲区溢出时发出报警,并且记录后续的 50 个从 $HOME_NET 之外,发往 $HOME_NET 的 143 号端口的数据包。如果缓冲区溢出成功,那么接下来 50 个发送到这个网络同一个服务端口(这个例子中是 143 号端口)的数据包中,会有很重要的数据,这些数据对以后的分析很有用处。

在 Snort 中有 23 个规则选项关键词,随着 Snort 不断地加入对更多协议的支持以及功能的扩展,会有更多的功能选项加入其中。这些功能选项可以以任意的方式进行组合,对数据包进行分类和检测。现在,Snort 支持的选项包括:msg、logto、ttl、tos、id、ipoption、fragbits、dsize、flags、seq、ack、itype、icode、icmp_id、content、content-list、offset、depth、nocase、session、rpc、resp、react。每条规则中,各规则选项之间是逻辑与的关系。只有规则中的所有测试选项(例如:ttl、tos、id、ipoption 等)都为真,Snort 才会采取规则动作。

Snort 规则简单应用举例

拒绝服务攻击的规则
1
2
3
alert udp any 19 <> any 7 (msg:"DOS UDP echo+chargen bomb"; flow:to_server; \
metadata:policy security-ips drop; reference:cve,1999-0103; reference:cve,1999-0635;\
  classtype:attempted-dos; sid:271; rev:8;)
SSH 攻击报警的规则
1
2
3
4
5
6
7
alert tcp $HOME_NET 22 -> $EXTERNAL_NET any \
(msg:"ATTACK-RESPONSES successful gobbles ssh exploit uname"; \
flow:from_server,established; content:"uname";\
  metadata:policy balanced-ips drop, policy connectivity-ips drop, \
  policy security-ips drop; reference:bugtraq,5093; reference:cve,2002-0390; \
  reference:cve,2002-0639; reference:nessus,11031; classtype:misc-attack; \
  sid:1811; rev:12;)
对 ICMP 包回应的规则
1
2
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP Echo Reply"; \
icode:0; itype:0; classtype:misc-activity; sid:408; rev:5;)
图 11. ICMP 包回应截获数据的 web 效果图
图 11. ICMP 包回应截获数据的 web 效果图
对 DNS 包回应的规则
1
2
3
4
5
alert udp $EXTERNAL_NET 53 -> $HOME_NET any \
(msg:"DNS SPOOF query response with TTL of 1 min. and no authority"; \
flow:to_client; content:"|81 80 00 01 00 01 00 00 00 00|"; \
content:"|C0 0C 00 01 00 01 00 00 00|<|00 04|"; \
metadata:policy security-ips drop, service dns; classtype:bad-unknown; sid:254; rev:7;)
图 12. DNS 包回应截获数据的 web 效果图
图 12. DNS 包回应截获数据的 web 效果图

上述规则都添加在 /etc/snort/rules 文件里,给 rules 文件添加规则的效果图如图 13 所示:

图 13. rules 文件规则效果示意图
图 13. rules 文件规则效果示意图

高级应用举例

上面介绍了如何编写 Snort 规则,下面再给出几个实际应用中的例子(几个对当前主要的几种攻击手段的检测的例子)来说明如何灵活、高效地应用 Snort 规则。

检测尼姆达病毒

Nimda 是一个蠕虫病毒,在 2001 年的下半年曾经在互联网上肆虐。nimda 的检测规则主要是在扫描的时候、运行的时候和传播的时候。由于该病毒的机理比较复杂,具体的分析过程不在这里详细阐述,可以给出如下的检测规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
preprocessor http_decode: 80 443 8080
preprocessor minfrag: 128
preprocessor portscan: 12.23.34.45/32 3 5 /var/log/snort_portscan.log
preprocessor portscan-ignorehosts:
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM SCAN!"; \
flags:PA; content:"/root.exe?/c+dir"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM SCAN!"; \
flags:PA; content:"/system32/cmd.exe?/c+dir"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM TRANSFER!!"; \
flags:PA; content:"/root.exe?/c+tftp%20-i"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM TRANSFER!!"; \
flags:PA; content:"/system32/cmd.exe?/c+tftp%20-i"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM RUN!!!"; \
flags:PA; content:"/scripts/Admin.dll"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM RUN!!!"; \
flags:PA; content:"/MSADC/Admin.dll"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM RUN!!!"; \
flags:PA; content:"/winnt/system32/Admin.dll"; nocase;)
alert udp any 69 -> any any (msg:"W32/Nimda@mm WORM TRANSFER!!"; \
flags:PA; content:"|15 90 AC 17 36 F7 D8 1B C0 5E 40 5B 5F C9 C2 04 \
00 55 8B EC 81 EC B0 00|";)
alert tcp any 80 -> any any (msg:"W32/Nimda@mm WORM IN WEB SERVER!!"; \
flags:PA; content:">window.open("readme.eml"";)
alert tcp any any -> any 25 (msg:"W32/Nimda@mm WORM MAILSEND!!"; \
flags:PA; content:"UgEAAI1F6Ild6FCNRfxQU2g/AA8AU1NT";)
alert tcp any 110 -> any any (msg:"W32/Nimda@mm WORM MAILRECV!!"; \
flags:PA; content:"UgEAAI1F6Ild6FCNRfxQU2g/AA8AU1NT";)

检测 PHPUpload 溢出攻击

PHP 语言为用户提供了上传文件的功能,用户可以使用提供的类进行各类文件、档案的上传功能传送数据给服务器。然而,该类由于没有对上传文件的大小或者类型做严格的判断,在程序执行过程当中,有可能造成服务器端的缓冲区溢出,从而导致缓冲区溢出攻击。

下面给出防范该溢出攻击的 Snort 检测规则:

1
2
3
4
alert tcp $EXTERNAL_NET any -> $HOME_NET 80 \
(msg:"EXPERIMENTAL php content- disposition"; flags:A+; \
content:"Content-Disposition\:"; content:"form-data\;"; \
classtype:web-application-attack; reference:bugtraq,4183; sid:1425; rev:2;)

以上规则判断提交给服务器的 HTTP 请求中是否包含"Content-Disposition:"及"form-data;"字串,如果含有该字符串的话,对于某些没有打补丁的系统来说会造成缓冲区溢出攻击。通过添加上述规则,一旦发现客户端有此操作,则 Snort 将会报警。

检测 SNMP 口令溢出漏洞

简单网络管理协议(SNMP)是所有基于 TCP/IP 网络上管理不同网络设备的基本协议,比如防火墙、计算机和路由器。现在已经发现,如果攻击者发送怀有恶意信息给 SNMP 的信息接收处理模块,就会引起服务停止(拒绝服务)或缓冲区溢出;或者说通过向运行 SNMP 服务的系统发送一个畸形的管理请求,此时就存在一个缓冲区溢出漏洞,或者造成拒绝服务影响。一旦缓冲区溢出,可以获取部分 SNMP 口令、在本地运行任意的代码以及让攻击者进行任意的操作。因为 SNMP 的程序一般需要系统权限来运行,因此缓冲区溢出攻击可能会造成系统权限被夺取,而形成严重的安全漏洞。

下面给出一条检测 SNMP 口令溢出漏洞的 SNORT 规则:

1
2
3
4
5
6
alert udp $EXTERNAL_NET any -> $HOME_NET 161:162 \
(msg:"EXPERIMENTAL SNMP community string buffer overflow attempt"; \
content:"|02 01 00 04 82 01 00|"; offset:4; \
reference:url,www.cert.org/advisories/ CA-2002-03.html; \
reference:cve,CAN-2002- 0012; reference:cve,CAN-2002-0013; \
classtype:misc-attack; sid:1409; rev:2;)

以上规则判断发往 SNMP 服务端口的数据包中是否包含“|02 01 00 04 82 01 00|”二进制串,此串对应 SNMP 操作的分支的位置。事实上由于 SNMP 协议的灵活性,对同一分支位置在 SNMP 包里可能有不同的表示,“|02 80 01 80 00 80 04 80 82 80 01 80 00|”就可能表示的是同一分支,更糟的是还有更多的表示方法,攻击者完全可以利用这种协议表示上的灵活性逃过 Snort 的检测,造成漏报。因而要完全解决这个问题,单纯靠搜索特定串是不行的,惟一可行的方法是做协议解码。

检测 /etc/passwd 文件非法访问

在 Linux 系统中,/etc/passwd 是一个重要的文件,它包含用户名、组成员关系和为用户分配的 shell 等信息。黑客或者不法用户一旦获得了该文件的访问权,就有可能针对该文件进行暴力攻击或者是字典攻击,获得系统的用户和密码,从而获得了系统的使用权,将对系统造成极大的威胁。因而,我们须要对 /etc/passwd 文件的访问进行检测。

下面给出用于检测 /etc/passwd 文件非法访问的 Snort 检测规则:

1
2
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-MISC /etc/passwd";
flags: A+; content:"/etc/passwd"; nocase; classtype:attempted-recon; sid:1122; rev:1)

上述规则使用字符串匹配算法对包含特征码(“/etc/passwd”字符串)的 HTTP 请求进行检测,一旦发现非法访问,Snort 立刻进行报警。

主机入侵检测层面:LIDS

LIDS 简介

LIDS 是 Linux 下的入侵检测和防护系统,是 Linux内核的补丁和 安全管理工具,它增强了内核的 安全性,它在内核中实现了参考监听模式以及强制访问控制(Mandatory Access Control)模式。区别于本文在前面部分介绍的 Snort 入侵检测系统,它属于网络 IDS 范畴,而 LIDs 则属于主机 IDS 范畴。

一般来说,LIDS 主要功能包括如下几方面:

  • 重要系统资源保护:保护硬盘上任何类型的重要文件和目录,如 /bin、/sbin、/usr/bin、/usr/sbin、/etc/rc.d 等目录和其下的文件,以及系统中的敏感文件,如 passwd 和 shadow 文件,防止未被授权者(包括 root 用户)和未被授权的程序进入。保护重要进程不被终止,任何人包括 root 也不能杀死进程,而且可以隐藏特定的进程。防止非法程序的 I/O 操作,保护硬盘,包括 MBR 保护等等。
  • 入侵检测:LIDS 可以检测到系统上任何违反规则的进程。
  • 入侵响应:来自内核的安全警告,当有人违反规则时,LIDS 会在控制台显示警告信息,将非法的活动细节记录到受 LIDS 保护的系统 log 文件中。LIDS 还可以将 log 信息发到用户的信箱中。并且,LIDS 还可以马上关闭与用户的会话。

LIDS 安装

打补丁并配置 Linux 内核选项安装

LIDS 通常需要下载其最新版本的 LIDS 内核补丁包,然后进行安装。下载的网站为:http://www.lids.org/,目前网站上的最新版本为:lids-2.2.3rc7-2.6.28.patch。首先将下载的 LIDS 内核补丁包保存到 /usr/src 目录下,然后以根用户的权限进入命令行模式进行如下步骤地操作:

(1)假设系统内核文件在 /usr/src/Linux 目录下,通过下列命令安装 LIDS 内核补丁包:

1
2
# cd /usr/src/Linux
# patch p1 < /usr/src/ lids-2.2.3rc7-2.6.28.patch

(2)编辑内核,选取相关选项:

1
2
// 进入编辑内核界面
# make menuconfig

进入内核编译菜单界面后,建议把有关 LIDS 的所有项都选中。这样做的目的能让不太熟悉内核编译的用户能省去很多不必要的麻烦,并且将所有的 LIDS 项都选择上也不会占用多少的内核空间,对加入 LIDS 后的内核性能也不会产生多少的影响。下面对一些选项进行解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Prompt for development and/or incomplete code/drivers
  Sysctl support
  Linux Intrusion Detection System support.
  [ ] Hang up console when raising a security alert
当收到一个安全警告挂起控制台
  [ ] Security alert when execing unprotected programs before sealing LIDS
  当执行没有受 LIDS 保护的程序时发送安全警告
  [ ] Do not execute unprotected programs before sealing LIDS
在安装 LIDS 前不执行没有受保护的程序
  [ ] Try not to flood logs
尽量不要让日志溢出
  [ ] Allow switching LIDS protections
允许转换 LIDS 保护
  [ ] Allow remote users to switch LIDS protections
允许远程用户来转换 LIDS 保护
  [ ] Allow any program to switch LIDS protections
允许任何程序来转换 LIDS 保护
  [ ] Allow reloading config. File
允许重新引导配置文件
  [ ] Port Scanner Detector in kernel
内核的端口扫描器
  [ ] Send security alerts through network
通过网络发送安全警告
  [ ] Hide klids kernel thread
隐藏内核进程
  [ ] Use generic mailer pseudo-script
使用通用的邮件发送脚本

(3)在选择好要加入到内核中的 LIDS 项后,就可以通过下列命令重新编译内核:

1
2
3
4
5
# make dep
# make clean
# make bzImage
# make modules
# make modules_install

完成上述内核编译工作后,一个加入了 LIDS 的内核就重新编译好了。要使加入了 LIDS 的新内核工作,必需重新启动系统。

源代码安装 LIDS 工具包

同样,首先从上述网站上下载 LIDS 工具包的安装文件,目前网站上的最新版本为:lids-2.3.rc7-2.6.28.patch,然后按如下步骤安装它:

(1)解压缩源码包

1
# tar -zxvf lids-2.3.rc7-2.6.28.patch

(2)切换目录并生成 makefile 文件

# cd lids-2.3.rc7-2.6.28

# ./configure

(3)安装

1
2
# make
# make install

这样就会将 Lidsadm 和 Lidsconf 这两个工具安装到 /sbin/ 目录中,同时会创建一个 /etc/lids 的目录,并会在此目录下生成一个默认的配置文件

配置和使用 LIDS

基本配置

必须配置 LIDS 系统,使其符合用户的安全需要。用户可以定义受保护的文件、受保护的进程等等。

首先,更新缺省 lids.conf 的 inode/dev 值:

1
# /sbin/lidsadm – U

然后,获得一个 RipeMD-160 加密口令:

1
# /sbin/lidsadm -P

缺省情况下,lidsadm 将把缺省配置文件安装到 /etc/lids/。用户必须根据自己的需要重新配置。当内核启动时,配置信息就把相关信息读入内核来初始化 LIDS 系统。需要特别注意该目录中的如下几个相关的配置文件:

  • lids.conf:这个文件用来 存储LIDS ACLs 信息。它包括定义对象访问类型的 ACLs(访问控制列表);
  • lids.cap:这个文件包括系统的所有性能,可以编辑这个文件来配置这些性能;
  • lids.net:这个文件用来配置发给管理员信箱的警告信息。用户可以定义 SMTP服务器、端口、消息头等。仅在配置内核时,选择了 Send security alerts through network 内核配置选项才有该文件;
  • lids.pw:这个文件 存储由“lidsadm – P”命令生成的密码文件。配置内核时需要选择 Allow switching LIDS protections 选项,就必须有该文件。

Lidsadm 工具

Lidsadm 是 LIDS 的管理工具单元,可以用它来管理系统中的 LIDS。Lidsadm 的作用主要就是启用或停用 LIDS,以及封存 LIDS 到内核中和查看 LIDS 状态。

使用下列命令可以列出 Lidsadm 的所有可用选项:

1
# lidsadm – h

其常用命令参数的具体含义如下:

  • -s:开关某些保护选项时指示应提交密码;
  • -I:开关某些保护选项时不提交密码
  • LIDS_FLAG:为 Lidsadm 的标志值
  • -v:显示版本
  • -V:查看现在 LIDS 状态
  • -h:列出所有选项

另外,Lidsadm 还包括了许多常用的部分主要功能模块,它们的列表和主要功能说明如表 1 所示:

表 1. Lidsadm 主要功能模块说明

另外,Lidsadm 还有如下可用的标志值(Available flags):

  • LIDS:禁止或激活本地 LIDS;
  • LIDS _ CLOBAL:完全禁止或激活 LIDS;
  • RELOAD _ CONF:重新加载配置文件。

Lidsconf 工具

Lidsconf 主要用来为 LIDS 配置访问控制列表(ACLs)和设置密码。输入以下命令能显示 Lidsconf 所有的可用选项:

1
# lidsconf – h

此命令执行后会返回以下命令参数:

  • -A:增加一条指定的选项到已有的 ACL 中
  • -D:删除一条指定的选项
  • -E:删除所有选项
  • -U:更新 dev/inode 序号
  • -L:列出所有选项
  • -P:产生用 Ripemd-160 加密的密码
  • -V:显示版本
  • -h:显示帮助
  • -H:显示更多的帮助
  • -s [--subject]:指定一个子对像,可以为任何程序,但必须是文件。
  • -o[object]:可以是文件、目录或功能(capabilities)和 socket 名称。
  • -j:它有以下几个参数:
  • DENY:禁止访问
    • READONLY:只读
    • APPEND:增加
    • WRITE:可写
    • GRANT:对子对像授与能力
    • ignore:对设置的对像忽略所有权限
    • disable:禁止一些扩展特性
  • 其它选项:
    • -d:目标的可执行 domain
    • -i: 继承级别
    • -t:指定从某一时段到某一时段可以进行怎样的操作
    • -e:扩展列表

主要使用方法

(1)配置 LIDS 保护的文件和目录

首先,用户需要根据具体的情况来确定要保护哪些文件。一般情况下,为了保证 Linux 系统安全,至少需要保护系统二进制文件和系统配置文件,比如:/bin、/sbin/、/usr/、/etc/、/var/log/ 等。

其次,需要确定以什么方式来保护文件。LIDS 提供了如下四种保护类型:

1)拒绝任何人访问:带有 DENY 标志的文件和目录没有人能够看见,也不能修改。那些非常敏感的文件应该加上 DENY 标志。其用法如下:

1
lidsconf -A -o file_to_protected -j DENY

例如,可以使用如下命令来拒绝用户(包括 root 用户)对 /etc/passwd 文件的访问:

1
# lidsconf -A -o /etc/ passwd -j DENY

在重启或重新加载配置文件后,用户将会看到相应的操作遭到 LIDS 的拒绝,从而保护该文件:

1
2
# ls /etc/passwd
ls: /etc/passwd: No such file or directory

2)配制只读文件:任何用户不能改变带有只读标记的文件。比如 /etc/passwd、/bin/passwd 文件一般属于此类。

其用法如下:

1
lidsconf -A -o file_to_protect -j READONLY

例如,我们可以保护整个 /bin/ 目录,使之只读,如下命令所示:

1
# /sbin/lidsconf -A -o /bin/ -j READONLY

也可以保护 /etc/passwd 文件为只读,如下命令:

1
# /sbin/lidsconf -A -o /etc/passwd -j READONLY

3)只能追加的文件:一般来说,系统日志文件应定义成此类。比如 /var/log/message、/var/log/secure。这些文件只能以追加的模式打开,用户不能修改前面的部分。

其用法如下:

1
lidsconf -A -o filename_to_protect -j APPEND

例如,我们可以保护系统日志文件,如下命令所示:

1
2
# /sbin/lidsconf -A -o /var/log/message -j APPEND
# /sbin/lidsconf -A -o /var/log/secure -j APPEND

我们也可以针对具体的网络服务器日志进行保护:

// 保护 httpd 日志文件

1
# /sbin/lidsconf -A -o /var/log/httpd -j APPEND

// 保护 vsftpd 日志文件

1
# /sbin/lidsconf – A – o /var/log/vsftpd –

分布式入侵检测层面:SnortCenter

分布式入侵检测系统的构成

分布式 snort 入侵监测系统的主要组成部分包括中央分析服务器、IDS 探针和协同代理。一般情况下,一个企业的网络可以分为外部网络、企业内部网络和 DMZ 区等。入侵监测系统既可以部署在防火墙之外,也可以部署于防火墙之内。部署于防火墙之外,可以获得更多攻击数据,但是误报警率也高。因此一般情况下,入侵检测系统部署于防火墙之后是比较明智的。

中央分析服务器是整个系统的心脏和灵魂。它一般由一个数据库系统和一个 Web 服务器组成,为系统管理员提供交互式 Web 管理界面。在中央分析服务器上,管理人员可以进行远程 IDS 探针管理、攻击数据查询、实时监视网络攻击及深入分析,如攻击方向的迁移、识别攻击模式等。MySQL 数据库、Apache 服务器、SnortCenter 和 ACID(Analysis Console for Incident Databases) 是一个不错的 snort 平台系统组合。

SnortCenter 是一个基于 Web 的 snort 探针和规则管理系统,用于远程修改 snort 探针的配置,起动、停止探针,编辑、分发 snort 特征码规则。如果与 cron 和 curl 结合使用,SnortCenter 还可以定时为每个探针进行规则升级,自动从 snort 官方站点获得最新特征码规则 (http://www.snort.org/dl/signatures/snortrules-stable.tar.gz)。SnortCenter 的下载地址为 http://users.pandora.be/larc/download/。ACID(Analysis Console for Incident Databases)是一个基于 PHP 的分析引擎,用于查询、管理 snort 探针产生的数据库。ACID 的下载地址为 http://www.cert.org/kb/acid/

另外,代理是向中央分析服务器报告攻击信息的软件,是分布式入侵检测系统的一个重要部件。SnortCenter Agent 和普通意义上的协同代理软件有些不同,它只是一个 SnortCenter 进行探针管理的代理工具。通过 SnortCenter Agent,SnortCenter 能够起动、关闭受保护主机上的 snort 探针;修改探针的配置和使用的特征码规则。SnortCenter Agent 是用 Perl 语言编写的,可以在不同的平台上使用。为了防止登录过程中账户和密码的泄漏,它使用 SSL 和 SnortCenter 之间进行通信。snort 探针是真正进行入侵检测的组件,其源代码可以从 http://www.snort.org 获得。

系统安装及部署

数据库的安装和设置

在分析服务器上,首先要建立记录 snort 报警和日志数据库及 SnortCenter、ACID 需要的数据库。在临时目录中解压缩 snort 的源代码,进入 contrib 目录,建立数据库,并进行相关的配置。配置命令如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
# mysql -u root -p
create database snort;
connect snort
source create_mysql
grant CREATE, INSERT, SELECT, DELETE, UPDATE on snort.* to snort;
grant CREATE, INSERT, SELECT, DELETE, UPDATE on snort.* to snort@localhost;
grant CREATE, INSERT, SELECT, UPDATE on snort.* to acidviewer;
grant CREATE, INSERT, SELECT, UPDATE on snort.* to acidviewer@localhost;
connect mysql
set password for 'snort'@'localhost' = password('yourpassword');
set password for 'snort'@'%' = password('yourpassword');
flush privileges;

SnortCenter

把最新版的 SnortCenter 源代码解压缩,将目录里面的文件复制到 Apache 的 DocumentRoot 目录 ( 如 /usr/local/apache/htdocs)。下载 SnortCenter 需要的 adodb(http://php.weblogs.com/adodb/),安装到 SnortCenter 所在的目录,然后建立 SnortCenter 数据库。操作步骤如下所示:

1
2
3
4
5
#tar zxvf snortcenter-v0.9.6.tar.gz
#cp snortcenter-v0.9.6/* /usr/local/apache/htdocs/
#tar zxvf adodb250.tgz
#cp -R ./adodb /usr/local/apache/htdocs/
#echo "CREATE DATABASE snortcenter;" | mysql -u root – p

完成了基本的安装之后,需要根据系统的情况手工编辑 /usr/local/apache/htdocs/config.php 文件,从而结束 SnortCenter 的配置。一般情况下需要修改的参数见表 2。

表 2. /usr/local/apache/htdocs/config.php 文件需要修改的参数

安装 ACID

ACID 需要 PHP 支持 gd,并对 PHPLot(www.phplot.com)、ADODB 进行支持。新版本的 ACID(0.9.6b22 以后版本)还需要 JpGraph(http://www.aditus.nu/jpgraph/) 的支持。ACID 及相关软件安装到指定位置之后,编辑配置文件 acid_conf.php 完成其配置。

另外,ACID 本身缺乏必要的访问控制机制,需要设置 Apache 对访问 ACID 的用户提供验证。

安装 snort 探针和 SnortCenter Agent

分别进入需要保护主机,安装 snort 和 SnortCenter Agent。SnortCenter Agent 需要 SSL 的支持,所需模块可以从 http://www.cpan.org 得到。安装命令如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
#./configure -with-mysql
# make
# make install
# tar -zxvf Net_SSLeay.pm.1.21.tar.gz
# cd Net_ SSLeay.pm.1.21
# perl Makefile.PL
# make install
# mkdir /opt/snortagent/
# cp snortcenter-agent-v0.1.6.tar.gz /opt/snortagent
# cd /opt/snortagent
# tar -zxvf snortcenter-agent-v0.1.6.tar.gz
# cd sensor
# ./setup.sh
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Snort是一种开源入侵检测系统,用于监控网络流量并检测潜在的入侵行为。它广泛应用于保护各类网络环境的安全。 Snort具有以下几个主要的技术特点: 1. 网络嗅探技术:Snort使用网络嗅探技术来获取经过网络接口的数据包。它可以在网络链路上监听传输的数据,并根据预先定义的规则对数据包进行分析,以便及时检测和响应入侵行为。 2. 规则引擎:Snort依赖于强大的规则引擎来检测入侵行为。用户可以根据自己的需求编写自定义规则,这些规则定义了入侵事件的特征或模式。Snort会根据规则库的规则对经过的数据包进行匹配,一旦匹配到某个规则,就会触发报警。 3. 数据分析和日志记录:Snort能够对抓取到的数据包进行深入分析,并将分析结果记录到日志文件,以供后续的审计和分析。这些日志包括警报信息、攻击类型和其他相关信息,可以提供给安全管理员进行分析和决策。 4. 灵活性和可扩展性:Snort具有很高的灵活性和可扩展性,可以根据需求进行定制和配置。它支持多种类型的规则和插件,用户可以根据自己的需要选择适合的规则和插件。此外,Snort还可以与其他安全工具进行集成,如防火墙和SIEM系统,以提高整体的安全防护能力。 综上所述,Snort作为一种开源入侵检测系统,利用网络嗅探技术、规则引擎、数据分析和灵活的配置等技术特点,可以有效地检测和响应网络的入侵行为。它在网络安全领域具有广泛的应用价值,为用户提供了一个强大、灵活且可扩展的安全防护解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值