实验 snort安装配置与NIDS规则编写
1 实验目的
在linux或windows任意一个平台下完成snort的安装,使snort工作在NIDS模式下,并编写符合相关情景要求的snort规则。
2 实验环境
物理机:windows 8.1
虚拟机:ubuntu 12.04 和 windows xp sp3
软件:winpcap 4.0.2 、 snort 2.9.7.2 和 KIWI日志查看工具
其他需要配合使用的服务或软件:IIS 和 rdesktop
3 实验原理
snort有三种工作模式:嗅探器、数据包记录器、网络入侵检测系统。嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上。数据包记录器模式把数据包记录到硬盘上。网路入侵检测模式是复杂的,而且是可配置的。我们可以让snort分析网络数据流以匹配用户定义的一些规则, 并根据检测结果采取一定的动作。
本实验要求snort工作在NIDS模式,即网络入侵检测模式。在我的虚拟机中,使用下面命令行可以启动这种模式:
c:snort\bin\snort -dev -l c:\snort\log -h 192.168.200.0/24 -c c:\snort\etc\snort.conf
snort.conf是规则集文件。snort会对每个包和规则集进行匹配,发现这样的包就采取相应的行动。如果不指定输出目录,snort就输出到/var/log/snort目录。
如果想长期使用snort作为自己的入侵检测系统,最好不要使用-v选项。因为使用这个选 项,使snort向屏幕上输出一些信息,会大大降低snort的处理速度,从而在向显示器输出的过程中丢弃一些包。
此外,在绝大多数情况下,也没有必要记录数据链路层的包头,所以-e选项也可以不用:
c:snort\bin\snort -d -h 192.168.200.0/24 –l c:\snort\log -c c:\snort\etc\snort.conf
这是使用snort作为网络入侵检测系统基本的形式,日志符合规则的包,以ASCII形式保存在有层次的目录结构中。
IP地址是一个规定,现在使用的是IPv4,既由4个0-255之间的数字组成,在计算机内部存储时只需要4个字节即可。在计算机中,IP地址是分配给网卡的,每个网卡有一个唯一的IP地址,如果一个计算机有多个网卡,则该台计算机则拥有多个不同的IP地址,在同一个网络内部,IP地址不能相同。使用端口号,可以找到一台设备上唯一的一个程序。所以如果需要和某台计算机建立连接的话,只需要知道IP地址或域名即可,但是如果想和该台计算机上的某个程序交换数据的话,还必须知道该程序使用的端口号。在本实验中,涉及到的端口号有http的80端口和IIS的3389端口。
4 实验内容
1) 写一个snort规则,当它检测到你的电脑被其他的电脑通过HTTP协议访问时,会发出一个报警。
2) 写一个snort规则,当有人在除了你的电脑之外的地方通过任意协议使用管理员权限登录时,会发出一个警报。
5 实验步骤
5.1 安装snort及其相关环境
1)首先安装wincap。默认选项一直单击下一步直至安装完成。
2)从www.snort.com下载snort安装包。默认安装到C盘(其实我的虚拟机winxp中只有一个盘),这样后面的路径比较好改。一直单击下一步,直至安装完成,弹出一个包含有success的对话框。Snort版本如图5.1.1。
图5.1.1
3)snort会生成一些日志文件,与输出到控制台上相比,使用日志查看工具更加方便查找和阅读。因此,要下载一个名为KIWI日志阅读工具的小程序。解压后就能直接运行。可以通过这个软件阅读snort生成的相关日志。KIWI工具如图5.1.2。
图5.1.2
5.2 情景一的实验过程
情景一要求写一个snort规则,当它检测到你的电脑被其他的电脑通过HTTP协议访问时,会发出一个报警。
首先查看本地主机的IP地址。如图5.2.0。
图5.2.0
阅读snort手册之后,可以了解到snort规则分为两部分,括号之前是规则头,括号内是规则选项部分。规则头包含规则的动作、协议、源和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。
按照手册上详细的规则介绍,编写符合情景一的规则如下:
alert tcp ![192.168.200.128/32] any -> 192.168.200.128/32 80 (logto:”task1”; msg:”this is task 1”; sid:1000001)
alert 表示这是一个警告。tcp表示要检测所有使用tcp协议的包,因为http协议是tcp/ip协议的一部分。接下来的一部分表示源IP地址,其中!表示除了后面IP的所有IP,因此![192.168.200.128/32]表示的就是除了本机之外的所有主机。再后面的一个表示端口,any表示源IP地址任何一个端口,也就是说源IP地址的主机不管哪个端口发送的包都会被检测。->表示检测的包的传送方向,表示从源IP传向目的IP。下面的一个字段表示目的IP,在这里表示主机。后面的字段表示端口号,经过查阅相关资料,80端口在winxp中作为IIS对主机的访问端口。
括号中的规则选项部分,logto表示将产生的信息记录到文件,msg表示在屏幕上打印一个信息,sid表示一个规则编号,如果不在规则中编写这个编号,则执行过程中会出错,而且这个编号是唯一的能够标识一个规则的凭证,1000000以上用于用户自行编写的规则。
因此,这条规则会将除了本地主机之外的所有主机的所有端口发向本主机80端口的tcp数据包进行检测,并报警记录到日志文件中。
Snort中有rules文件夹,文件夹中记录了snort运行的检测规则。我将上面编写的规则保存在了local.rules文件中,如图5.2.1。
图5.2.1
编写好rules之后,还要配置snort运行时加载的配置文件。在snort文件夹下的etc文件夹下有一个snort.conf文件,这个文件是学习如何配置配置文件的很好的典范。我直接将这个文件拷贝一份并命名为mysnort.conf。通过学习这个文件,我发现有这样几个地方要改:
1) 改变规则的路径
因为snort原本是为linux平台编写的,因此文件路径都是相对的。而在windows系统下,必须要使用绝对路径。如图5.2.2,有几处的路径需要修改,见标为黄色的部分。
2) 声誉预处理器(我不知道这个预处理器的准确中文是什么,因此暂且称其为声誉预处理器)
声誉预处理器中实际上就是规定黑白名单的过滤规则,而在我们的实验中实际只需要报警,并不需要过滤。因此直接注掉这两行。修改如图5.2.2。
图5.2.2
3) 修改动态预处理器路径
在这三条中后两条暂时用不到,所以直接注掉。
第一条的路径要改为系统中snort_dynamicpreprocessor文件夹的路径。
修改如图5.2.3。
图5.2.3
4) 声誉预处理器的具体部分
因为我上面将声誉处理器注释掉了,因此也要将这一部分注释掉,不然执行过程中会出错。修改如图5.2.4。
图5.2.4
5) 添加rules规则
因为我将自己编写的规则保存在了local.rules中,为了只执行自己编写的规则,需要将除了local.rules之外的规则全部注释掉。如图5.2.5。
图5.2.5
到这里规则及配置都编写完成。
接下来,需要在本地主机建立一个可以被外网主机访问的网站,用来测试我编写的规则是否满足情景的条件。
我计划通过另一台ubuntu虚拟机来访问本地主机的网站。因此我首先查看了ubuntu的IP地址,命令及结果如图5.2.6。红线圈出了ubuntu的IP地址。
图5.2.6
之后要开始在winxp中搭建一个web网站。
在开始->控制面板->添加或删除程序->添加或删除windows组件中勾选上IIS服务选项,并单击下一步,加载当时的xp安装镜像,系统会自动完成安装,并将IIS服务加入到系统中。如图5.2.7。
图5.2.7
然后再控制面板中找到管理工具,双击INTERNET信息服务,在默认网站上单击右键,新建一个网站命名为web,并配置网站的路径,我选择的是c:\my file\web。如图5.2.8。
图5.2.8
下面需要改变windows防火墙的一些设置,使得外网能够访问本地的网站。然而,我不会目的性的关闭某一个防火墙选项,所以我选择了最简单直接的办法,直接关掉windows防火墙。如图5.2.9。
图5.2.9
之后,编写一个简单的网页,并保存到建立的web站点文件夹下。如图5.2.10和图5.2.11。这个网页不具有任何实际的有意义的功能,只能显示。
图5.2.10
图5.2.11
到此为止,情景一已经搭建完毕。本地主机是192.168.200.128,本地主机拥有一个网站,可以通过htpp:\\192.168.200.128\web\index.html来访问这个网站。其他主机可以通过访问本地主机的80端口来访问这个网站,其他主机的其中一个就是192.168.200.129。
接下来,我要检验为情景一搭建的规则是否奏效。
首先使用c:\snort\bin\snort –W来查看本地主机的网卡,如图5.2.12。我的主机网卡有效的是第二个,已经标成黄色。
图5.2.12
接下来使用如图5.2.13所示的指令来进行检测。
图5.2.13
这个指令的含义是在网卡2进行检测,将符合配置文件c:\snort\etc\mysnort.conf中的包含的规则的数据包以二进制形式记录在c:\snort\log目录下,如果检测到有符合条件的数据包流过,在屏幕上打印报警信息(包含源IP、目的IP、数据包信息等)。
指令执行之后,会经过比较长的一段时间才能开始数据包的检测,其开启过程的部分截图如图5.2.14和图5.2.15。
图5.2.14
图5.2.15
从图5.2.15中可以看出,此时已经开始了数据包的检测,屏幕是一直滚动的,因为不断有数据包被接收。
打开c:\snort\log文件夹,发现已经有新的日志文件生成。使用KIWI日志查看工具打开这个日志文件,发现只有一行数据,相当于还没有符合条件的被警报的数据包被记录。
然后,我首先从本地主机登录编写的web网站,如图5.2.16。
图5.2.16
在KIWI窗口中刷新日志文件,发现仍然只有之前的一行数据。说明本地对web网站的访问是没有引起警报的,符合情景一的要求。
之后,打开ubuntu虚拟机,就是IP地址是192.168.200.129的那一台虚拟机。在浏览器中访问192.168.200.128/web/index.html,就是本地主机上编写搭建的网站。可以发现网页能够被访问,虽然是乱码(不影响实验进行,所以在此忽略掉这个问题)。如图5.2.17。
图5.2.17
此时,快速回到xp虚拟机中,发现在控制台的数据包快速的滚动,其中一张截图如图5.2.18。
图5.2.18
从这张图中,可以发现,数据包的传输是在192.168.200.129和192.168.200.128之间进行的。对于xp管理员,已知本地主机的IP是192.168.200.128,那么192.168.200.128就是链接本地主机的计算机,也就是要被警报的那一台通过HTTP协议访问我的主机的其他主机。
在控制台窗口下按ctrl+c结束snort的运行。结束后的屏幕输出信息如图5.2.19、图5.2.20和图5.2.21。图略。
从上面三张图中可以看出,snort本次检测一共检测到70个包,70个包都被允许通过(因为我没有设置黑白名单),包的详细分类见图5.2.19。在检测到的包中一共产生了4个警告,但是只记录了1个,4个警告就是从ubuntu访问xp网站时从ubuntu发出的数据包。
然后,在KIWI界面点击刷新按钮,出现信息如图5.2.22。
图5.2.22
上图中完整的显示了一个被报警的数据包的信息。访问的目标是192.168.200.128的/web/index.html,通过HTTP/1.1协议,源主机使用的代理是Mozilla/5.0,系统是ubuntu,linux i686,浏览器是火狐,火狐的软件版本是11.0,内核版本是20100101。 浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、application/xml 和 */*,优先顺序是它们从左到右的排列顺序。浏览器支持的语言英文(美国)和英文,优先支持英文(美国)。所以这是不是浏览器打开网页乱码的原因?浏览器支持的压缩编码是 gzip 和 deflate。客户端与服务连接类型为持久链接。浏览器缓存页面的最后修改时间是格林尼治时间2015年5月16日7:7:51,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端接到之后,就直接把本地缓存文件显示到浏览器中。如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件 缓存起来,并显示到浏览器中。
实验到此,可以证实,我编写的snort规则可以满足情景一的要求。
5.3 情景二的实验过程
情景二要求写一个snort规则,当有人在除了你的电脑之外的地方通过任意协议使用管理员权限登录时,会发出一个警报。
编写规则如图5.3.1。
图5.3.1
情景二要求的是任何协议,但是我通过阅读snort手册发现,snort当前版本只支持tcp、udp、icmp、ip四种协议,在协议字段写any又会报错,因此只好把四条协议分成四个规则来写。
大体规则如下:
alert 协议 ![192.168.200.128/32] any -> 192.168.200.128/32 any (logto:”task2”; content:”administrator”; nocase; msg:”this is task 2”; sid:1000002)
这条规则的意思是对所有从除了本地主机之外的主机的任何端口发向本地主机的任何端口的数据包进行检测,如果包中信息包含“administrator”,大小写自动匹配,就发出警报。
其中,“协议”部分用四个协议代替,content部分标明要在数据包中检测的信息内容,这里是区分大小写的。而我并不知道数据包中的用户名是以何种大小写方式发送的,因此要在后面加上nocase字段,表示对数据包中的信息进行大小写自动匹配,即不区分大小写。
同样,这个规则要添加到local.rules文件中,mysnort.conf文件不用再进行修改。
接下来要在本地添加一个可以进行远程登录的账户。开始->我的电脑单击右键选择属性->远程->勾选允许用户远程连接到此计算机->选择远程用户,将管理员Administrator添加进来。这里注意添加进远程登录的用户一定要有密码,不然登陆不上。我第一次实验就是在这里犯了错误。如图5.3.2。
图5.3.2
然后回到我的win8.1系统下,找到远程桌面连接,输入192.168.200.128,进行远程连接,再输入用户名administrator和密码,发现已经在窗口中打开了虚拟机中的xp桌面。
到此为止,情景二的环境已经搭建完成。下面进行规则的验证。
在xp下的控制台使用与情景一相同的命令c:\snort\bin\snort –i2 –dev –A fast –l c:\snort\log –c c:\snort\etc\mysnort.conf进行检测。等到屏幕上出现数据包滚动时,回到win8.1系统下,进行远程桌面链接,打开xp桌面后,发现控制台的信息在快速滚动。使用KIWI打开新生成的日志文件,却发现什么内容也没有。也就是说没有任何符合筛选条件的数据包被捕获。此时,我结束了snort的运行,回到虚拟机的xp系统下,修改local.rules文件,将规则的content和nocase部分删去,并将目的IP地址的端口设为3389(3389是windows远程桌面连接的端口)。这样所有目标端口为本地主机3389端口的数据包都将被截获。再次实验,发现日志中产生大量不可阅读的信息。这说明远程桌面连接的数据包确实是按照四个规则之一进行传递的,但是用户名也被进行了加密,而不是直接使用“administrator”进行传送,因此使用content进行包数据匹配时找不到符合条件的信息,就不会有符合规则的包被记录,日志文件就是空的。鉴于我不知道windows的加密规则是什么样的,也不知道“administrator”加密之后的信息是什么样的,我决定换ubuntu系统进行远程登录,看这一次能不能进行成功的匹配。
首先将上面修改过的local.rules文件恢复回去,即加上content和nocase,并取消设置端口号3389。
Ubuntu系统要想远程登录windows系统需要安装rdesktop。安装好之后,使用命令rdesktop –u username –p pwd ip就可以登陆远程windows桌面。操作如图5.3.3。
图5.3.3
可以发现在右下角的弹窗中已经打开了winxp桌面,控制台的信息在快速滚动。回到xp系统下,可以看到控制台的部分数据包是这样的,如图5.3.4。
图5.3.4
xp管理员通过控制台可以看到192.168.200.129的48680端口在访问本地主机的3389号端口,也就是在进行远程桌面登录。
用KIWI打开日志文件,内容如图5.3.5。
图5.3.5
其中可读信息包含远程登录的用户名。说明规则编写成功。
6 实验总结
这一次实验的完成过程一波三折。
首先我在计划在我的windows 8.1物理机上进行本次实验,但是装到snort时,我发现有一个小插件是不支持这个版本的,又加上当时物理机的磁盘存储逼近饱和,决定放弃物理机。
之后,我又尝试在fedora上进行实验。fedora上安装的软件较多,大大小小的用于支持snort的软件包装了将十几个,光是指令就写了一页A4纸。很多的软件包还是不能够直接下载安装的,需要下载源代码然后编译安装。整个过程进行到一半时,又有一个包即使是编译后也不能安装,进过网上查找原因发现,这个包没有支持fedora的版本。万般无奈之下,又转向了ubuntu。
在前两个过程中我用了一周多的课余时间来配置相关环境。
我的虚拟机中之前就有一个ubuntukyln14.04的版本,于是我直接在这个平台下进行实验。前面两个平台中出现的问题在这个平台上都通过了,成功安装了十几个包,命令如下:sudo apt-get install libpcap0.8-dev libmysqlclient15-dev mysql-client mysql-server bison flex apache2 libapache2-mod-php5 php5-gd php5-mysql libphp-adodb php-pear pcregrep snort
但是又出现了新的问题,一个snort-mysql的包找不到,出现错误如下:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package snort-mysql is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package ‘snort-mysql‘ has no installation candidate
在解决这个问题的过程中,根据网上查阅的相关资料,我尝试了升级内核和所有软件,但是在升级过程中又出现了找不到包和校验错误的问题。我先后尝试了如下图的方法:
上图是我在CSDN论坛上提问的问题部分截图。但是三种办法都没有成功,最终这个提问也没有得到很好的解决。帖子是5月11日发的,等了两天还没有结果之后决定再次放弃。后来通过查资料和与同学讨论得知,ubuntu的高版本是不支持这个包的。
实验进行到这里,我的物理机由于之前装的软件太多,已经变得很卡很慢。于是在15号的时候,在我拷贝出重要文件后,对物理机恢复初始化(格式化磁盘),重新安装。
16日装完虚拟机后继续进行试验。这时,我几乎只剩一个选择,在xp上进行实验。同时,我还安装了ubuntu的12.04的较低版本。
我在网上找到了xp下安装snort的相关教程,但是教程中只说了要装winpcap、snort、KIWI三个软件,具体的操作和文件配置没有涉及。于是,在安装完成之后,我下载了snort手册,先用了半天时间通读了手册的内容,并且试验了几乎每一条手册中出现的指令,终于明白了snort的操作原理和日志文件及配置文件的位置。之后,我打开配置文件,讲英文的内容注释的重要部分翻译成中文,边翻译边理解,终于弄懂了配置文件(snort.conf)的作用,及包含的内容,这又是半天时间。然后根据我的需要修改相关内容开始实验。
幸运的是,我编写的规则都比较正确,除了一些小意外之外没有太大的调整的地方,因此很顺利的就在16日晚上完成了实验。
所以,这次试验对我来讲真的有很大的意义。首先,不管是主动地还是被动的,我学会了实验时在四个平台上出现的问题的解决办法;其次,被动的在时间很紧张的情况下很勇敢的自己重装了电脑,之前只在台式机上重装过xp,但是当时没有作业的deadline;接着,学会了远程桌面登录的方法,学会了不装apache、tomcat,只用windows自带的IIS建立网站的方法;最后,也是最重要的,学会了snort的使用方法,也理解了检测的原理(应该只理解了一部分,一定还有我不知道的),学会了规则编写,完成了实验。
当然,从我的曲折的实验过程来讲,最最重要的就是坚持。如果当时我尝试了一个平台就放弃,或者在某一步放弃,我不会有如此大的收获,实验也不会完成。
===================================================================
本文是本人实验过程的描述,其中相关环节及知识如有不当之处,还望各位前辈指正!谢谢!
===================================================================
实验战线拉得很长,实验过程对本人这个初学者来讲也很“辛苦”,码字也很“辛苦”,如需转载请注明出处!谢谢!