Hydra 爆破实战与限速规避
Hydra 是常用的在线爆破工具,把用户名与密码候选批量送进目标服务的真实认证入口。决定成败的通常不是工具本身,而是三件事:失败判定标记是否准确、并发与节奏是否触发限速、字典是否贴合目标。
仅限授权环境
在线爆破会产生大量失败认证日志,可能触发锁定或影响业务。仅用于实验环境或明确授权的测试,并控制速率与并发。
适用场景与判断前提
| 前提 | 判断方式 |
|---|---|
| 认证入口可达 | 先用 Nmap 等确认服务与端口开放 |
| 协议受支持 | hydra 提供 ssh、http-get、http-post-form 等模块 |
| 失败响应可区分 | 固定失败文案、状态码或响应状态差异 |
| 字典合理 | 通用字典截断,或按线索定向生成小字典 |
SSH 爆破
hydra -l user -P rockyou.txt -t 8 -f <target> ssh
| 参数 | 作用 |
|---|---|
-l / -L | 单个用户名 / 用户名字典 |
-P | 密码字典 |
-t 8 | 并发任务数限制为 8,避免打爆 sshd |
-f | 命中一组有效凭据后立即停止 |
HTTP 表单与 Basic Auth
表单模块按 路径:POST体:失败条件 用冒号分隔,^USER^、^PASS^ 是占位符:
hydra -l admin -P passlist.txt <target> \
http-post-form "/login:username=^USER^&password=^PASS^:F=失败标记"
失败标记要选响应中固定出现的失败文案,或认证失败时的状态差异;标记选错会把失败响应误判为命中。
HTTP Basic 认证走 http-get 模块,格式为 路径:A=BASIC:失败标记:
hydra -L users.txt -P rockyou.txt <target> \
http-get "/v2/_catalog:A=BASIC:F=UNAUTHORIZED"
限速规避
- 对带速率限制的服务用
-t 1 -W 1单线程慢打,牺牲速度换稳定性。 - Flask/Werkzeug 开发服务器抗并发能力差,并发一高容易把服务整个打挂;对这类目标必须降并发并加等待,爆破前后都观察服务是否存活。
定向字典构造
通用大字典命中差时,按目标线索生成小字典往往更有效:
| 来源 | 做法 |
|---|---|
| GECOS 字段 | 从 /etc/passwd 注释字段提取模板,如 To***21** 提示 Todd + 2 位数字的组合,枚举生成小字典 |
| 大小写变体 | 首字母大小写、全大写等变体一并入字典 |
| 站点文案 | 用 CeWL 主题词表 从页面内容生成候选词 |
| 规模控制 | 截断通用字典控制爆破时长 |
head -n 50000 /usr/share/wordlists/rockyou.txt > /tmp/rockyou-top50k.txt
特殊场景
| 场景 | 思路 |
|---|---|
| 前端 CSRF 固定 token 的表单 | wfuzz 更方便:固定 cookie,用 --filter 按响应差异判定成败 |
| token 每次请求都刷新 | hydra 表达不了,写脚本取 token 后再提交 |
| 无 TTY 环境爆破 su | su 要求终端,用 os.forkpty() 分配伪终端绕过 TTY 要求 |
复核要点
- 命中后先做低影响的验证,不要直接执行破坏性动作。
- 失败标记写错时 hydra 会产生假阳性,抽查一条命中记录人工复核。
- 爆破期间持续确认目标服务仍正常响应,防止把服务打挂。
防御建议
- 部署 fail2ban,对同一来源的连续认证失败自动封禁。
- 启用账户锁定或指数退避,抬高在线爆破成本。
- 对 SSH、管理后台与 VPN 等入口启用 MFA。
- 对全部认证入口做统一限速,而不是只依赖单个服务的默认配置。
- 集中审计认证失败日志,关注分布式与低速爆破特征。