使用真实响应确认诊断信息暴露

网络安全Beginner
立即练习

介绍

Fieldwork Studio 举办公共手工工作坊。活动日程应方便浏览和下载,而维护诊断信息应要求授权访问。你的任务是确认哪些响应确实暴露了这个应用的内部诊断数据。

先使用正常网站,再比较三个真实响应,并运行一个刻意设计得较为宽泛的 Nuclei 入门检查。最后,你将把结论关联到自己检查过的响应,而不是把扫描器的每项发现都当作已确认的问题。所有配置和身份均为合成内容;HTTP 请求和扫描器执行是真实的。

你只需要掌握基本终端输入并理解路径。本实验会在 HTTP、JSON 和扫描器输出出现时解释它们。Kali 审计端与目标是隔离的容器,共享一个 VM 内核。只测试提供的范围,保持请求只读,并保留工作坊网站及日程。包含阅读和普通操作错误在内,预计需要约 50 分钟;这是作者估计。

使用公共工作坊日程

本步骤将明确正常公共访问中必须保留的功能。打开 Workshops。页面介绍了 Fieldwork Studio 的手工课程。点击 Get the workshop schedule,下载 fieldwork-schedule.csv。文件包含 Printmaking 和 Bookbinding 的工作坊名称、时间和房间。这些信息本来就应该公开访问。

公共工作坊及日程下载

两张活动卡片和绿色日程链接构成正常公共服务。在评估诊断信息时,请保留其中真实的工作坊信息。

切换到 Kali 终端 Auditor。其起始目录为 /home/labex/project。浏览器入口和这个终端访问的是同一个工作坊服务,并不代表不同的目标机器。

cat 用于显示文本文件。发送安全检查请求前,先阅读授权范围:

cat scope.txt

授权操作仅限于向 targets.txt 中的基础 URL 发送只读 HTTP GET 请求。基础 URL 标识一个站点;诊断路由会追加到它后面。显示列表:

cat targets.txt

你应看到 http://workshop.test:8080/ 下的 studio、archive 和 manual。端口 8080 标识本课程服务。保留全部站点、配置和工作坊数据。你的任务是评估访问情况,而不是修改应用。

如果使用相对文件路径时出错,用 pwd 显示当前目录,然后执行以下命令返回:

cd /home/labex/project

关闭或重新连接 Auditor 不会重建站点。你的文件会保留在此工作区中。

先阅读响应,再作判断

本步骤将比较各个获准站点的诊断端点。留在 Auditor。HTTP 是这个网站使用的请求与响应协议。curl 发送请求并打印响应正文。其 -i 选项还会打印响应头,包括状态和内容类型。

curl -i http://workshop.test:8080/studio/maintenance/diagnostics

响应以 HTTP/1.0 200 OK 开头。这表示服务器成功返回了所请求的资源;仅凭这一点不能认定存在安全问题。Content-Type: application/json; charset=utf-8 表示正文是以 UTF-8 文本编码的 JSON。JSON 用花括号内的命名值表示数据。名称和文本值用双引号包围;数值不加引号。

这个扁平对象包含 service、visibility、database_file 和 request_count。对于这个应用,service 为 workshop-portal,visibility 为 internal,数据库文件为绝对路径,请求计数为非负整数。文件路径来自运行中站点的配置:公共工作坊页面和 CSV 下载都读取这个真实的 SQLite 数据库。SQLite 将小型数据库存储在一个文件中。请求到来时,计数会变化。这一组合是 scope.txt 中公布的诊断契约,并非漏洞的通用定义。

未经身份验证的请求已经收到了这些内部值。注意它的 X-Audit-Event 响应头:服务器为每个真实响应分配不同的标识符。将该标识符记录在私密位置,以便用于最终评估。你可以引用这项证据,而不必把内部值复制到摘要中。

比较第二个站点:

curl -i http://workshop.test:8080/archive/maintenance/diagnostics

预期会看到 401 Unauthorized,以及需要维护凭据的说明。这是有意设置的拒绝。授权范围没有提供凭据,你不应尝试绕过它。curl -i 可以正常完成并显示 HTTP 401:成功送达拒绝响应与成功获得授权是两回事。

现在检查第三个站点:

curl -i http://workshop.test:8080/manual/maintenance/diagnostics

它返回 HTTP 200 和 JSON,但诊断字段嵌套在 example 对象内。这些字段用于说明响应格式,并不是这个站点顶层的实时诊断对象。请比较结构和含义,而不是只搜索单词 internal。也保留此响应的事件标识符。

如果看到 404,请仔细将 URL 与提供的路由进行比较,并重新发送修正后的请求。Could not resolve host 或 Failed to connect 表示请求没有获得预期响应;它不能支持安全或暴露的结论。检查拼写以及课程的准确主机名和端口。不要将目标替换为公共网站。

