区分真实登录与误导响应

HydraBeginner
立即练习

介绍

Fieldnote 正在筹备 Northline Print Fair。展商登录后可以取得自己的展位资料包,其中包含到场时间、送货地点和装箱清单。第一次 Hydra 测试看似找出了多个有效登录,但其中一些发现其实对应错误页面。你的工作是区分真实认证与误导性响应,再收集指定展商的完整资料包。

你只需要掌握基本终端输入、路径和标签页切换。Hydra 与本地门户均已准备好;课程会在使用表单字段、匹配条件和 Cookie 之前进行解释。Workstation 是终端,Exhibitor Portal 是网站。它们是同一个隔离训练容器的两个入口,不是两台主机。所有账户和业务数据均为合成数据。只能使用给定候选,测试声明的练习表单与指定账户,不得更改服务器、账户或文档。

预计 55 分钟包含阅读和普通错误的处理时间,但未经过初学者计时验证。你要交付的是可复用表单参数、原始 Hydra 结果和经过认证取得的展位资料包,而不是文字报告。

查看真正登录后的页面

在这一步,你将打开一个已知可用的预览账户,并把它与其自己的展位信息对应起来。HTTP 请求成功只表示服务器发送了响应;身份认证成功则表示服务器接受了某个身份。这是两件不同的事。

打开 Exhibitor Portal 标签页。选择 Start at the practice desk,然后选择 Practice sign-in。输入展商 ID preview 和密码 Preview24,再选择 Sign in。结果显示 Signed in as preview。选择 Open your workspace,可以看到展位是 DEMO,装箱说明也标明这是练习文档。这就是正常业务流程;这份预览资料不是最终任务要求的资料包。选择 Sign out,然后选择导航栏中的 Practice desk。

已知预览工作区,其中展位为 DEMO

展商 ID 和展位表明这是一份预览文档;仅仅存在下载按钮,并不能证明它就是指定展商的资料包。

切换到 Workstation。本实验的命令都从 /home/labex/project/login-review 开始执行。入口会自动进入该目录;pwd 会输出当前目录,便于确认位置:

pwd

应看到 /home/labex/project/login-review。如果当前位于其他目录,使用 cd 切换目录:

cd /home/labex/project/login-review

练习登录表单向 /practice/login 发送 POST 请求。POST 会在请求体中携带具名字段。这里的字段名是 username 和 password,& 用于分隔字段。curl 从终端发送请求,与浏览器相互独立。下面命令中,--data 提供字段,-s 隐藏进度条,-o 保存响应正文,-w 输出 HTTP 状态码。单引号把空格、& 和 %{http_code} 保留为传给 curl 的内容,避免被 Shell 解释。

故意发送一次错误密码:

curl -s -o wrong.html -w 'HTTP %{http_code}
' --data 'username=preview&password=Wrong24' http://127.0.0.1:8080/practice/login

输出是 HTTP 200,表示应用返回了一个页面,并不表示密码有效。wrong.html 保存着该页面。grep 用于搜索文本,-o 选项只输出匹配到的文字,因此不必阅读周围的 HTML 标记:

grep -o 'Incorrect password' wrong.html

应看到 Incorrect password。真正的登录成功和登录被拒绝,可以返回相同的 HTTP 状态码。在本课程中,普通密码拼写错误是可以修正的:改正值后重新提交即可。连接错误则表示请求没有到达服务;在解释登录结果之前,先检查 127.0.0.1、端口 8080 和声明的路径。不要为了修正拼写错误而重置 VM。

重现误导性发现

在这一步,你将针对四组小规模练习凭据,运行一个故意有缺陷的分类规则。这是错误测试的演示,不是可靠的审计。

留在 Workstation。cat 用于显示文件内容。准备好的列表每行包含一组完整的 username:password 配对:

cat practice-pairs.txt
preview:Wrong24
retired:Wrong24
offline:Wrong24
preview:Preview24

retired 是一个合成的不可用账户样本。offline 是一个受控的服务错误样本:练习处理程序会返回 HTTP 503,并且不会创建会话。它并不代表上游服务故障或真实展商。最后一组是已知有效的预览登录。请保持这个小规模许可集合,不要把它扩展为任意用户名与密码的组合。

