分析 Snort 警报

网络安全Beginner
立即练习

简介

Snort 是一个功能强大的开源入侵检测系统(IDS),它能够实时监控网络流量并将其与预定义的规则集进行比对。当可疑活动匹配到某条规则时,Snort 就会生成一条警报。对于任何网络安全专业人员来说,理解如何阅读和解读这些警报是一项基本技能。

生成警报仅仅是防御工作流程的开始。分析师仍需判断该事件是否有意义、网络上发生了什么,以及是否需要采取后续行动。这就是为什么警报解读与规则创建同样重要的原因。如果人类无法准确读取和分类其输出,那么再强大的检测堆栈也是无用的。

在本实验中,你将学习如何与 Snort 警报进行交互。你将使用自定义配置启动 Snort,生成网络流量以触发特定的检测规则,然后分析生成的日志文件。Snort 可以以多种格式输出日志;我们将重点关注 fast 日志(提供事件的快速、单行摘要)和 full 日志(包含详细的数据包头信息)。

触发多条规则

在此步骤中,你将启动 Snort 入侵检测系统并生成网络流量,以触发已为你预先配置好的自定义规则。

创建已知的良性测试流量是检测工程中的一种标准习惯。如果你确切知道哪些数据包应该触发哪些规则,那么你就拥有了一个清晰的基准,用于验证监控管道是否端到端正常工作。

实验环境已配置了两条简单的 Snort 规则:一条用于检测 ICMP(Ping)流量,另一条用于检测 80 端口上的 HTTP(Web)流量。我们还在 /etc/snort/custom.conf 中创建了一个自定义配置文件,告知 Snort 以两种不同的格式保存警报:fast 日志和 full 日志。

首先,使用自定义配置文件以守护进程(后台)模式启动 Snort。-D 标志告诉 Snort 在后台运行,-c 指定配置文件,-l 指定日志目录,-i eth0 告诉 Snort 监听默认的网络接口。

sudo snort -c /etc/snort/custom.conf -l /var/log/snort -i eth0 -D

你应该会看到一条消息,表明 Snort 已成功初始化并作为守护进程运行。

接下来,生成一些网络流量来触发规则。我们将向公共 DNS 服务器(8.8.8.8)发送三个 ICMP ping 数据包,以触发 ICMP 规则。

ping -c 3 8.8.8.8

现在,使用 curl 命令获取网页来生成一些 HTTP 流量。这将触发 HTTP 规则。我们使用 > /dev/null 来隐藏 HTML 输出,以免干扰终端显示。

curl -s http://example.com > /dev/null

最后,等待片刻,让 Snort 处理数据包并将其写入日志文件。你可以通过列出 Snort 日志目录的内容来验证日志文件是否已创建。

sleep 2
ls -l /var/log/snort

你应该会在输出中看到 fast_alert.log 和 full_alert.log,这表明 Snort 已成功检测到流量并生成了警报。

total 8
-rw-r--r-- 1 root root  345 Sep 15 10:00 fast_alert.log
-rw-r--r-- 1 root root 1250 Sep 15 10:00 full_alert.log

分析快速日志

在此步骤中,你将检查 fast_alert.log 文件。「快速」警报格式旨在实现易读和简洁。它在单行内记录了关于警报的最关键信息,非常适合快速审查或使用自动化脚本进行解析。

这是许多分析师首先接触的格式,因为分类工作通常从广泛的范围开始。在决定是否需要深入查看数据包细节之前,你需要先了解触发了什么、何时触发以及涉及哪些端点。

使用 cat 命令显示快速日志文件的内容。

cat /var/log/snort/fast_alert.log

你的输出将类似于以下内容:

