入侵检测

目的

了解入侵检测的基本原理,尝试在 Windows XP 下配置 Snort IDS 并完成基于 Snort 的攻击检测。尝试利用 Snort 规则语法自己编写简单的 Snort 规则。

本篇文章为实验记录,仅供交流学习使用,切勿违法应用,所有文中提到的工具不提供下载。

原理

入侵检测定义

入侵检测是防火墙的合理补充,帮助系统对付网络攻击,扩展了系统管理员的安全管理能力 (包括安全审计、监视、进攻识别和响应),提高了信息安全基础结构的完整性。它从计算机网络系统中的若干关键点收集信息,并分析这些信息,看看网络中是否有违反安全策略的行为和遭到袭击的迹象。入侵检测被认为是防火墙之后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测,从而提供对内部攻击、外部攻击和误操作的实时保护。

Snort 软件

Snort 是由 Sourcefire 开发的一个开源的网络入侵检测系统。用 C 语言编写的开放源代码软件。它是一个跨平台、轻量级的网络入侵检测软件。它结合了协议、特征和基于异常的检测,是目前使用最多的 IDS/IPS 系统。

一条 snort 规则包括包含规则头和规则选项两部分;snort 规则如下:

  1. Snort 规则应写在一行,若需多行,应用 \ 来拆分。
  2. 规则头包含规则的动作,协议,源和目标的 IP 地址和端口信息
  3. 规则选项部分包含细节、具体的描述和约定。

实验过程

配置 Snort 环境

首先装好 Snort 软件。用 snort -W 命令测试安装正确性

  • 运行 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 规则

  1. 在本地添加一条 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” 字符即匹配

  2. 由上图得知,我的电脑的 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 必须包含在英文引号中。

  3. 在另一台虚拟机上运行 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 配置项,对于本实验的需求不大。

  1. 在一台攻击机上启动 nmap 进行扫描。同时在目标机上启动 snort。

  2. 结果只检测出了上述三个有效信息,没有像预期那样检测到扫描工具扫描的痕迹。

    预期可能会检测出类似于 SCAN UPnP service discover attempt 这样的信息,可能是规则配置不力(忘记取消注释或者规则语句错误),或者是扫描行为不匹配当前本地已启用规则所致?

总结

通过几个小的 snort 配置实验,我对基于 snort 的入侵检测有了初步的了解,学习书写了几个简单的 snort 规则并测试其应用过后报警的效果。这个输出格式一般为:

1
2
3
4
5
[**] [1:sid:rev] "msg" [**]
[Classfication] [Priority:<priority>]
[time] [from[ip:port]->dest[ip:port]]
[protocol] [ttl] [tos] [id] [iplen] [dgmlen] [flags]
[各协议包额外信息]

补充

重新使用其他扫描工具完成端口扫描实验,发现可以成功检测。说明上述检测不成功的原因应该是扫描动作与预期规则不匹配。我使用了 Nessus 3 版本完成了这一部分的实验。

  1. 同时开启被扫描端的 snort,发现除了有尝试执行 shellcode 以外 (这个原来用 nmap 扫的时候也扫到了) 还发出了 SCAN 的警告,分类信息显示为 Attempted information leak(尝试泄露信息),基本可以确认 nessus 发出的扫描被我们检测出来了。

  2. 此扫描还尝试利用 NETBIOS 登录来取得用户权限,以获取后续漏洞信息。