网络安全|网络安全实验-入侵检测-基于网络入侵检测系统

实验目的:1.掌握snort IDS工作机理
2.应用snort三种方式工作
3.熟练编写snort规则
实验原理:
一.snort IDS概述
snort IDS(入侵检测系统)是一个强大的网络入侵检测系统。它具有实时数据流量分析和记录IP网络数据包的能力,能够进行协议分析,对网络数据包内容进行搜索/匹配。它能够检测各种不同的攻击方式,对攻击进行实时报警。此外,snort是开源的入侵检测系统,并具有很好的扩展性和可移植性。
二.snort IDS体系结构
snort IDS体系结构如图1所示。


图1SnortIDS体系结构
如上图所示,snort的结构由4大软件模块组成,它们分别是:
(1)数据包嗅探模块——负责监听网络数据包,对网络进行分析;
(2)预处理模块——该模块用相应的插件来检查原始数据包,从中发现原始数据的“行为”,如端口扫描,IP碎片等,数据包经过预处理后才传到检测引擎;
(3)检测模块——该模块是snort的核心模块。当数据包从预处理器送过来后,检测引擎依据预先设置的规则检查数据包,一旦发现数据包中的内容和某条规则相匹配,就通知报警模块;
(4)报警/日志模块——经检测引擎检查后的snort数据需要以某种方式输出。如果检测引擎中的某条规则被匹配,则会触发一条报警,这条报警信息会通过网络、UNIX socket、Windows Popup(SMB)、SNMP协议的trap命令传送给日志文件,甚至可以将报警传送给第三方插件(如SnortSam),另外报警信息也可以记入SQL数据库。
三.snort三种工作方式
snort拥有三大基本功能:嗅探器、数据包记录器和入侵检测。嗅探器模式仅从网络上读取数据包并作为连续不断的流显示在终端上,常用命令snort -dev。数据包记录器模式是把数据包记录到硬盘上,常用命令snort -b。网络入侵检测模式是最复杂的,而且是可配置的。我们可以让Snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。
四.snort规则
1.snort规则定义
snort使用一种简单的规则描述语言,这种描述语言易于扩展,功能也比较强大。snort规则是基于文本的,规则文件按照不同的组进行分类,比如,文件ftp.rules包含了FTP攻击内容。
「注」 snort的每条规则必须在一行中,它的规则解释器无法对跨行的规则进行解析。
snort的每条规则都可以分成逻辑上的两个部分:规则头和规则体。
规则头包括4个部分:
规则行为
协议
源信息
目的信息
图2是对于规则头的描述。

图2snort规则头
snort预置的规则动作有5种:
(1)pass—动作选项pass将忽略当前的包,后继捕获的包将被继续分析。
(2)log—动作选项log将按照自己配置的格式记录包。
(3)alert—动作选项alert将按照自己配置的格式记录包,然后进行报警。它的功能强大,但是必须恰当的用,因为如果报警记录过多,从中攫取有效信息的工作量增大,反而会使安全防护工作变得低效。
(4)dynamic—动作选项dynamic是比较独特的一种,它保持在一种潜伏状态,直到activate类型的规则将其触发,之后它将像log动作一样记录数据包。
(5)activate—动作选项activate功能强大,当被规则触发时生成报警,并启动相关的dynamic类型规则。在检测复杂的攻击,或对数据进行归类时,该动作选项相当有用。
除了以上5种预置的规则动作类型,用户还可以定制自己的类型。
规则体的作用是在规则头信息的基础上进一步分析,有了它才能确认复杂的攻击(snort的规则定义中可以没有规则体)。规则体由若干个被分别隔开的片断组成,每个片断定义了一个选项和相应的选项值。一部分选项是对各种协议的详细说明,包括IP、ICMP和TCP协议,其余的选项是:规则触发时提供给管理员的参考信息,被搜索的关键字,snort规则的标识和大小写不敏感选项。
下面是一个规则实例。

其中,alert表示规则动作为报警。
tcp表示协议类型为TCP协议。
!192.168.0.1/24表示源IP地址不是192.168.0.1/24。
第一个any表示源端口为任意端口。
->表示发送方向操作符。
第二个any表示目的IP地址为任意IP地址。
21表示目的端口为21。
content: "USER"表示匹配的字符串为“USER”。
msg: "FTP Login"表示报警信息为“FTP Login”。
上面的规则也可写成:

方向操作符->表示数据包的流向。它左边的数据包分别是源地址和源端口,目的地址和目的端口。此外,还有一个双向操作符<>,它使snort对这条规则中,两个IP地址/端口之间的数据传输进行记录/分析,例如telnet或者POP3对话。下面的规则表示对一个telnet对话的双向数据传输进行记录:

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