09/15-10:00:01.123456  [**] [1:1000001:1] ICMP Ping Detected [**] {ICMP} 192.168.1.10 -> 8.8.8.8
09/15-10:00:01.123456  [**] [1:1000001:1] ICMP Ping Detected [**] {ICMP} 8.8.8.8 -> 192.168.1.10
09/15-10:00:05.654321  [**] [1:1000002:1] HTTP Traffic Detected [**] {TCP} 192.168.1.10:45678 -> 93.184.216.34:80

让我们拆解一下快速警报行的组成部分:

  • 时间戳:09/15-10:00:01.123456 显示了捕获数据包的确切日期和时间。
  • 生成器、SID 和修订版本:[1:1000001:1] 代表生成器 ID(1 表示它是标准 Snort 规则)、唯一标识该规则的 Snort ID(SID,即 1000001)以及规则的修订版本号(1)。
  • 消息:ICMP Ping Detected 是规则中定义的易读消息。
  • 协议:{ICMP} 或 {TCP} 指示所使用的网络协议。
  • 源和目标:192.168.1.10:45678 -> 93.184.216.34:80 显示了源 IP 和端口、指示流量方向的箭头,以及目标 IP 和端口。

通过阅读此日志,安全分析师可以快速确定谁在发起攻击(源 IP)、目标是什么(目标 IP 和端口),以及怀疑是什么类型的攻击(消息)。

检查完整数据包转储

虽然快速日志非常适合快速概览,但它缺乏深入调查所需的详细技术细节。在此步骤中,你将检查 full_alert.log 文件。

完整日志支持另一个层面的问题:不仅是「触发了什么警报?」,而是「触发警报的数据包到底是什么样的?」。这种更深层次的上下文有助于分析师验证警报、理解协议行为,并调查潜在的误报或规避行为。

「完整」警报格式包含完整的数据包头信息。这使得分析师能够检查诸如生存时间(TTL)、服务类型(TOS)、数据包长度和 TCP 标志等细节,这些对于理解攻击性质或识别误报至关重要。

由于完整日志每个警报包含多行,因此可能会很长。使用 head 命令查看文件的前 30 行,这将向你展示前几个警报的详细信息。

head -n 30 /var/log/snort/full_alert.log

你的输出将类似于这样:

[**] [1:1000001:1] ICMP Ping Detected [**]
09/15-10:00:01.123456 192.168.1.10 -> 8.8.8.8
ICMP TTL:64 TOS:0x0 ID:12345 IpLen:20 DgmLen:84 DF
Type:8  Code:0  ID:15  Seq:1  ECHO
...
[**] [1:1000002:1] HTTP Traffic Detected [**]
09/15-10:00:05.654321 192.168.1.10:45678 -> 93.184.216.34:80
TCP TTL:64 TOS:0x0 ID:54321 IpLen:20 DgmLen:60 DF
******S* Seq: 0x1A2B3C4D  Ack: 0x0  Win: 0xFAF0  TcpLen: 40

注意完整日志中提供的额外细节:

  • IP 头信息:TTL:64(生存时间)、TOS:0x0(服务类型)、ID:12345(IP 标识)和 DgmLen:84(数据报长度)。
  • ICMP 特性:Type:8 Code:0 表示 ICMP 回显请求(标准 ping)。
  • TCP 特性:******S* 代表数据包中设置的 TCP 标志(在本例中,设置了 SYN 标志,表示连接的开始)。它还显示了序列号(Seq)、确认号(Ack)和窗口大小(Win)。

通过分析这些完整的数据包转储,你可以更深入地了解触发 IDS 警报的网络流量。

总结

在本实验中,你成功配置并运行了 Snort 入侵检测系统来监控网络流量。你学习了如何通过生成特定类型的网络流量(如 ICMP ping 和 HTTP 请求)来触发自定义检测规则。此外,你还探索了 Snort 的 fast 和 full 警报日志之间的区别,获得了阅读和解读其中关键信息的实践经验,从基本的源和目标 IP 到详细的数据包头标志。这些技能对于有效监控网络安全和应对潜在威胁至关重要。