☰
Hydra Windows版内网弱口令审计:字典清洗与慢速爆破实战
2026/10/21 3:02:31 网站建设 项目流程

简介:面向 Windows 平台的口令安全测试场景,7z 压缩包整合了 Hydra 爆破工具与配套字典集,定位在授权渗透测试、内网口令审计和应急排查,适合有一定命令行基础的安全工程师与运维人员。包内共 99 个文件,包括 hydra.exe、pw-inspector.exe 两个主程序,32 个 cyg 系列 DLL 运行库,37 个 txt 字典,以及 sample、head、git 索引、hydra.restore、README 与启动脚本等辅助内容,整体约 120.9MB,解压后即可直接使用。字典部分覆盖 darkweb2017、xato-net、probable-v2、键盘组合、常见默认口令等常见密码集,按来源与场景分类便于按需选用;hydra.restore 支持会话恢复,适合长时间爆破任务中断后续跑。已有 2141 人学习下载。资源同时保留了原版 thc-hydra-windows 的 Git 仓库结构与部署目录,既能支撑实际口令安全评估,也可作为学习 Hydra 参数、字典整理与 Windows 下工具移植的参考样本,尤其适合需要离线字典和便携工具的本地测试环境。

1. Hydra Windows版 + txt字典:环境跑通,字典才值钱

接到一批内网服务器的口令复核任务后,我在Windows机器上搭爆破环境,第一版命令能跑,结果却是零命中。排了一下午才发现,问题不在字典本身,而在两个很基础的地方:hydra执行文件被系统安全中心隔离掉,txt字典的行尾和编码带着肉眼看不出的冗余字符。Hydra Windows版配一份整理干净的txt字典,才是这套在线口令审计流程里最先要过的关卡。它解决的是:在拿到明确授权的前提下,针对RDP、SSH、FTP、HTTP表单这类网络登录服务,用可控并发和可复现的字典做弱口令排查。适合运维、安全测试和资产检查的工程师,尤其是环境固定在Windows、不想为了跑原版去折腾Linux编译环境的人。

2. 把Windows版跑起来:编译版形态、目录规范与前置自检

2.1 官方源码与Windows编译版差在哪里

Hydra从设计上更贴近类Unix环境,官方仓库里大量代码依赖OpenSSL、libssh、PCRE这些第三方库,想在Windows上从源码手动编译一轮,单是解决依赖路径和链接器报错就能耗掉一个下午。所以多数人实际用的都是第三方开发者在Windows下交叉编译好的可直接执行版本,这也是资源包里最常见的形态。

这类编译版的好处很直接:不用安装运行库、不需要配置编译器,解压后hydra.exe放在那里就能执行。但它也有代价,最明显的是编译时裁剪了哪些模块,不同打包者取舍不一样。有的版本把redis、mssql之类扩展协议裁掉了,有的甚至连rdp都没有。Windows版跑不起来,很多时候不是机器坏了,而是手里这份编译版缺模块。

选型建议比较粗暴:优先选自带完整hydra -U模块列表的编译版,解压后先用帮助命令自检,确认目标协议在列表里,再谈并发和字典。不要等命令跑到一半报service module not found才回头换版本,那才是真的浪费时间。另外Windows上杀毒软件对这类工具特别敏感,解压后第一时间把目录加进白名单,否则跑着跑着exe消失,找半天都不知道去哪了。

2.2 让hydra.exe跑起来:PATH、自检命令与连通性验证

拿到解压包后,我习惯先把工具目录放到一个干净路径,比如C:\Tools\Hydra,路径里不要有空格和中文。放在桌面或带空格的用户目录下,后面写脚本、配环境变量都会多一些没必要的转义问题。

# 先把目录临时加进当前PowerShell会话的PATH,不用重启 $env:Path += ";C:\Tools\Hydra" # 确认系统能正确找到hydra where.exe hydra

where.exe hydra能做的事很简单:输出可执行文件的完整路径。如果它什么都查不到,说明PATH拼接没生效,或者目录名写错。这里要留意,$env:Path只对当前窗口有效,关掉就没。想永久生效,用setx PATH "%PATH%;C:\Tools\Hydra",但会覆盖原PATH,操作前先备份一下,别把系统变量搞乱了。