Hydra 的 http-post-form 模块会把每组配对发送到表单。它的参数由冒号分隔的三个部分组成:POST 路径、字段和响应条件。^USER^ 与 ^PASS^ 是 Hydra 占位符。F= 表示“把包含该模式的响应视为失败”。其他响应可能被归类为成功。下面的命令故意只识别 Incorrect password,遗漏了其他失败类型。

选项含义如下:-I 忽略此工作区内旧的恢复提示,-C 指定成对候选,-s 指定端口,-t 1 使用一个工作线程,-o 指定结果文件名,-b json 选择 JSON 输出。最后一个参数整体放在引号中,因此即使包含空格与 &,也仍然是一个参数。

hydra -I -C practice-pairs.txt -s 8080 -t 1 -o misleading.json -b json 127.0.0.1 http-post-form '/practice/login:username=^USER^&password=^PASS^:F=Incorrect password'

如果想在不编写程序的情况下阅读 JSON,可以使用 Python 内置的 json.tool 格式化工具。python3 -m 会运行已安装的模块:

python3 -m json.tool misleading.json

阅读 results 列表。已知有效的预览配对会出现,但不可用账户或服务错误对应的配对也可能出现。一条发现只是该条件做出的判断,并不证明它能打开经过认证的工作区。顶层的 success: true 描述 Hydra 的执行状态,不表示每个报告出的密码都有效。不要把这份误导性文件当作最终审计结果。

如果 Hydra 报告语法或连接错误,请把完整的引号参数和端口与上面的命令对照,修正拼写后重新运行这个限定范围的练习测试。连接失败既不代表密码有效,也不能得出有效的“未发现可用凭据”结论。

用已知响应校准测试

在这一步,你将保存一个可复用条件,使它接受真实成功,并拒绝全部三类已知的非成功情况。留在 Workstation,先用相同请求格式查看其他响应。

不可用账户的请求会故意返回 HTTP 200:

curl -s -o retired.html -w 'HTTP %{http_code}
' --data 'username=retired&password=Wrong24' http://127.0.0.1:8080/practice/login
grep -o 'Sign-in unavailable' retired.html

受控的服务错误请求会故意返回 HTTP 503。虽然它的页面没有 Incorrect password,但也不存在有效会话:

curl -s -o offline.html -w 'HTTP %{http_code}
' --data 'username=offline&password=Wrong24' http://127.0.0.1:8080/practice/login
grep -o 'Service unavailable' offline.html

现在取得已知的正例响应。这次 curl 请求拥有自己的会话,与浏览器分开:

curl -s -o preview.html --data 'username=preview&password=Preview24' http://127.0.0.1:8080/practice/login
grep -o 'Signed in as preview' preview.html

这里的 Signed in as 标识经过认证的结果。失败页面也有 Welcome,因此不能用它区分认证是否成功。Hydra 的 S= 选择正向匹配模式:响应必须包含该模式,才会被算作成功。使用 -U 查看已安装模块的帮助,其中解释了路径、字段和条件语法:

hydra -U http-post-form

保存完整的练习参数。cat > calibration.txt 会把文本写入文件;如果文件已存在,> 会替换其内容。Here-document 会提供多行输入,直到遇到结束行 EOF。给 'EOF' 加上引号,意味着正文按字面保留。结束标记必须单独占一行,前面不能有空格:

cat > calibration.txt <<'EOF'
/practice/login:username=^USER^&password=^PASS^:S=Signed in as
EOF

Shell 变量可以保存文本,供当前终端重复使用。$(cat calibration.txt) 读取文件,form= 把结果存入变量,= 两侧不能有空格。稍后使用 "$form" 时加上引号,能让含有空格的内容保持为一个参数。该变量属于当前终端会话;重新连接后,要再次执行赋值命令。

form=$(cat calibration.txt)
hydra -I -C practice-pairs.txt -s 8080 -t 1 -o calibration.json -b json 127.0.0.1 http-post-form "$form"
python3 -m json.tool calibration.json

