入侵检测
目的
了解入侵检测的基本原理,尝试在 Windows XP 下配置 Snort IDS 并完成基于 Snort 的攻击检测。尝试利用 Snort 规则语法自己编写简单的 Snort 规则。
本篇文章为实验记录,仅供交流学习使用,切勿违法应用,所有文中提到的工具不提供下载。
原理
入侵检测定义
入侵检测是防火墙的合理补充,帮助系统对付网络攻击,扩展了系统管理员的安全管理能力 (包括安全审计、监视、进攻识别和响应),提高了信息安全基础结构的完整性。它从计算机网络系统中的若干关键点收集信息,并分析这些信息,看看网络中是否有违反安全策略的行为和遭到袭击的迹象。入侵检测被认为是防火墙之后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测,从而提供对内部攻击、外部攻击和误操作的实时保护。
Snort 软件
Snort 是由 Sourcefire 开发的一个开源的网络入侵检测系统。用 C 语言编写的开放源代码软件。它是一个跨平台、轻量级的网络入侵检测软件。它结合了协议、特征和基于异常的检测,是目前使用最多的 IDS/IPS 系统。
一条 snort 规则包括包含规则头和规则选项两部分;snort 规则如下:
- Snort 规则应写在一行,若需多行,应用
\
来拆分。 - 规则头包含规则的动作,协议,源和目标的 IP 地址和端口信息
- 规则选项部分包含细节、具体的描述和约定。
实验过程
配置 Snort 环境
首先装好 Snort 软件。用 snort -W
命令测试安装正确性
![](/2019/11/25/experiments/security/web/ids/0.png)
![界面上显示了“小猪嘴”和版本号,即宣告安装成功](/2019/11/25/experiments/security/web/ids/1.png)
-
运行
snort -i 1
可以进入嗅探模式,显示如下 -
运行
snort -de -1
进入的是数据包记录器模式。我把日志记录在了 C 盘的 Snort/log 文件夹下,此文件可以用 Wireshark 打开。 -
根据实验指导书做一些配置修改后,用以下命令启动攻击检测模式。
1
snort -c "path/to/snort.conf" -l "path/to/logdir"
- 此时开始了攻击检测模式,可以到
C:/Snort/log
下查看告警日志。 - 不过里面没有 UDP 包告警的相关的信息…… 是因为默认的社区规则里面并没有针对这个情况进行专门配置
- 此时开始了攻击检测模式,可以到
添加 UDP 规则
-
在本地添加一条 UDP 规则
1
alert udp any any <>$HOME_NET any (msg:”udp ids/dns-version-query”;content:”version”;)
含义
这条规则的含义是:对一条 UDP 规则生成一条警报并记录这个包,此规则针对任意 UDP 协议的非本地任何地址任何端口双方向(HOME_NET 在 snort.conf 中有配置,应该配置为本机的地址),发送一条信息,内容为”udp ids/dns-version-query”,包含”version” 字符即匹配
-
由上图得知,我的电脑的
HOME_NET
值应该为 192.168.235.136。将规则加入 local.rules 中,注释掉其他的 rules,只运行自己写的 rules。最终规则语句调整为
alert udp any any <> $HOME_NET any (sid:xxxx;msg:"udp ids/dns-version-query";content:"version";)
,<>
两侧必须有空格,每条规则必须有一个 sid 值,msg 必须包含在英文引号中。 -
在另一台虚拟机上运行 UDP Flood 工具,对 135 端口进行扫描攻击。注意所发的信息要包含
”version”
字符串,才会有报警(否则不会匹配规则)。- alert.ids 和同期所记录 log 用 wireshark 打开的结果如上图所示。
实验结果及分析
自己编写 Snort 规则:mytelnet.rules
要求:记录外网对内网的 Telnet 连接企图,并发出下面的警告:External net attempt to access internal telnet server。
-
根据 snort 规则的相关编写知识,得到相应的 snort 规则应该为:
1
alert tcp !$HOME_NET any -> $HOME_NET 23 (msg:"External net attempt to access internal telnet server";sid:xxxx;)
-
装入 local.rules 进行测试,然后用外网 telnet snort 所在的虚拟机地址。测试结果如下:(测试机需要事先开启 telnet 服务)
果然在
alert.ids
中有相应记录
利用 Snort 检测网络扫描攻击
为使 snort 具备端口扫描检测的能力,需要启用端口扫描检测插件,在 snort 中,这类插件通常通过预处理器的方式提供。
-
在
snort.conf
中,找到sfportscan
预处理器,把注释去掉以开启这个预处理器。其中 proto 参数代表欲检测的协议,取值有 tcp udp icmp ip all,各参数间空格分开,这里写 all 就行。 Memcap 代表分配给端口扫描的最大字节数,数字越高,越多节点可以被跟踪。Sense_level 用于检测端口扫描的敏感度水平。取值有 low medium high 三种。low 级别使用通用方法来查找响应错误,medium 会检测端口扫描和过滤端口扫描(那些没有收到响应的端口扫描),high 级别有最小的端口检测限制。这里设为了 high。除此以外,还有 scan_type、logfile、watchip、ignore_scanners 配置项,对于本实验的需求不大。
-
在一台攻击机上启动 nmap 进行扫描。同时在目标机上启动 snort。
-
结果只检测出了上述三个有效信息,没有像预期那样检测到扫描工具扫描的痕迹。
预期可能会检测出类似于 SCAN UPnP service discover attempt 这样的信息,可能是规则配置不力(忘记取消注释或者规则语句错误),或者是扫描行为不匹配当前本地已启用规则所致?
总结
通过几个小的 snort 配置实验,我对基于 snort 的入侵检测有了初步的了解,学习书写了几个简单的 snort 规则并测试其应用过后报警的效果。这个输出格式一般为:
1 | [**] [1:sid:rev] "msg" [**] |
补充
重新使用其他扫描工具完成端口扫描实验,发现可以成功检测。说明上述检测不成功的原因应该是扫描动作与预期规则不匹配。我使用了 Nessus 3 版本完成了这一部分的实验。
-
同时开启被扫描端的 snort,发现除了有尝试执行 shellcode 以外 (这个原来用 nmap 扫的时候也扫到了) 还发出了 SCAN 的警告,分类信息显示为 Attempted information leak(尝试泄露信息),基本可以确认 nessus 发出的扫描被我们检测出来了。
-
此扫描还尝试利用 NETBIOS 登录来取得用户权限,以获取后续漏洞信息。