PATH配好之后做两件事。第一件,执行hydra -h和hydra -U,前者确认参数语法版本,后者列出当前编译版支持的所有服务模块。这一步能直接筛掉“目标协议不存在/不可用”这类早期报错,我每次都先跑,跑完心里有底。

第二件事是连通性验证。选一台已授权测试的目标机器,用一个故意写错的密码做最小尝试,只观察工具和目标端口能不能建立协议连接。比如目标是一台启用了SSH的主机:

hydra -l root -p wrongpass 192.168.1.20 ssh -t 1 -w 5

看到[22][ssh]开头的响应行,说明协议通道通了。密码写错完全没关系,我们要的是握手成功,不是命中。如果这一步都报超时或连接拒绝,那问题在目标端口、防火墙或网络层,和字典无关,先把网络打通再继续。

3. 搞定txt字典:行格式、编码规则与整理脚本

3.1 txt字典的标准格式没那么随意

Hydra读txt字典的规则本身很简单:按行读取,每一行拿去做一次口令尝试。但现实里的txt文件远没有这么单纯。Windows记事本默认保存成ANSI/GBK编码,行尾是CRLF;Linux环境下流转出来的字典往往是UTF-8无BOM、LF行尾。Hydra本身两种行尾都能处理,最怕的是混在一起,或者开头带BOM。文件开头一旦有BOM,第一行口令会被带入不可见字符,实际尝试的密码和你肉眼看到的完全不是一回事,命中率直接从源头归零。

编码问题同样隐蔽。字典里如果存了测试123这类带中文的口令,工具按UTF-8解析,但又拿一个GBK编码的文件喂进去,解析出来的字符串已经变了。结果就是:手工复制密码能登录,hydra跑完却一条都不中。这种问题最迷惑人,因为命令行输出里看着一切正常。

我定的清洗标准是:编码统一为UTF-8无BOM,行尾统一为LF,文件末尾保留一个换行,全文不出现空行,每行首尾不要有多余空格。尤其是从Excel或网页复制过来的字典,经常在行尾带一个不可见空格,普通编辑器里看不出来。验证字节时可以用PowerShell直接看行尾标记:

# 查看txt前5行字节,0D 0A是CRLF,0A单独出现是LF Format-Hex -Path .\pass.txt | Select-Object -First 5

看到CRLF先不慌,hydra多数情况下能处理;但如果你拿到的字典混合了LF和CRLF,各种奇怪行为就会冒出来。与其赌它兼容,不如统一成LF。用能切换编码和行尾的文本编辑器另存一次,十秒钟的事,省下一晚上的排查。

3.2 生成与清洗字典的三种常见做法

字典从哪来,有时比怎么清洗更值得花时间。通用大字典动辄几十G,直接灌给hydra效果很差。原因是内部账号体系的口令往往有很强的业务特征,姓名拼音、生日、办公系统缩写加年份,这些在通用大字典里命中率很低。我一般会先生成一份小规模定向字典,把目标可能使用的典型口令结构列出来,再用脚本扩展。

第一步先做合并和去重。手上如果有多个来源的txt,先用一条PowerShell命令统一清洗:

# 合并多个txt字典,去掉空行和首尾空格,去重后输出UTF-8无BOM Get-Content .\dict_base\*.txt | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" } | Sort-Object -Unique | Out-File -Encoding utf8 .\pass_all.txt

这条命令里的Trim只清理每行首尾空白,不会动口令内部空格,所以对大多数业务口令是安全的。Sort-Object -Unique做排序去重,避免同一个口令被尝试多次。Out-File -Encoding utf8在Windows PowerShell 5.x里输出的是带BOM的UTF-8,拿到手后用2.1里的Format-Hex检查一下,有BOM就去掉。PowerShell 7里的-Encoding utf8默认不带BOM,更省事。

第二步做规则扩展。一个小技巧是让hydra自己生成候选,不必额外写脚本。-x参数能按字符集生成指定长度范围的口令:

