入侵检测学习 Snort [一]



0x01 关于Snort

1
2
3
业界相对比较出名年头也比较久的一款基于网络的开源入侵检测工具
不过,比较适合中小型网络 [在流量不是非常大的情况下还是很不错的选择],规则配置灵活,实战适用性相对较好
只是,实在不知道为什么要弄一头猪做logo,这文化差异大的有点儿着实让人无法理解 :)

0x02 理解snort的最基本的工作流程

1
2
3
内网中的数据 -> 数据嗅探[让内网中其它机器上的数据流过自己] -> 进行各种预处理[防止数据逃逸] -> 规则检测引擎 -> 处理报警/日志
| |
匹配规则库 存到数据库或者写到日志文件中

0x03 模块具体作用简介

1
2
3
4
数据包嗅探,让其它机器上的指定数据包都经过自己,以便snort分析数据,同样,用的也是libpcap库,包括在其它很多linux平台嗅探工具你都能看到它的身影
预处理,包重组预处理器,主要是为了防止攻击包被拆分逃避Snort的检测,另一个是协议编码预处理器,主要负责把数据包协议解码成一个统一的格式,再丢给检测模块,最后一个是协议异常检测预处器
规则匹配检测,也就是当预处理把数据包丢过来以后,规则引擎会将这些数据包逐个和规则库进行匹配,一旦发现数据包内容与某条规则匹配,就丢给报警模块去处理
报警/日志模块,规则引擎将数据丢给报警模块以后,报警模块会根据snort事先定义好的规则动作(alert,log...)对其进行不同的处理(写到数据库或日志文件中)

0x04 Snrot 大致目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/etc/snort/
├── attribute_table.dtd
├── barnyard2.conf 将报警事先插到数据库中,里面主要定义了一些日志文件位置和数据库连接信息
├── classification.config
├── etc
├── file_magic.conf
├── gen-msg.map
├── Makefile
├── Makefile.am
├── Makefile.in
├── preproc_rules
├── reference.config
├── rules snort规则库目录
├── snort.conf snort的主配置文件,关于snort工具本身的配置全在这里
├── so_rules
├── threshold.conf
└── unicode.map

0x05 环境准备,主要是所需的各类源码包及必要的依赖包

1
2
3
4
5
6
7
8
9
10
centos6.9 x_64
adodb519.tar.gz
barnyard2-1.9.tar.gz
base-1.4.5.tar.gz
daq-2.0.4.tar.gz
idsctl.zip
libdnet-1.12.tgz
libpcap-1.0.0.tar.gz
snort-2.9.7.0.tar.gz
snortrules-snapshot-2970.tar.gz

0x06 将要检测的内网卡[检测指定内网段]设为静态ip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth3
HWADDR=00:0c:29:9b:51:ef
TYPE=Ethernet
UUID=effae4e2-c6e6-4bf8-b9bd-f16ebc38b733
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
USERCTL=no
PEERDNS=yes
IPV6INIT=no
IPADDR=192.168.1.177
NETMASK=255.255.255.0
DNS2=8.8.8.8
GATEWAY=192.168.1.1
DNS1=114.114.114.114

0x07 先yum一个简易的lamp环境,主要是为了后期在前端展示报警事件方便,所以在这里就直接提前yum一个

1
2
3
4
5
6
7
8
9
# yum install -y epel-release
# yum install -y gcc gcc-c++ flex bison zlib* libxml2 libpcap* pcre* tcpdump git libtool curl man make wget tree
# yum install -y mysql-server mysql-devel php-mysql php-adodb php-pear php-gd libtool php-imap php-ldap php-mbstring php-odbc php-pear php-xml php-pecl-apc httpd php php-mcrypt mcrypt libmcrypt libmcrypt-devel
# chkconfig --level 235 mysqld on
# chkconfig --level 2345 httpd on
# vi /etc/httpd/conf/httpd.conf
ServerName localhost:80
# /etc/init.d/mysqld start
# /etc/init.d/httpd start

0x08 编译安装Snort

1
2
3
# tar xf libdnet-1.12.tgz
# cd libdnet-1.12
# ./configure && make && make install

1
2
3
# tar xf libpcap-1.0.0.tar.gz
# cd libpcap-1.0.0
# ./configure && make && make install
1
2
3
# tar xf daq-2.0.4.tar.gz
# cd daq-2.0.4
# ./configure && make && make install
1
2
3
# tar xf snort-2.9.7.0.tar.gz
# cd snort-2.9.7.0
# ./configure && make && make install

0x09 配置snort,尽量让snort以一个普通用户权限起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# mkdir /etc/snort
# cp /root/snort-2.9.7.0/etc/* /etc/snort/
# ls /etc/snort/ && cd /etc/snort/
# tar xf /root/snortrules-snapshot-2970.tar.gz
# touch /etc/snort/rules/white_list.rules /etc/snort/rules/black_list.rules
# groupadd -g 5600 snort
# useradd snort -u 5600 -d /var/log/snort -s /sbin/nologin -c SNORT_IDS -g snort
# chown -R snort.snort /etc/snort/
# chown -R snort.snort /var/log/snort/
# vi /etc/snort/snort.conf
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules
config logdir:/var/log/snort
output unified2: filename snort.log, limit 128
# ln -s /usr/local/bin/snort /usr/bin/snort
# mkdir -p /usr/local/lib/snort_dynamicrules
# chown -R snort.snort /usr/local/lib/snort_dynamicrules/
# chmod -R 755 /usr/local/lib/snort_dynamicrules/