当发现Telnet默认使用的23端口有通信,activate规则会被触发并启动dynamic规则,然后dynamic规则将遵循配置,记录后面的20个数据包。
在上面的例子里activate规则的“activates”值为111,dynamic规则的“activated_by”值为111,这样就把两个规则关联起来,而不是因为这两个规则有相同的规则头。
2.预处理综述
预处理器在调用检测引擎之前,在数据包被解码之后运行。通过这种机制,snort可以以一种out of band的方式对数据包进行修改或者分析。
预处理器可以使用preprocessor关键词来加载和配置,常用到的预处理器如下:
(1)HTTP decode预处器
HTTP解码预处理模块用来处理HTTP URL字符串,把它们转换为清晰的ASCII字符串。
(2)端口扫描器portscan
端口扫描器会把由单个源IP地址发起的端口扫描从开始到结束的全过程记录到标准日志。
(3)stream处理器
stream处理器为snort提供了TCP数据包重组的功能。在配置的端口上,stream处理器能够对TCP数据包的细小片段进行重组,使之成为完整的TCP数据包,然后snort可以对其可疑行为进行检查。
(4)frag2处理器
frag2预处理器为snort提供了IP分片重组的功能。frag2预处理器能够对分片包进行重组来定位分片攻击,它的工作原理是将所有的分片重组构造成一个包含完整信息的数据包,再将这个包传给检测引擎。
五.snort应用
snort采用命令行方式运行。格式为:snort –[options] 。options为选项参数;filters为过滤器。
1.snort主要选项参数
-A 设置报警方式为full,fast或者none。在full方式下,snort将传统的报警信息格式写入报警文件,报警内容比较详细。在fast方式下,snort只将报警时间,报警内容,报警IP地址和端口号写入文件。在none方式下,系统将关闭报警功能。
-a 显示ARP包。
-b 以tcpdump的格式将数据包记入日志。所有的数据包将以二进制格式记录到snort.log文件中。这个选项提高了snort的操作速度,因为直接以二进制存储,省略了转换为文本文件的时间,通过-b选项的设置,snort可以在100Mbps的网络环境中正常工作。
-c 使用配置文件。文件内容主要控制系统哪些包需要记入日志,哪些包需要报警,哪些包可以忽略等。
-C 仅抓取包中的ASCII字符。
-d 抓取应用层的数据包。
-D 在守护模式下运行snort。
-e 显示和记录数据链路层信息。
-F 从文件中读取BPF过滤信息。
-h设置(C类IP地址)为内部网络。当使用这个开关时,所有从外部的流量将会有一个方向箭头指向右边,所有从内部的流量将会有一个左箭头。这个选项没有太大的作用,但是可以使显示的包的信息格式比较容易察看。
-i 使用网络接口文件
-l 将包信息记录到目录下。设置日志记录的分层目录结构,按接收包的IP地址将抓取的包存储在相应的目录下。
-n 处理完包后退出。
-N 关闭日志功能,报警功能仍然工作。
-p 关闭混杂模式的嗅探(sniffing)。这个选项在网络严重拥塞时十分有效。
-r 读取tcpdump生成的文件,snort将读取和处理这个文件。
-s 将报警信息记录到系统日志,日志文件可以出现在/var/log/messages目录里。
-v 将包信息显示到终端时,采用详细模式。这种模式存在一个问题:它的显示速度比较慢,如果你是在IDS网络中使用snort,最好不要采用详细模式,否则会丢失部分包信息。
-V 显示版本号,并退出。
2.Filters过滤器
snort的是标准的BPF格式的过滤器。
snort应用了BPF机制,可以在探测器上书写和执行BPF规则的文件。BPF机制允许用户书写快速的包分析规则,这些规则主要基于源、目的、和其他的头信息。通过嗅探和BPF,我们可以只捕获需要的流量,这样就减轻了需要处理的数据量。
BPF机制很容易理解,可以用于分析TCP、UDP、IP和ICMP协议。规则语法很像自然的口语,使用“and”和“or”作为规则操作符,用“not”作为取反符,此处还可以用括号来告诉引擎将一系列数据作为一个整体来处理。
例如:
ICMP捕获:icmp。
telnet请求数据包捕获:tcp and dst port 23。
记录所有源自网络192.168.0.0/24,目的是202.98.0.0/24的IP流量 :ip and "src net 192.168.0" and "dst net 202.98.0"
实验步骤:
首先使用“快照X”恢复Linux系统环境。
一.snort数据包嗅探
1.启动snort
进入实验平台,单击工具栏“控制台”按钮,进入IDS工作目录,运行snort对网络接口eth0进行监听,要求如下:
(1)仅捕获同组主机发出的icmp回显请求数据包。
(2)采用详细模式在终端显示数据包链路层、应用层信息。
(3)对捕获信息进行日志记录,日志目录/var/log/snort。
snort命令 snort -i eth0 -dev icmp and src 222.25.29.44 -l /var/log/snort
本机执行上述命令,同组主机对当前主机进行ping探测,根据snort捕获信息填写表1。
表1