# 生成4位,字符集只含a/b/c/1/2/3的候选口令 hydra -l admin -x 4:4:abc123 ssh://192.168.1.20 -t 2 -w 10

4:4表示最小长度和最大长度都是4,abc123是允许出现的字符池。这个参数适合快速验证小范围候选,但一定要提前算组合量。6位纯小写字母就已经两亿条,直接跑会触发防火墙或账户锁定,不是字典工具不行,是策略不对。

第三步是做个几十行的Python清洗脚本,处理一些命令行不方便搞的细节。比如去掉行首行尾的不可见字符、剔除全是空白的行,同时保留口令内部的空格:

# 清洗已有字典,输出LF行尾、UTF-8无BOM的干净文件 import pathlib src = pathlib.Path("raw.txt") dst = pathlib.Path("clean.txt") lines = [] for line in src.read_text(encoding="utf-8", errors="ignore").splitlines(): line = line.rstrip("\r") if line.strip(): lines.append(line) dst.write_text("\n".join(lines) + "\n", encoding="utf-8", newline="\n")

splitlines()把CRLF和LF都按行切好,rstrip("\r")只去掉行尾的CR,不碰口令内部空格。line.strip()仅用于判断这一行是不是空行,判断完仍然保留原行内容写入。注意newline="\n"保证写出的行尾是LF,这个参数在Windows上必须显式指定,否则默认会被系统改写。

4. 三类协议实战:RDP、SSH与HTTP POST的参数拆解

4.1 RDP字典爆破:并发线程、等待时间与账户锁定

RDP是Windows环境里最常见的审计目标,但也是最容易翻车的协议。远程桌面服务对连接频率很敏感,目标机器往往配置了账户锁定策略,连续几次失败就会锁定账号。线上环境里把并发拉满去扫,跑不出结果还是小事,把管理员账号锁了才叫事故。

我常用的RDP命令长这样:

# 对指定RDP主机做弱口令排查,命中即停,结果落盘 hydra -L users.txt -P pass.txt -t 2 -w 30 -f -o rdp_ok.txt rdp://192.168.1.20

参数拆开看:-L users.txt是用户名列表文件,-P pass.txt是密码字典。-t 2把并发线程压到2,对RDP来说这个数字已经偏高,保守场景我甚至会用到-t 1。-w 30表示每次尝试之间等待30秒,这是慢速模式的核心,也是防止目标机器连接中断的关键。-f表示某一组用户名口令命中后立即停止,避免继续试探产生更多无效登录日志。-o rdp_ok.txt把结果写入文件,而不是只刷新在屏幕上。

一个容易忽略的坑:目标机器的管理员账户很可能被改名或禁用,单纯用-l administrator会一条都测不出来。这时换成-L users.txt,把常见账户名和可能的账号都放进去,覆盖面立刻不一样。

还有NLA的问题。新版Windows远程桌面默认启用网络级别身份验证,有些旧版hydra的RDP模块在NLA握手时会失败,报错信息还看不明白。遇到这种情况,先确认hydra -U列出的rdp模块版本,再考虑换编译版或在Linux容器里跑原版,不要和工具死磕。

4.2 SSH与FTP爆破:慢速模式与空口令扩展

SSH的爆破比RDP温和一些,但服务器日志记得很全。大批量并发试探会让SSHD直接断开连接,输出里一片Connection reset by peer。FTP相对简单,协议状态好控制,但企业内网里FTP经常配了fail2ban这类防御,连续失败会被动态封IP。

我处理SSH时执行的是这套:

# SSH弱口令排查,单线程慢跑,同时尝试空口令和用户名同名口令 hydra -L users.txt -P pass.txt -e nsr -t 1 -w 10 -o ssh_ok.txt ssh://192.168.1.20

-e nsr是三个扩展选项的缩写:n尝试空口令,s尝试用户名本身作为口令,r尝试用户名反转后的字符串。内网环境里这三类候选命中率不低,很多人会在初始化账号时留空密码或者设置成和用户名一样。-t 1单线程,-w 10延迟10秒,这套组合跑得慢,但能最大限度避免触发SSH的防爆破机制。