此时只应报告 preview:Preview24。错误密码、不可用账户和 HTTP 503 都不是认证成功。校准也必须包含已知正例:把所有响应都拒绝的条件同样是错误的。覆盖足够全面的失败模式,可以与这里的正向模式等效;你不必使用某种特定写法的 S=。保存的参数会针对每种已知响应分别测试,而不是仅仅因为包含某个关键词就被接受。

收集指定展商的资料包

在这一步,你将把校准后的方法应用到指定展商,再独立进行认证,并收集其真实业务文档。

打开 Exhibitor Portal,选择 Exhibitor sign-in,再选择 View your review assignment。指定账户是 papertrail,其 POST 路径是 /signin。只允许使用 candidates.txt 中的三个密码。练习账户属于另一个表单。切换到 Workstation,阅读候选列表:

cat candidates.txt

保存第二个可复用参数,使用指定路径,并保留相同的字段和条件:

cat > form.txt <<'EOF'
/signin:username=^USER^&password=^PASS^:S=Signed in as
EOF
form=$(cat form.txt)

与 -C 不同,-l papertrail 提供一个固定用户名,-P candidates.txt 提供该账户允许测试的密码。运行这个小规模指定审计,并保存新的原始 JSON 结果:

hydra -I -l papertrail -P candidates.txt -s 8080 -t 1 -o findings.json -b json 127.0.0.1 http-post-form "$form"
python3 -m json.tool findings.json

唯一的真实发现是 papertrail,密码为 InkPaper7。这一结论只适用于声明的账户和候选集合,并不意味着整个网站是安全的。

切换到 Exhibitor Portal。选择 Exhibitor sign-in,输入发现的配对,选择 Sign in,再选择 Open your workspace。核对 papertrail、展位 N-14、到场时间 09:15 和送货地点 North loading door。选择 Download booth kit,取得真正的浏览器下载文件。该文件位于浏览器的下载位置,不会自动出现在训练容器中。

指定 papertrail 工作区和真实下载链接

使用下载前,先检查装箱说明上方的展商和展位字段。

切回 Workstation,保存任务要求的 VM 内副本。Cookie 是服务器签发的会话标识。-c exhibitor.cookies 保存这次终端登录收到的 Cookie。这个 Cookie 文件属于 curl;浏览器和 Hydra 不会自动与它共享会话。响应正文保存到 signin.html:

curl -s -c exhibitor.cookies -o signin.html --data 'username=papertrail&password=InkPaper7' http://127.0.0.1:8080/signin

使用同一个 Cookie 文件读取经过认证的下载。-b 发送其中的 Cookie。-f 会让 HTTP 拒绝返回非零状态,避免悄悄把错误页面保存成资料包:

curl -f -s -b exhibitor.cookies http://127.0.0.1:8080/kit.json -o booth-kit.json

如果出现 403 或 curl 退出状态 22,表示这个客户端没有被接受的会话。检查用户名、密码、表单路径和 Cookie 文件名,重新执行登录命令,再重试下载。404 表示路径错误。这些错误都可以恢复;不要用复制的预览文件替代资料包。

python3 -m json.tool booth-kit.json

把展商、展位和到场时间与页面对照。完整资料包还应包含三个展示架、两块桌布,以及关于编号印刷品保护套的说明。仅有文件,或只有展商名称匹配,都不能证明整份文档正确。

最后,在 Exhibitor Portal 打开 Visitor guide。公开到场信息必须仍然可用。你只更改了自己的文件和会话,保留了服务、账户及业务数据。最终交付文件是工作区中的 form.txt、findings.json 和 booth-kit.json。检查会读取已有的登录与下载事实,并在另一个一次性服务中测试保存的参数,不会替你补齐真实门户上缺失的操作。

总结

你把真实认证工作区与密码错误、不可用账户及服务错误响应进行了比较,重现了 Hydra 误报,并用正反样本校准了可复用的表单条件。随后,你使用独立 Cookie 会话确认了指定身份,并收集其完整资料包。HTTP 200、执行成功标志或通用 Welcome 消息,都不能单独证明身份认证成功。