介绍
Gearroom 为本地创作者提供设备借用服务。会员登录后可以查看自己的领取时间、归还时间和装箱说明。登录限制原本用于暂停重复猜测密码,但当前计数器却由所有人共享。一位会员的失败尝试可能阻止另一位会员开始工作。
你将用 Hydra 产生小规模、可重复的测试,把计数器改为按账户计数,并证明保护和正常访问均有效。成果是真实生效的策略、实际认证和未改变的借用记录,不是文字报告。只能让声明的合成测试会员受到限制;参考会员只能使用已知正确密码。不要更改服务器、账户或原始记录。
你需要掌握基本终端输入、路径识别和标签页切换。实验会解释必要的 Hydra 选项、表单字段、Shell 引号和 JSON 策略结构。准备好的 Workstation 终端与 Equipment Desk 网站是同一个隔离训练容器的两个入口。本单元独立于其他实验初始化。所有人员、密码与记录均为本地合成训练数据。
预留约 55 分钟,包含阅读与普通错误处理。这是作者估计,并非经过初学者计时验证的结果。30 秒内失败三次、随后冷却 12 秒的小规模限制是训练契约,不是生产安全建议。
确认两位会员都能正常登录
在这一步,先打开两个已知会员的记录,再测试限制。身份认证成功表示服务器接受了某个身份;该身份决定你能看到哪份记录。
打开 Equipment Desk,选择顶部导航中的 Review brief。允许测试的会员是 member,密码为 Member24。正常参考会员是 reference,密码为 Reference24。这些都是已知凭据,不需要你去发现密码。

使用两个有标签的输入框和 Sign in 按钮。表单下方的文字指出实际 POST 路径和提交的字段名。
选择 Member sign-in,输入测试会员的凭据并选择 Sign in。应看到 Signed in as member。选择 Open your record。检查借用记录 LN-204、Mina Park、Compact projector kit、领取时间 Thursday 14:00、归还时间 Monday 10:00,以及将 HDMI 线放入侧袋的说明。选择 Sign out。

