让上传告警更精准

网络安全Beginner
立即练习

介绍

文档团队的路由检测器标记发往 collector.example.test/collect 的所有 POST。其中一些是允许的公开演示。你的任务是在保留这些合法通信的同时,将告警聚焦于内部文档上传。

这个独立环境包含上一实验的路由检测器 broad.rules,以及合成的完整 TCP/HTTP 抓包。在 Analyst 标签页中输入命令,选择 Traffic Reference 标签页即可直接打开记录的请求视图。同样的示例位于 traffic/requests.txt。不需要上一台 VM 的文件。正文检查适用于这里的明文 HTTP 抓包,不适用于加密 HTTPS 流量。

找到敏感文档上下文

本步骤说明为什么请求正文线索有用,却不能单独作为充分条件。classification=internal 是合成的业务字段,用于描述文档的处理类别,不是完成标记。

在实验界面选择 Analyst 标签页,开始本步骤。

切换到 Traffic Reference 标签页比较请求正文,再切回 Analyst 标签页。阅读参考并重放提供的检测器。命令选项与之前相同:-S 仅加载指定规则,-r 选择输入 PCAP,-l 选择输出目录。

Traffic Reference 区分内部文档和公开演示

运行以下命令前,请切换到 Analyst 标签页。

cat traffic/requests.txt
mkdir -p broad-output
suricata --runmode single -c suricata.yaml -S broad.rules -r traffic/core.pcap -l broad-output --init-errors-fatal
python3 /opt/c09/read-alerts.py broad-output/eve.json

预期出现四条告警,其中包括两份公开文档。classification=public 表示文档内容适合通过该路由进行公开演示。策略关注方法、目的地、路由与内部分类的组合。

尝试仅检查正文的检测器,学习新的缓冲区。http.request_body 使后续 content 检查重建的正文,即使其字节跨越 TCP 数据包。引擎执行这种重组;逐包文本搜索并不等价。由于分类字段位于较长正文中,我们不添加整个缓冲区的边界限制。

仍使用按原样输入的多行文本:> 替换文件,结尾的 RULE 必须独占一行。

cat > body.rules <<'RULE'
alert http any any -> any any (msg:"Review document upload"; flow:established,to_server; http.request_body; content:"classification=internal"; sid:1000001; rev:1;)
RULE
mkdir -p body-output
suricata --runmode single -c suricata.yaml -S body.rules -r traffic/core.pcap -l body-output --init-errors-fatal
python3 /opt/c09/read-alerts.py body-output/eve.json

预期为 Alerts: 9。发往批准目的地的内部文档也告警,PUT 请求和收集端的其他路由同样如此。这说明仅在任意位置匹配敏感词过于宽泛。将此结果作为实验,而不是最终策略检测器。

python3 /opt/c09/check.py body.rules body

两个数据集都应匹配九次包含该正文的通信。语法错误可以恢复:重写代码块,再使用新输出目录重试,以免追加的事件混淆数量。

组合条件并测试平衡

本步骤将已学的四个 HTTP 字段组合为实用检测器。保留 POST、精确的收集端主机与上传路由,再加入内部分类条件。

在实验界面选择 Analyst 标签页,开始本步骤。

创建最终交付文件 local.rules。不同粘性缓冲区中的条件按 AND 组合:同一事务必须满足全部条件。sid:1000001 仍是唯一的本地标识;一条生效规则就足够。

运行以下命令前,请切换到 Analyst 标签页。

cat > local.rules <<'RULE'
alert http any any -> any any (msg:"Review document upload"; flow:established,to_server; http.method; content:"POST"; startswith; endswith; http.host; content:"collector.example.test"; startswith; endswith; http.uri; content:"/collect"; startswith; endswith; http.request_body; content:"classification=internal"; sid:1000001; rev:1;)
RULE

重放前使用 -T 测试语法。目录和 -l 也为语法测试提供可写输出位置。这会加载配置和规则,不读取数据包。语法测试成功不代表检测质量合格。

mkdir -p syntax-output
suricata -T -c suricata.yaml -S local.rules -l syntax-output --init-errors-fatal
mkdir -p final-output
suricata --runmode single -c suricata.yaml -S local.rules -r traffic/core.pcap -l final-output --init-errors-fatal
python3 /opt/c09/read-alerts.py final-output/eve.json

预期为 Alerts: 2,对应端口 41002 和 41007。每次都是内部文档通过 POST 发往未批准的收集端路由。公开演示、批准的文档上传、健康检查、其他方法和其他路由不告警。告警仍显示 action: allowed:离线告警只观察流量,不会阻止上传。

现在运行包含正反案例的回归检查器。回归测试在修改后重新测试已知应匹配和不应匹配的行为。除显示的数据集外,它还用不同文档名称和源端口进行干净重放。它检查规则本身,而不是旧事件数量。

python3 /opt/c09/check.py local.rules final

两行都应报告两次预期通信,比较通信保持安静。再次运行,结果应相同,抓包也不变。漏报可能说明条件过于具体或缓冲区错误;意外告警可能说明条件缺失或过宽。重写 local.rules 后重试。不要禁用引擎,也不要删除合法的比较流量。

这演示的是范围有限的策略检测器,不是通用数据泄露检测。更大的正文、加密内容、编码和其他协议需要单独设计与测试。接下来的挑战会更换策略事实,但仍使用这四个缓冲区。

总结

你比较了仅按路由检测与仅按正文检测的实验,再组合全部四个 HTTP 字段。你在干净输出目录中用正反案例数据集测试提交的规则,并明确了可见性限制。