数据帧源MAC
同组主机MAC
数据帧目的MAC
本机MAC
IP上层协议类型
ICMP
数据包源IP
222.25.29.44
数据包目的IP
222.25.29.23
数据包总长度
0x62
IP报文头长度
20
ICMP报文头长度
8
ICMP负载长度
56
ICMP类型/代码
8/0
2.查看snort日志记录。
「说明」 默认snort日志记录最后一级目录会以触发数据包的源IP命名。可使用组合键Ctrl+C停止snort运行。
二.snort数据包记录
(1)对网络接口eth0进行监听,仅捕获同组主机发出的Telnet请求数据包,并将捕获数据包以二进制方式进行存储到日志文件中/var/log/snort/snort.log)。
Snort命令snort -i eth0 -b tcp and src 222.25.29.44 and dst port 23
(2)当前主机执行上述命令,同组主机telnet远程登录当前主机。
(3)停止snort捕获(Ctrl+C),读取snort.log文件,查看数据包内容。
Snort命令snort -r /var/log/snort/snort.log.XXXX
三.简单报警规则
(1)在snort规则集目录ids/rules下新建snort规则集文件new.rules,对来自外部主机的、目标为当前主机80/tcp端口的请求数据包进行报警,报警消息自定义。
snort规则alert tcp any any -> 222.25.29.23 80 (msg: "XXX"; )
根据规则完成表2的填写。
表2
snort规则动作
tcp
规则头协议
任意IP 任意端口
规则头源信息
222.25.29.23 80
规则头目的信息
当前主机为接收端
方向操作
XXX
报警消息
tcp
(2)编辑snort.conf配置文件,使其包含new.rules规则集文件,具体操作如下:使用vim(或vi)编辑器打开snort.conf,切换至编辑模式,在最后添加新行包含规则集文件new.rules。
添加包含new.rules规则集文件语句include $RULE_PATH/new.rules(规则集文件路径)。
(3)以入侵检测方式启动snort,进行监听。
启动snort的命令snort -c snort.conf。
以入侵检测方式启动snort,同组主机访问当前主机Web服务。
根据报警日志(/var/log/snort/alert)完成表3的填写。
表3
报警名称
XXX
数据包源IP
222.25.29.44
数据包目的IP
222.25.29.23
数据包源端口号
随机
数据包目的端口号
80
四.字符串匹配
说明:FTP服务接收来自客户端的ftp请求(目标端口21/tcp)后,在应答数据包中将告诉客户端自己所使用的FTP软件及版本号,Fedora core5所使用的FTP服务器软件是vsFTPd 2.0.4。换句话说,当网络中传输的数据包含有“vsFTPd”字样的内容时,极大的可能性是一个ftp用户在远程登录Linux下的FTP服务器。通过入侵检测系统对网络数据包进行匹配,发现含有“vsFTPd”字样的数据包,并记录其后续的若干数据包,因为若FTP会话是以明文方式进行的话,那么这些数据包中会有用户登录所使用的用户名及口令。
(1)在snort规则集目录/opt/ExpNIS/NetAD-Lib/Tools/ids/rules下新建snort规则集文件new2.rules,对网络中由vsFTPd参与的通信进行报警,并在FTP服务器声明身份后第一时间内捕获FTP客户端登录用户名及登录口令。
(2)利用activate/dynamic规则对实现。
snort规则activate tcp any 21 -> any any (activates: 81; content: "vsFTPd"; msg: "FTP User Login"; )
(3)编辑snort.conf配置文件,使其包含new2.rules规则集文件。
(4)以入侵检测方式启动snort,进行监听。需要特别说明的是:网络传输数据中的FTP用户名及口令数据是应用层(ISO七层协议)数据,默认情况下snort不显示和记录应用层数据,所以此处在启动snort时应指定其抓取、记录应用层数据。
启动snort的命令snort -d -c snort.conf。
同组主机远程FTP登录,登录过程如图1所示。