FTP场景可以稍微激进一点,但也要看目标跑没跑防护软件。保守命令是把-t加到4,-w降到5。如果跑着跑着突然所有连接都超时,不是网络断了,大概率是目标侧开始封IP。这时候停掉任务等一段时间,再换一个小批次字典继续。

从审计角度,目标服务器上的登录日志会完整记录每一次尝试,慢速模式减少不了尝试次数,只是拉长时间线。我一般会把低峰时段作为主要跑测窗口,跑前先和资产负责方确认测试时间窗口。日志告警不是用来绕的,是用来配合判断测试是否被发现的依据。

4.3 HTTP表单爆破:三段式参数与动态Token的边界

HTTP表单爆破是另一个高频场景,也是参数最容易写错的地方。Hydra处理普通POST表单登录用的是http-post-form模块,命令写起来是一长串冒号分隔的三段式参数:URL路径、POST数据、失败标志字符串。

# 普通登录表单爆破,三段式为:路径 | 参数 | 失败标志 hydra -l admin -P pass.txt -t 8 -w 5 -f -o http_ok.txt 192.168.1.20 http-post-form "/login.php:user=^USER^&pass=^PASS^&submit=Login:Invalid username or password"

三段式里的^USER^和^PASS^是占位符,Hydra跑的时候会替换成当前用户名字典和密码字典里的值。第三段Invalid username or password是登录失败页里的一小段固定文本,必须先在浏览器开发者工具里提交一次错误口令,打开响应源码确认这段文本真的存在且不会变化。如果选错了字符串,比如错误提示是JS弹窗渲染出来的,响应源码里根本没有,那hydra会把所有尝试都判定为成功,结果没有意义。

另外注意POST参数要按浏览器抓到的实际内容写。很多登录表单还带隐藏字段,比如lt、execution这类一次性票据,少一个字段服务端就直接拒绝,怎么跑都不会中。这种复杂表单已经不适合用hydra硬拼,我的建议是先用抓包工具确认参数结构,遇到动态Token、图形验证码或JSON接口,直接换Python + requests脚本处理,手工预取Token再拼到每次请求里。hydra+txt字典型资源只负责普通表单场景,不要期望它能把带验证码的接口也一并解决掉。

5. 常见问题排查:五条实测避坑记录(现象→原因→解决)

5.1 现象:hydra.exe解压后“消失”

解压包里明明能看到文件,过一会儿再看目录,hydra.exe不见了,命令行执行时提示找不到命令。

原因很直接:系统安全中心或第三方杀毒软件把hydra判定为HackTool类程序,解压完成就被隔离。这类工具的特征非常明显,安全软件处理它不需要用户确认。

解决方法是把工具目录加入安全中心的排除项,然后再重新解压一份。操作前先到隔离区确认记录,能看见消除记录就等于实锤。整个测试做完,把排除项移除,恢复默认防护策略。注意这里的前提是目标机器有明确授权,别拿办公网随意试,工具本身不违法,但使用边界要自己把好。

5.2 现象:并发调到32,目标机器掉线或账号被锁

命令跑起来没几分钟,目标远程桌面断开,随后管理员反馈管理员账号被锁定。

原因是并发线程数严重超过RDP这类交互协议能承受的范围。Windows默认账户锁定策略可能只有几次失败窗口,32个线程同时发登录请求,相当于瞬间制造大量失败记录,直接触发锁定。

解决方法是先查目标机器或域策略里的锁定阈值,把-t降到1到2,-w调到30秒以上。大字典拆成几份小字典分批次跑,每批跑完停几分钟再继续。宁可让整个审计持续几个小时,也不能让目标系统进入锁定状态。锁定一旦发生,不只是压力测试中断,还会给运维团队留下一个需要紧急处理的烂摊子。

5.3 现象:字典里明明有正确密码,结果零命中

手工把密码复制过去能登录,字典里也确认存在这一条,但hydra跑完全部候选仍然没有命中。

最常见原因是编码和行尾问题。记事本默认的ANSI/GBK编码、Excel粘贴进来的不可见回车、UTF-8 BOM头,都会让hydra读取到的内容和肉眼看到的不一致。排查方法就是第3章里写的Format-Hex看字节,以及统一转成UTF-8无BOM。

