检测发往未批准收集端的上传

网络安全Beginner
立即练习

介绍

文档团队通常向 docs.approved.test 上传文件。一份小型流量记录也包含发往其他目的地的上传。你获准为这些合成通信构建离线检测器。

抓包文件(PCAP)保存网络数据包。Suricata 重建其中的 HTTP 请求并测试检测规则。在这里,它读取文件,不会连接这些主机名。所有名称和文档均为虚构。明文 HTTP 使正文可见;本练习不演示读取加密的 HTTPS 流量。

在 Analyst 标签页中输入命令。选择 Traffic Reference 标签页即可直接打开参考页面,查看与 traffic/requests.txt 相同的预置请求。这是记录的示例,不是实时拓扑。你只需掌握终端输入和标签页切换的基本操作,不需要 IDS 经验。

识别上传请求

本步骤将构建第一条规则,查找包含正常上传在内的 POST 请求。告警表示规则匹配,不证明发生入侵,也不会阻断流量。

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

HTTP 是请求与响应协议。方法表示请求的操作:POST 发送内容,GET 请求资源。Host 标头指定目标站点,URI 标识路由,正文携带提交的文档字段。切换到 Traffic Reference 标签页,在浏览器中查看预置的 HTTP 通信。此页面是参考资料,并非实时抓包监控。然后切回 Analyst 标签页,读取同样的通信并执行下面的全部命令。cat 打印文件,路径指明文件位置。

Traffic Reference 显示预置 HTTP 方法、目标、路由和文档正文

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

cat traffic/requests.txt

比较发往 docs.approved.test 的合法 POST、收集端的 GET,以及含有 classification=internal 的 POST。组织允许向批准的文档服务发送内部文档。收集端路由可以接收公开演示文档,但不允许内部文档。目的地与内容必须结合判断;陌生主机名本身不是证据。

Suricata 规则由头部和括号中的选项组成。alert http 为解析后的 HTTP 选择告警。两组 any any 接受任意源/目标地址和端口;-> 表示从源到目标。flow:established,to_server 将检查限制为已连接客户端的请求。分号结束选项。msg 描述匹配,sid 是数字签名标识,rev 是修订号。一条规则使用一个唯一的 sid。

粘性缓冲区选择后续 content 检查的 HTTP 字段。http.method 选择方法。content:"POST" 查找该文本;startswith 和 endswith 将匹配限定为整个字段,而非子串。使用下面的规则。

cat > method.rules 写入文件并替换旧内容。<<'RULE' 开始按原样输入多行文本;结束的 RULE 必须独占一行。这是一种简单的编辑方式。输入有误时,重新执行整个代码块即可。

cat > method.rules <<'RULE'
alert http any any -> any any (msg:"Review document upload"; flow:established,to_server; http.method; content:"POST"; startswith; endswith; sid:1000001; rev:1;)
RULE

重放抓包。mkdir -p 创建输出目录,目录已存在也可使用。--runmode single 使用一个数据包处理线程;-c 选择配置;-S 仅加载指定规则文件;-r 读取 PCAP;-l 选择输出位置。规则无法加载时,--init-errors-fatal 使程序停止。预置配置最多检查每个请求正文的 64 KB,所有提供的正文均在限制内。真实部署的限制需要另行评估。

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

Suricata 到达离线文件末尾后显示停止消息是正常现象。eve.json 的每个事件对应一个 JSON 对象。JSON 使用具名字段;event_type: alert 表示匹配,signature_id 标识规则,HTTP 字段标识请求。提供的 Python 阅读器为每条告警打印源端口、方法、主机、URI 和签名 ID。源端口用于将通信关联到参考列表,不是策略条件。

预期为 Alerts: 10。正常文档 POST 和收集端 POST 都会出现。GET 和 PUT 不告警。这个刻意宽泛的初始检测器用于学习方法匹配。

提供的检查器在临时输出目录中,用两个独立的小型数据集执行未经修改的规则。它忽略保存的日志,不改变规则或抓包。检查第一个方法检测器:

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

两行都应报告匹配了 10 次预期通信。如果 Suricata 报语法错误,检查引号、分号和右括号,重写文件后重试。重复使用同一输出目录会追加事件;比较数量时请使用新目录。检查器始终从干净目录开始。

选择收集端目的地

本步骤组合方法与主机条件,排除正常文档服务的上传。同一规则中的多个缓冲区必须都匹配同一个 HTTP 事务。

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

目标站点名称应放在 http.host 中,而不是在正文里搜索。文档可能提及收集端,却没有发往那里。Suricata 将主机缓冲区规范化为小写。参考中有 collector.example.test.other.test,这是另一个主机。匹配整个字段可以将它区分开。

新建文件,保留第一个检测器以便比较。头部和方法条件保持不变;新的主机缓冲区添加目的地条件。

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

cat > destination.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; sid:1000001; rev:1;)
RULE
mkdir -p destination-output
suricata --runmode single -c suricata.yaml -S destination.rules -r traffic/core.pcap -l destination-output --init-errors-fatal
python3 /opt/c09/read-alerts.py destination-output/eve.json

预期为 Alerts: 6。批准的文档服务和名称相似的主机不再出现。发往 /status 和 /collect-backup 的 POST 仍匹配,因为规则尚未区分路由。这些是有用的已知误报:匹配发生在你打算调查的行为之外。

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

两个数据集都应匹配六次符合方法和主机条件的通信。如果允许的主机仍告警,检查主机内容后是否紧跟 startswith; endswith;。修改保存的 JSON 事件不能修复检测器;应修改规则并重放。

将检测限定为上传路由

本步骤构建可用的路由检测器,同时保留对其内容限制的认识。URI 是请求的路由,例如 /collect,它不同于主机。

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

使用 http.uri 和整个字段匹配,精确选择 /collect。/collect-backup 是不同的路由。保留方法与目的地限制,使健康检查和合法目的地保持安静。

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

cat > upload.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; sid:1000001; rev:1;)
RULE
mkdir -p route-output
suricata --runmode single -c suricata.yaml -S upload.rules -r traffic/core.pcap -l route-output --init-errors-fatal
python3 /opt/c09/read-alerts.py route-output/eve.json

预期为 Alerts: 4,对应端口 41002、41003、41007 和 41011。在参考中比较其正文。两次包含内部文档,两次包含公开演示文档。四次都是发往所选主机和路由的 POST。检测器可以监视路由,但会夸大敏感上传数量。

python3 /opt/c09/check.py upload.rules route

两个数据集都应匹配四次预期的路由通信。检查器还测试不同文档名称和源端口:这些偶然值不应决定是否检测。分享告警时,应说明规则的用途。下一个实验将在新环境中加入文档上下文并测试降噪。

总结

你使用真实的 Suricata 重放构建了方法、目的地和路由检测器,将告警关联到记录的请求,并在声称能够检测敏感上传之前识别了公开文档带来的误报。