图1FTP登录
查看报警日志(日志文件所在目录以远程FTP登录主机IP命名)提取出FTP客户端登录时所使用的用户名及登录口令。
五.端口扫描攻击检测
(1)修改snort配置文件snort.conf启动端口扫描预处理器,以入侵检测方式启动snort,对来自外部的端口扫描行为进行检测。
预处理描述:preprocessor portscan: 172.16.0.0/24 4 3 /var/log/snort/portscan.log
(2)同组主机使用Nmap(/opt/ExpNIS/NetAD-Lib/Tools/portscan/namp)对当前主机进行TCP端口扫描操作,待端口扫描完成,查看portscan.log报警日志,回答下面问题。
「注」 若第一次端口扫描后portscan.log没有日志,不要退出snort,请同组主机进行第二次端口扫描。
portscan.log日志记录格式描述:日期 时间 攻击源IP:源端口 -> 目标主机IP:扫描端口 SYN ******S*。
默认情况下,Nmap在进行目标主机TCP端口扫描时,扫描顺序: 无序。(有序/无序)。
六.IP分片重组检测
说明:IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。这一过程称为分片(fragmentation)。IP 分片(Fragmentation)发生在要传输的IP报文大小超过最大传输单位MTU(Maximum Transmission Unit)的情况。比如说,在以太网(Ethernet)环境中可传输最大IP报文大小(MTU)为1500字节。如果要传输的报文大小超过1500字节,则需要分片之后进行传输。由此可以看出,IP分片在网络环境中是经常发生的事件。但是,如果经过人为的恶意操作的分片,会导致拒绝服务攻击,成为渗透路由器、防火墙或者网络入侵检测系统(NIDS)的一种攻击手段。
IDS对单包进行特征检测,一个攻击者可以使用分片工具将一个包分解成多个分片,而每个单独的分片都不会匹配特征。snort的frag2预处理器能够对分片包进行重组来定位这类攻击。
对IP碎片的探测不是基于规则匹配的,所以snort仍然需要预处理器对IP分片进行重组。在snort.conf配置文件中激活preprocessor frag2项,就可以实现对IP分片进行重组。实例说明如下:
preprocessor frag2: timeout 60, memcap 4194304
timeout选项指明了分片重组的超时时间。如果在这段时间里没有收到分片,就停止对这个包的重组。
memcap选项限制了用于分片重组的内存数量。如果frag2用尽了这部分内存,它就会从分片表中淘汰不活跃的分片。
操作概述:以主机A、B为例,对实验步骤进行说明。主机B利用fragroute构造分片数据包,并将特定负载数据拆分到分片数据包中,并通过eth0发送出去;主机A首先修改snort配置文件snort.conf启动分片重组预处理器,接下来编写报警规则对包含主机B特定负载数据的数据包进行报警,最后以入侵检测方式启动snort,对来自外部的IP分片攻击进行检测。
1.主机B构造并发送IP分片数据包
利用fragroute对流经网络接口的数据包进行指定大小的分片,操作方法如下:
(1)切换当前工作目录至/opt/ExpNIS/NetAD-Lib/Tools/fragroute/,编辑fragroute配置文件(默认目录/opt/ExpNIS/NetAD-Lib/Tools/fragroute/fragroute.conf),修改“ip_frag”项确定分片数据包IP负载大小。
「说明」 ip_frag指定的分片大小必须是8的整数倍,默认为24。
(2)执行命令:./fragroute -f fragroute.conf 主机A的IP,启动fragroute。点击控制台按钮,打开新的终端对主机A进行ping操作,fragroute会将icmp回显请求数据包分片并发送出去。
「说明」 若fragroute提示“fragroute: no route to 主机A的IP: No such process”信息,则先对目标主机A进行ping探测,而后继续启动fragroute即可。
2.主机A监听检测
(1)主机A启动snort以网络嗅探方式进行监听,捕获分析分片数据包负载状况。默认情况下如图2所示。

图2
「注」 ip_frag指定的分片大小不同,图中划线部分数据可能不同。
从上图分析可知,ping请求数据包是以分片方式发送出来的,其中数据串“15 16 17 18 19 1A”被分割到两个数据包中单独进行发送,接收方由TCP/IP的第三层(网络层)对分片进行重组,进而才将“15 16 17 18 19 1A”重组到一个数据包中。
【网络安全|网络安全实验-入侵检测-基于网络入侵检测系统】(2)添加snort检测规则,对网络中包含有“15 16 17 18 19 1A”数据串(应根据实际数据值来确定此处数据串,此处是以图22-1-2为例的)的数据包进行检测报警。
snort规则alert icmp any any -> any any (content: "|0D 0E 0F 10 11 12|"; msg: "Fragment Test"; )
(3)修改snort配置文件snort.conf启动分片重组预处理器,并包含新规则集文件。
预处理描述: preprocessor frag2: timeout 60, memcap 4194304
(4)以入侵检测方式启动snort,开始监听。
(5)同组主机继续对当前主机进行ping探测,并成功对icmp回显请求数据包进行分片。
(6)当前主机查看snort报警日志。若有“Fragment Test”报警消息,证明snort成功对分片数据包进行了重组。

    推荐阅读