解决后用随机抽样的方式复核。从字典里挑几条已知无效口令和那条正确口令,单独放到一个小测试文件里跑一次,确认工具确实把这条正确口令发出去了。这一步叫复核,不能省。我踩这个坑的次数最多,后来养成的习惯是每次换字典先做字节级检查再上线跑。

5.4 现象:命令格式没错,却报error in target specification

命令看着挺正常,目标IP、端口、协议都写了,hydra立刻弹error in target specification或提示service module不可用。

原因分两种:一是当前Windows编译版裁剪了目标协议模块;二是写法与版本语法不匹配。老版本习惯把协议作为位置参数写在目标后面,新版本更常用协议://地址的写法,两边混着用就会报错。

解决起来不复杂,先执行hydra -U,看列表里到底有没有目标协议。如果rdp根本不在列表里,就不用折腾语法了,直接换一个编译更全的版本。如果列表里有,再对照hydra -h的示例修改目标写法。Windows版模块不全时还有个备选,用Linux容器或WSL跑原版,比自己找各种来路不明的编译版更省心。

5.5 现象:手工能登录,hydra所有请求都返回失败标志

接口是普通POST,没有验证码,手工提交能正常登录,hydra跑完却把每一次尝试都判定为失败。

原因大概率是失败标志字符串选错了,或者请求参数里少了某个字段。Hydra的第三段匹配的是响应源码里的固定文本,如果错误提示是异步JS渲染或跳转后才显示的,源码里根本找不到。还有一类情况是登录请求带了session或token字段,手工浏览器有,hydra裸POST没有。

解决方法是先用浏览器开发者工具手动提交一次错误口令,把响应源码完整保存下来,从中挑一段唯一且稳定的错误提示作为标志。如果目标带CSRF Token或动态票据,直接用Python脚本预处理,先把Token抓出来,再和字典里的口令拼成完整的POST请求。这套资源里的txt候选口令在这种场景仍然有用,但驱动工具要换成脚本,不能指望hydra直接处理动态Token。

6. 进阶技巧:结果解析脚本与慢速分批审计

6.1 把-o输出解析成结构化结果

跑通一次口令审计后,最麻烦的反而不是爆破过程,而是结果整理。hydra默认把命中条目打印在终端里,窗口一滚动前面的记录就丢了。所以我每次都强制加上-o参数把结果落盘。但落盘的文本格式带着协议前缀和host字段,不能直接当清单用。

# 解析hydra -o输出文件,提取命中条目并输出JSON import re import json with open("ssh_ok.txt", encoding="utf-8", errors="ignore") as f: data = f.read() items = [] for line in data.splitlines(): m = re.search(r"login:\s*(\S+)\s*password:\s*(\S+)", line) if m: items.append({"login": m.group(1), "password": m.group(2)}) print(json.dumps(items, ensure_ascii=False, indent=2))

这段正则匹配的是输出里login: root password: 123456这样的文本结构,把用户名和密码各自提取出来。\S+适合大多数无空格口令,如果目标口令本身包含空格,正则要改成password:\s*(.*)$,把密码一直取到行尾。JSON输出格式方便后续粘贴到表格或导入验收记录。

6.2 慢速分批的实操习惯

多年经验骗不了人。真正把口令审计做出价值,靠的是流程而不是工具。跑之前先分协议拆任务:RDP一个批次,SSH一个批次,HTTP一个批次,互不混跑,出问题能单独定位。每批字典都按首字母或关键词分组,拆成几个小文件,跑完一份休息几分钟再跑下一份,避免目标的安全机制在短时间内收到大量请求。

跑完不是结束,命中条目必须人工复核。远程桌面能建会话、SSH能登上、HTTP能打开登录后的页面,才算有效命中。命中记录整理完交给运维侧做改密或账号下线处理,整个闭环才算结束。从那以后,我每次拿到新项目,都强制走一遍先确认模块、再校验字典编码、然后锁低并发慢跑、跑完用脚本解析、命中条目全部人工复核的流程。这套习惯救过我不少次,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询