将 Member 和 Record 字段与设备、领取时间、归还时间和装箱说明一起比较。仅仅登录成功,并不能证明原始记录保持完整。
再次选择 Member sign-in,使用参考会员的凭据,然后选择 Open your record。检查 LN-119、Theo Bell、Portable audio recorder 和防风罩说明。再次选择 Sign out。这是两份不同记录;保留两份记录都属于任务要求。浏览器通常会在登录成功后自动保存 Cookie,即服务器发出的会话标识。退出登录会结束该会话。
切换到 Workstation。其配置的起始目录是 /home/labex/project/login-limits。pwd 输出当前目录:
pwd
应看到 /home/labex/project/login-limits。如果已经进入其他位置,使用 cd 切换目录:
cd /home/labex/project/login-limits
cat 用于显示文件。阅读准备好的策略:
cat policy.json
这是 JSON:一种用双引号标示字段名的结构化文本格式。冒号连接名称和值,逗号分隔字段,花括号围住一个对象。key 当前为 global,因此同一计数器可能包含不同会员账户。failed_attempts、window_seconds 和 cooldown_seconds 分别是约定的三次失败、30 秒窗口和 12 秒冷却时间。entry_groups 列出准备好的登录路径;本单元中保持该映射不变。下一个独立引导实验会研究入口组。
deskctl 是准备好的有限维护命令。它的 status 操作用于读取真实的生效策略,不会登录、清除计数器或更改服务:
deskctl status
生效策略应与文件一致。版本号标识当前使用的策略。之后编辑文件,并不会改变运行中的策略,必须明确应用它。
观察共享计数器的问题
在这一步,只为允许测试的会员提交给定错误密码,然后观察全局计数器如何同时拒绝参考会员。
留在 Workstation。阅读完整的许可候选文件:
cat wrong-passwords.txt
NotThis11
NotThis22
NotThis33
NotThis44
NotThis55
这五个密码对于测试账户都故意设置为错误值。不要加入真实凭据,也不要反复测试其他账户。Hydra 用来产生限定数量的尝试;这不是速度比赛,也不是密码发现任务。
127.0.0.1 是该训练容器的回环地址;端口 8080 指向准备好的本地服务,而不是外部网站。主登录表单向 /signin 发送 POST 请求。POST 在请求体中携带具名字段。这里的字段为 username 和 password,用 & 分隔。Hydra 的 http-post-form 参数由冒号分隔的三部分组成:路径、字段和响应条件。^USER^ 与 ^PASS^ 是 Hydra 占位符。S=Signed in as 要求出现真正认证成功的响应文字;受限或被拒绝的页面不能计为可用登录。
Hydra 选项包括:-I 忽略此工作区中旧的恢复提示,-l member 固定一个用户名,-P 指定提供的密码文件,-s 指定端口,-t 1 使用一个工作线程。单线程使这段小规模序列容易观察,但不会创建服务端限制。最后一个参数使用单引号包围,因此即使包含空格与 &,也仍是一个参数。
下一个命令块还使用终端 HTTP 客户端 curl。它与浏览器相互独立,不会自动复用浏览器会话。--data 提供 POST 字段,-s 隐藏进度显示,-o 保存响应正文,-w 输出 HTTP 状态。带引号的 \n 使状态输出换行。单引号保留 &、空格和 %{http_code},让它们传给 curl,而不是被 Shell 解释。这两次诊断登录使用已知正确密码。
先等待先前尝试自然过期。deskctl wait 观察就绪状态,既不重置计数器,也不添加尝试:
deskctl wait
将以下三个命令作为一个完整块一起运行。 它们会在 12 秒冷却期间捕获两份诊断响应,因此不需要在命令之间停下来阅读:
hydra -I -l member -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o test-login.html -w 'Test member HTTP %{http_code}\n' --data 'username=member&password=Member24' http://127.0.0.1:8080/signin
curl -s -o reference-login.html -w 'Reference member HTTP %{http_code}\n' --data 'username=reference&password=Reference24' http://127.0.0.1:8080/signin
由于所有给定候选都错误,Hydra 应报告 0 valid password found。两条诊断结果都应显示 HTTP 429。429 表示服务正在限制尝试,并不表示密码错误。Curl 即使收到 HTTP 拒绝,也可能正常完成,所以应读取显示的状态和保存的正文,不要把退出状态当作认证结果。在此场景中,第三次被拒绝的尝试开始冷却;后续尝试在检查密码之前就会被限制。
grep 搜索文本。其 -o 选项只输出匹配的词语,不显示周围的 HTML 页面:
grep -o 'Too many attempts' reference-login.html
正确的参考密码也被拒绝了。这就是业务问题:全局计数器暂停了另一位会员的新登录。
阅读已有的服务器事件:
deskctl events
寻找 member 在 /signin 上依次产生的 rejected、threshold 和 limited 结果,以及其后被标为 limited 的 reference 登录。这些是真实服务器决策,不是对 Hydra 输出的解释。冷却结束后仍能阅读事件历史,不需要抓住一闪而过的页面。
如果某个诊断请求执行得太晚,等待 deskctl wait 完成后,重新运行同一个小规模三命令块。如果 Hydra 报告语法或连接错误,先修正带引号的参数、地址 127.0.0.1、端口 8080 或声明的路径,再解释结果。连接失败不是保护测试成功。HTTP 400 表示表单字段错误;404 表示路径错误。无需重置环境即可修正这些普通错误。
应用按账户计数的策略
在这一步,只更改计数器键,让各会员拥有独立限制。保持训练数值和入口映射不变。
留在 Workstation。下面的命令会替换本地 policy.json。cat > policy.json 将文本写入文件;> 覆盖已有文件。here-document 提供直到结束标记 EOF 之前的各行。为 'EOF' 加引号会保持正文为字面内容。结束标记必须独占一行,前面不要有空格:
cat > policy.json <<'EOF'
{
"key": "account",
"entry_groups": {
"/signin": "loans",
"/mobile/signin": "loans"
},
"failed_attempts": 3,
"window_seconds": 30,
"cooldown_seconds": 12
}
EOF
唯一改变的值是 key:account 按提交的会员 ID 分组计数,不再合并所有账户。把阈值降为零、删除账户或拒绝所有人,都无法保留正常服务。
通过准备好的控制命令应用文件:
deskctl apply policy.json --wait
apply 验证文件并明确更改运行中的策略。--wait 会在更改策略前,等待现有冷却或部分失败窗口自然过期。部分失败窗口最多需要 30 秒才能稳定。在等待期间,旧策略继续生效。该命令不会重启服务、丢弃历史或清除活跃计数器。重新应用完全相同的策略不会产生变化,也不能解除账户限制。
首次更改应看到 ok: true、changed: true,以及 key 为 account 的新版本。如果已经应用了同一份有效文件,出现 changed: false 属于正常情况。
deskctl status
阅读运行中的策略,而不仅是文件。JSON 错误通常来自缺失的逗号、引号或花括号;与完整命令块对照,修正后再次应用。无效策略不会改变生效策略。不要为通过检查而重启服务器或编辑其实现。
验证保护与自然恢复
在这一步,测试实际生效的策略,保留参考会员的访问,并确认受限测试会员能够自然恢复。
留在 Workstation。从自然稳定的计数器开始:
deskctl wait
再次运行这个完整命令块。路径、已知诊断密码和错误候选集合都不变;改变的是生效的计数器键:
hydra -I -l member -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o test-login.html -w 'Test member HTTP %{http_code}\n' --data 'username=member&password=Member24' http://127.0.0.1:8080/signin
curl -s -o reference-login.html -w 'Reference member HTTP %{http_code}\n' --data 'username=reference&password=Reference24' http://127.0.0.1:8080/signin
应看到 Hydra 零条发现、Test member HTTP 429 和 Reference member HTTP 200。受保护账户仍受到限制,而无关的参考账户可以认证。仅有 HTTP 200 还不够;检查保存的正文中的身份:
grep -o 'Signed in as reference' reference-login.html
grep -o 'Too many attempts' test-login.html
阅读新版本下记录的决策:
deskctl events
应看到 member 达到阈值并被限制,同时有 reference 认证成功的登录。只有当前策略下的事件才能证明修复。旧的全局策略证据仍保留,但不能证明新策略有效。如果在命令块中途停下,错过冷却期间,应自然等待,再重复同一个限定命令块;不要增加候选集合或清除计数器。
现在让测试会员的冷却时间自然结束:
deskctl wait
切换到 Equipment Desk。选择 Member sign-in,使用 member / Member24,选择 Sign in,再选择 Open your record。记录仍须为 LN-204、Mina Park、Compact projector kit 及其完整原始信息。这次新登录证明自然过期后已经恢复。选择 Sign out,然后通过 Member sign-in 使用 reference / Reference24,再次打开 LN-119。确认录音设备与防风罩说明,再退出登录。
最后选择 Visitor guide。公开领取信息仍然可用。你在终端中的 curl 登录与此浏览器使用独立会话;先前的 curl 响应不会自动让浏览器登录。如果记录返回 403,通过真实表单登录,再选择 Open your record。修正普通密码或路径拼写错误,而不是重启 VM。
你的 policy.json 现在与实际按账户计数的策略一致。服务器已有当前版本下的真实证据:重复失败、正确密码尝试受到限制、同一限制期间参考账户认证成功,以及自然恢复后的测试登录,同时两份原始记录均完整保留。评分只读取这些已有事实与公开页面;不会补交缺失登录、重置限制或代你完成恢复。这种受控的单进程训练证明的是声明的本地行为,不是针对所有认证攻击的完整生产防御。
总结
你使用限定数量的 Hydra 尝试暴露了全局登录计数问题,在不重启或重置服务的情况下应用按账户计数的策略,并验证拒绝与可用性。测试会员即使用正确密码也仍受限制,另一位会员则可以认证;冷却自然结束后,测试会员重新访问了未改变的业务记录。结果由当前策略和真实服务器决策证明,不能仅凭 Hydra 没有发现或状态显示成功来判断。