调查宽泛的 Nuclei 发现

本步骤将展示一种情况:检查本身可以正确运行,却作出过于宽泛的判断。留在 Auditor。Nuclei 是模板驱动的扫描器:模板描述请求,以及产生发现的响应条件。一项发现表示这些条件匹配;你仍需判断它们是否足以证明你原本要检查的问题。

阅读准备好的入门模板:

cat too-broad.yaml

YAML 使用缩进对设置分组。这个入门模板向每个基础 URL 的诊断路由发送一次 GET,然后只匹配 HTTP 状态 200。{{BaseURL}} 占位符会替换为当前获准的基础 URL。它不会检查诊断对象的含义。

对提供的列表运行入门模板。-t 选择本地模板;-l 读取目标列表;-o 保存发现;-elog 保存请求错误。-jsonl 每行写入一个 JSON 发现,-ot 从输出中省略编码后的模板。准备选项 -duc 和 -ni 禁用更新检查和外部 Interactsh 回调。我们的模板不需要这些功能。在隔离练习中保留这两个选项。

nuclei -t too-broad.yaml -l targets.txt -duc -ni -nc -jsonl -ot -o broad-findings.jsonl -elog broad-errors.jsonl

-nc 去掉终端颜色代码。此命令执行真实的只读请求。预期 studio 和 manual 都会产生发现,因为二者都返回了 200。受保护的 archive 路由不匹配。没有打印发现,并不一定意味着扫描请求已成功完成且未检出符合本课程暴露条件的响应。

判断结果前,阅读原生请求错误日志:

cat broad-errors.jsonl

空日志表示本次运行未记录请求错误。连接失败仍可能让 Nuclei 进程的退出状态为零,因此不能仅凭退出状态或空发现文件判断。如果日志包含错误,请先修正目标或连接问题,再得出结论。保留原始错误证据;重试时使用新的输出文件名。

检查发现:

cat broad-findings.jsonl

每行都包含 matched-at URL 以及请求和响应证据。将 manual 的发现与前面读过的嵌套文档示例比较。对于你要判断的诊断暴露问题,这是一项误报,尽管入门模板的状态匹配器确实按其定义工作。studio 的响应则满足已定义的暴露条件。

这些合成响应不含真实秘密。在真实评估中,原始发现可能包含敏感内容,应私密处理。不要将它们上传到外部扫描器,也不要粘贴到公开报告中。

保存关联证据的评估

本步骤将区分你的结论与扫描器的宽泛匹配。留在 Auditor。创建 assessment.json,每个站点对应一条记录。每条记录保存你检查过的真实响应事件和结论。使用 exposed、access-denied 和 documentation-example 表示前面介绍的三种结果。

下面是一个完整的 shell here-document。cat > assessment.json 写入文件;> 会替换文件内容。<<'JSON' 让 shell 按原样复制后续文本,直到仅包含 JSON 的那一行。带引号的分隔符会阻止 shell 对文本进行展开。运行此代码块前,请将各个 REPLACE_... 值替换为相应站点诊断响应中的真实 X-Audit-Event。保留 JSON 的双引号和逗号。

cat > assessment.json <<'JSON'
{
  "studio": {"event_id": "REPLACE_STUDIO_EVENT", "conclusion": "exposed"},
  "archive": {"event_id": "REPLACE_ARCHIVE_EVENT", "conclusion": "access-denied"},
  "manual": {"event_id": "REPLACE_MANUAL_EVENT", "conclusion": "documentation-example"}
}
JSON

如果没有保存某个标识符,请重复步骤 2 中对该站点的 curl -i 请求,并使用新的标识符。重复读取会创建另一个真实响应,并可能增加 request_count;它不会修复或改变站点的访问策略。

显示保存的文件:

cat assessment.json

如果引号、逗号或事件值错误,请重新执行完整且修正后的 here-document。不要照抄占位符字面值。在此工作区中将 assessment.json 作为可读的普通文件交付。验证会把你的结论与现有响应进行比较;它不会生成缺失的评估请求。也不要求你把诊断主机或原始正文复制到这份简短摘要中。

你的结果确认了 studio 的暴露,观察到 archive 的真实拒绝,并解释了 manual 中具有误导性的文档匹配。它并不声称已经测试所有其他路由或漏洞。下一个引导实验会启动新场景,教你用可移植的原生 Nuclei 检查替换宽泛匹配器。

总结

你使用了公共工作坊日程,检查了 HTTP 状态和 JSON 结构,并确认了一处内部诊断信息暴露。你运行了真实的 Nuclei 入门检查,并解释了其针对文档的误报。你的评估将每项结论关联到现有响应,同时保留了正常公共访问。