模块:Login Brute Forcing(13 小节)
核心工具:Hydra、Medusa、CUPP
说明:本文按照实际测试流程重新归纳课程内容,并非原网页逐句翻译。任何凭据尝试只能在获得明确授权、了解锁定策略并限定速率的环境中进行。

0. 学习路线
了解密码空间与防御措施
→ 确认账户锁定、验证码和速率限制
→ 收集用户名及密码策略
→ 选择暴力、字典、混合或喷洒策略
→ 使用 Hydra/Medusa 测试协议或 Web 表单
→ 根据目标信息用 CUPP 制作自定义词表
→ 低速执行、识别成功特征并手工验证
→ 记录影响与防护建议
前置知识
- Linux 命令行。
- HTTP 请求和 Web 表单字段。
- SSH、FTP 等常见网络服务。
- 用户名、密码策略、账户锁定和 MFA 的基本概念。
1. Introduction
暴力破解通过系统化地尝试候选密码、凭据或密钥来寻找正确组合。成功率受密码复杂度、计算能力、网络速度及防御措施共同影响。

1.1 基本过程
- 生成候选组合。
- 把候选值提交给认证系统。
- 根据响应判断是否成功。
- 失败则继续,成功后停止并验证访问范围。
1.2 常见攻击类型
类型 核心思路 适用情境 Simple Brute Force 穷举字符集与长度组合 密码空间较小且没有先验信息 Dictionary Attack 尝试常用密码或目标相关词表 用户可能使用常见词或弱密码 Hybrid Attack 对字典词追加、前置或替换字符 密码是常见词的轻微变体 Credential Stuffing 使用泄露的用户名/密码组合 怀疑存在跨站密码复用 Password Spraying 少量密码对大量账户 需要降低单账户连续失败次数 Rainbow Table 查询预计算哈希表 已取得无盐或适用的密码哈希 Reverse Brute Force 一个已知密码尝试多个账户 怀疑组织内复用同一密码 Distributed Brute Force 多节点分担候选空间 密码空间大且测试已获特别授权
在线登录暴力破解受网络、锁定和告警限制,与离线哈希破解不是同一种测试场景。
2. Password Security Fundamentals
2.1 密码空间
若字符集大小为 C,长度为 L,理论组合数为:
C^L
密码每增加一位,搜索空间会按字符集倍数增长。因此长度通常比简单地增加一种字符更显著。
2.2 弱密码来源
- 常见单词和键盘序列。
- 用户名、姓名、生日、宠物和公司名称。
- 季节、年份、地点与业务术语。
- 默认密码。
- 满足复杂度但模式固定,如 Summer2026!。
- 多个平台重复使用相同凭据。
2.3 防御措施
- 最小长度和密码历史。
- 账户锁定及失败计数窗口。
- 速率限制、指数退避和 IP 限制。
- CAPTCHA。
- MFA。
- 泄露密码检查。
- 登录告警、异常地理位置和设备检测。
测试前必须掌握锁定阈值、锁定时长和重置窗口;否则可能造成大批业务账户不可用。
3. Brute Force Attacks
简单暴力破解适合短 PIN、有限字符集或已知格式,而不适合直接穷举长而复杂的在线密码。
3.1 使用 crunch 生成候选词
首次检查:
crunch --help
生成 4 位数字 PIN:
crunch 4 4 0123456789 -o pin.txt
生成固定模式:
crunch 8 8 -t 'pass%%%%' -o passwords.txt
常见占位符:
@ 小写字母
, 大写字母
% 数字
^ 特殊字符
3.2 先估算规模
wc -l pin.txt
du -h pin.txt
生成前应计算候选数量和预计请求时间,避免制作巨大文件或对在线服务进行不可控测试。
4. Dictionary Attacks
字典攻击使用现成密码表,通常比完整穷举更适合在线认证测试。
4.1 常见字典
ls /usr/share/wordlists/
ls /opt/useful/seclists/Passwords/
RockYou 常见路径:
/usr/share/wordlists/rockyou.txt
若文件被 gzip 压缩,应先查看环境实际文件:
ls -l /usr/share/wordlists/rockyou*
4.2 字典预处理
sort -u passwords.txt -o passwords-unique.txt
grep -E '^.{8,12}$' passwords.txt > passwords-8-12.txt
若已知策略,可继续过滤字符模式,减少无效网络请求。
4.3 默认凭据
默认账户是字典测试前的高优先级检查项。需要结合产品、版本和部署文档,不能把不相关设备的默认凭据全部无差别尝试。
5. Hybrid Attacks
混合攻击以高相关性的基础词为中心,再模拟用户常见变体。
5.1 常见变形
- 首字母大写。
- 追加年份、月份或季节。
- 末尾添加 !、@、#。
- 字母数字替换,如 a → 4、e → 3、o → 0。
- 公司名 + 部门/年份。
5.2 Hashcat 规则生成候选
即使目标是在线认证,也可以用 Hashcat 的 --stdout 离线生成小型变体词表:
hashcat wordlist.txt -r custom.rule --stdout > mutated.txt
sort -u mutated.txt -o mutated.txt
规则示意:
c
$2 $0 $2 $6
$!
先检查输出:
head mutated.txt
wc -l mutated.txt
混合规则应基于已知密码策略与目标信息,不能无节制扩展候选。
6. Hydra
Hydra 支持多种远程协议及 HTTP 表单,是本章的主要自动化工具。
6.1 首次使用
hydra -h
hydra -U ssh
hydra -U http-post-form
基础语法:
hydra [登录选项] [密码选项] [并发/输出选项] <TARGET> <MODULE>
6.2 用户和密码输入
-l <USER> 单个用户名
-L users.txt 用户名列表
-p <PASSWORD> 单个密码
-P pass.txt 密码列表
-C pairs.txt username:password 组合列表
6.3 常用控制参数
-t <N> 并发任务数
-f 找到一组有效凭据后停止
-F 多目标模式下找到有效凭据后停止
-V 显示每次尝试
-vV 更详细输出
-o result.txt 保存结果
-s <PORT> 指定非默认端口
-S 使用 SSL/TLS
6.4 示例
hydra -l admin -P passwords.txt <TARGET> ssh
hydra -L users.txt -p 'Welcome1!' <TARGET> ftp
hydra -C credentials.txt <TARGET> ssh
6.5 风险控制
- 不要直接使用很高 -t。
- 确认是否有锁定策略和 IDS/WAF。
- 小字典先验证模块语法和成功标志。
- 找到有效凭据后停止并手工登录验证。
7. Basic HTTP Authentication
HTTP Basic Authentication 使用 Authorization: Basic Header 发送 Base64 编码的用户名和密码。Base64 只是编码,必须由 HTTPS 保护传输。
7.1 手工观察
curl -I http://<TARGET>/protected/
curl -u '<USER>:<PASSWORD>' http://<TARGET>/protected/
生成 Basic 值:
printf '%s' 'user:password' | base64
7.2 Hydra
hydra -l <USER> -P passwords.txt <TARGET> http-get /protected/
非默认端口:
hydra -l <USER> -P passwords.txt -s <PORT> <TARGET> http-get /protected/
HTTPS:
hydra -S -l <USER> -P passwords.txt <TARGET> https-get /protected/
成功判断通常基于服务不再返回 401 Unauthorized。仍应使用 curl 或浏览器验证获得的凭据与实际权限。
8. Login Forms
网页登录表单没有统一协议模块,需要准确描述请求路径、参数结构和失败/成功特征。
8.1 先捕获真实请求
可使用浏览器开发者工具或 Burp/ZAP 获取:
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=admin&password=test
记录:
- 请求方法和路径。
- 用户名、密码字段名。
- 固定参数。
- Cookie、CSRF Token。
- 登录失败与成功响应差异。
8.2 Hydra POST 表单语法
hydra -l <USER> -P passwords.txt <TARGET> \
http-post-form '/login:username=^USER^&password=^PASS^:F=Invalid credentials'
成功条件:
hydra -l <USER> -P passwords.txt <TARGET> \
http-post-form '/login:username=^USER^&password=^PASS^:S=Dashboard'
8.3 Header 或 Cookie
模块字符串可以附加 Header,例如 Cookie:
H=Cookie: session=<VALUE>
实际格式应通过 hydra -U http-post-form 查看并按课程环境调整。
8.4 常见失败原因
- 字段名写错。
- 路径或方法不正确。
- 失败字符串在成功页中也存在。
- 应用使用 JSON,而不是表单编码。
- CSRF Token 每次改变。
- 登录后需要重定向,工具未正确判断。
- WAF、验证码或锁定机制介入。
9. Medusa
Medusa 同样支持并行远程登录测试,语法围绕 Host、User、Password 和 Module。
9.1 首次使用
medusa -h
medusa -d
medusa -M ssh -q
- -d:列出可用模块。
- -q:显示指定模块帮助。
9.2 基本语法
-h <HOST> 单个目标
-H hosts.txt 目标列表
-u <USER> 单个用户
-U users.txt 用户列表
-p <PASSWORD> 单个密码
-P pass.txt 密码列表
-M <MODULE> 协议模块
-n <PORT> 自定义端口
-t <N> 并发登录数
-f 找到当前主机有效凭据后停止
-F 找到任意有效凭据后停止全部任务
9.3 示例
medusa -h <TARGET> -u admin -P passwords.txt -M ssh
medusa -h <TARGET> -U users.txt -p 'Welcome1!' -M ftp
Hydra 和 Medusa 的模块、错误处理及成功判断方式不同。如果一款工具结果异常,应先用协议客户端验证,而不是立刻换工具反复加速尝试。
10. Web Services
本节把 Hydra/Medusa 应用于 SSH、FTP 等远程服务以及 Web 服务认证。
10.1 服务识别
nmap -sV -p21,22,80,443 <TARGET>
先确认:
- 服务和端口是否正确。
- 是否使用 TLS。
- 用户名是否有效。
- 是否允许密码认证。
- 是否存在锁定、Fail2ban、速率限制或 MFA。
10.2 SSH
hydra -l <USER> -P passwords.txt <TARGET> ssh
medusa -h <TARGET> -u <USER> -P passwords.txt -M ssh
验证:
ssh <USER>@<TARGET>
若服务器只允许公钥认证,密码字典不会成功。
10.3 FTP
hydra -l <USER> -P passwords.txt <TARGET> ftp
medusa -h <TARGET> -u <USER> -P passwords.txt -M ftp
验证:
ftp <TARGET>
10.4 反向暴力与喷洒
一个密码对多个用户:
hydra -L users.txt -p 'Welcome1!' <TARGET> ssh
喷洒必须依据锁定策略安排批次和等待窗口;工具并不会自动保证“安全喷洒”。
11. Custom Wordlists
目标相关词表往往比通用大字典更有效。课程使用 CUPP 根据个人和组织信息生成候选。
11.1 CUPP 首次使用
cupp -h
cupp -i
交互模式会询问:
- 姓名、昵称。
- 生日。
- 伴侣、孩子、宠物。
- 公司、关键词。
- 是否添加特殊字符、数字和 leet 变形。
输出后检查:
wc -l <WORDLIST>
head <WORDLIST>
sort -u <WORDLIST> -o <WORDLIST>
11.2 组织级词表
可组合公开且授权使用的信息:
公司名、品牌、产品、部门、地点、季节、年份、口号
然后按密码策略筛选长度,并仅生成合理变形。
11.3 数据最小化
自定义词表可能包含个人信息,应保存在受控目录,报告中只保留必要示例,测试结束后按项目要求销毁。
12. Skills Assessment Part 1
第一部分主要考察识别认证类型、构建候选并正确配置工具。
推荐流程
- 使用 Nmap 或浏览器确认服务和端口。
- 手工发送一次错误登录,捕获请求与响应。
- 确认用户名、密码字段及失败字符串。
- 检查是否有 Basic Auth、表单认证或远程协议。
- 从课程线索选择通用或自定义字典。
- 用低并发、小规模列表验证 Hydra/Medusa 语法。
- 找到候选凭据后立刻手工验证。
常用模板
Basic Auth:
hydra -l <USER> -P <PASSLIST> <TARGET> http-get <PATH>
POST 表单:
hydra -l <USER> -P <PASSLIST> <TARGET> \
http-post-form '<PATH>:<USER_FIELD>=^USER^&<PASS_FIELD>=^PASS^:F=<FAIL_TEXT>'
13. Skills Assessment Part 2
第二部分通常需要组合用户名发现、目标相关词表和跨服务验证。
识别服务
→ 收集/验证用户名
→ 推断密码策略与目标信息
→ CUPP 或规则生成精简词表
→ 选择 Hydra/Medusa 模块
→ 控制并发并执行
→ 手工验证凭据
→ 检查同一凭据是否用于授权范围内的其他服务
完成标准
- 有效凭据能通过原生客户端重复登录。
- 能说明凭据来源和工具参数。
- 明确账户权限,而不只写“登录成功”。
- 记录锁定、验证码、MFA 和日志告警情况。
- 给出具体修复建议。
附录 A:Hydra 与 Medusa 对照
需求 Hydra Medusa 单主机 目标参数 -h 主机列表 -M(视模式) -H 单用户 -l -u 用户列表 -L -U 单密码 -p -p 密码列表 -P -P 模块 末尾 ssh、ftp 等 -M ssh、-M ftp 自定义端口 -s -n 并发 -t -t 保存输出 -o 按帮助选择输出参数 模块帮助 -U -M -q
附录 B:策略选择表
已知信息 推荐方式 短 PIN 或固定格式 有限字符集暴力破解 只知道用户名 精简密码字典 知道个人/组织信息 CUPP/目标相关字典 密码可能是常见词变体 混合攻击 少量常见密码、大量账户 密码喷洒 泄露的用户名密码组合 Credential stuffing 一个疑似复用密码 Reverse brute force 已取得哈希 转入离线破解,不应继续在线尝试
附录 C:常见失败原因
现象 检查项 所有 Web 尝试都判定成功 失败字符串/成功字符串配置错误 所有尝试都失败 字段、路径、方法、Content-Type 或 Cookie 不对 第几次后全部失败 账户锁定、WAF、速率限制或验证码 SSH 工具失败但手工可连 并发过高、旧算法、端口或模块参数错误 凭据有效但无法登录 SSH 账户可能不允许远程登录,或只允许密钥认证 Basic Auth 失败 路径、HTTP/HTTPS 模块或自定义端口错误 表单 Token 每次变化 需要动态处理 CSRF/会话,不适合静态模块字符串 结果速度极慢 网络限制、服务延迟或工具免费/模块限制;不要盲目提速 字典巨大但无结果 候选缺乏目标相关性,先分析策略和目标信息
附录 D:授权测试记录模板
目标与端口:
授权账户范围:
锁定阈值 / 时长 / 重置窗口:
MFA / CAPTCHA / WAF:
认证类型:Basic / Form / SSH / FTP / 其他
用户名来源:
字典来源与候选数量:
工具与完整参数:
并发 / 速率 / 测试时间窗:
成功判断依据:
手工验证结果:
账户权限:
是否观察到告警或锁定:
修复建议:
附录 E:防护要点
- 使用长且唯一的密码并阻止已泄露密码。
- 为重要账户启用 MFA。
- 采用合理锁定、速率限制和指数退避。
- 对失败登录、跨账户喷洒和异常来源告警。
- 禁用默认凭据和不需要的密码认证。
- 对管理入口限制网络来源。
- 错误提示不要泄露用户名是否存在。
- 对 CAPTCHA 作为补充控制,而非唯一防线。
总结
在线登录测试的核心不是“把线程开到最大”,而是准确识别认证请求、选择高相关性候选、理解锁定与限速,并可靠地区分成功和失败。最有效的流程通常是:先收集信息,再缩小候选;先低速验证工具语法,再谨慎扩大;工具发现凭据后,必须用原生客户端手工确认。