0x10 先随便先添加一条规则,做下简单测试,规则的意思也很明显,对任意机器间来往的icmp进行报警

1
2
# vi /etc/snort/rules/local.rules
alert icmp any any -> $HOME_NET any (msg:"Ping test";sid:1000003;rev:1;)

0x11 编译安装 barnyard2,顺带把表结构都导进去,等会儿要往里面插各种snort数据

1
2
3
4
5
6
7
8
9
10
11
# tar xf barnyard2-1.9.tar.gz -C /usr/local/src/
# mysqladmin -u root password "admin"
# mysql -uroot -p
mysql> create database snort;
mysql> use snort;
mysql> create user 'snort'@'localhost' identified by 'admin';
mysql> grant create,select,update,insert,delete on snort.* to snort@localhost identified by 'admin';
mysql> set password for snort@localhost=password('admin');
mysql> source /usr/local/src/barnyard2-1.9/schemas/create_mysql;
mysql> show tables;
mysql> flush privileges;

1
2
3
4
5
6
7
8
9
10
11
12
# cd /usr/local/src/barnyard2-1.9/
# ./configure --with-mysql --with-mysql-libraries=/usr/lib64/mysql/ && make && make install
# mkdir /var/log/barnyard2
# touch /var/log/snort/barnyard2.waldo
# chown -R snort.snort /var/log/snort/barnyard2.waldo
# cp /usr/local/src/barnyard2-1.9/etc/barnyard2.conf /etc/snort/
# vi /etc/snort/barnyard2.conf
config logdir: /var/log/barnyard2
config hostname: localhost
config interface: eth3
config waldo_file: /var/log/snort/barnyard2.waldo
output database: log, mysql, user=snort password=admin dbname=snort host=localhost

0x12 启动snort,观察报警事件到底有没有被记录到数据库中

1
2
3
4
5
6
7
# unzip idsctl.zip
# ./idsctl
# ./idsctl start
# snort -q -u snort -g snort -c /etc/snort/snort.conf -i eth3 -D
# ping 192.168.1.1 随便ping,只是为了让snort捕获icmp
# mysql -u snort -p -D snort -e "select count(*) from event"
# ll /var/log/snort/

0x13 安装展示前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# pear upgrade pear
# pear channel-update pear.php.net
# pear install Image_Graph-alpha Image_Canvas-alpha Image_Color Numbers_Roman
# tar xf adodb519.tar.gz -C /var/www/html/
# mv /var/www/html/adodb5/ /var/www/html/adodb
# tar xf base-1.4.5.tar.gz -C /var/www/html/
# mv /var/www/html/base-1.4.5/ /var/www/html/base
# vi /etc/php.ini
error_reporting = E_ALL & ~E_NOTICE
# chown -R apache.apache /var/www/html/
# chmod -R 755 /var/www/html/
# pkill snort
# /etc/init.d/mysqld restart
# /etc/init.d/httpd restart

0x14 访问前端页面进行简单配置,观察报警事件有没有被取出来,最后,实际部署成功的效果图如下

1
http://192.168.1.177/base/base_main.php

''

0x15 本次的重点只是先把平台搞起来再说,后期的重点,还是会在下面这些点上,每个点涉及到的具体的东西可能又非常的多,不是简短几句话就能说明白的,长路漫漫,还是一点一点的稳扎稳打吧

1
2
3
4
5
6
7
8
9
10
11
12
根据自己的实际需求熟练编写Snort规则
捕捉内网各种常规端口扫描特征,主要是针对各种常见的端口扫描工具标志,如,nmap,zmap,masscan,supersan...
捕捉内网各类基础服务爆破特征,主要是针对hydra,medusa...
捕捉内网web各种高危入侵特征[sql注入,xss劫持,表单爆破...]
捕捉内网各类常规嗅探行为,如,最典型的arp...
借助snort识别内网中的各类meterpreter的shell
感知内网中的各种常规脱裤行为,如,pgsql,oracle,mysql,mssql...
识别内网中的常规DDOS流量并灵活与iptables进行联动
捕捉各类常规非加密tcp远控数据特征
尝试识别捕捉各种常规流量重放攻击
深入学习理解各类入侵检测对抗手段
....

0x16 小结:
    平台部署确实比较简单,基本也不存在什么技术含量,最终,关键还是看我们能不能用工具实际的干活,再牛逼的工具,不能很好的用起来,也只是摆设,这也可能是后期要重点慢慢啃的地方,还是那句话,实战为主,后期我们还会着重介绍另一款入侵检测系统,Suricata,个人觉得这个会更好,至于为什么更好,待续…