1. 项目概述与核心思路
做安全测试绕不开密码破解这个话题。Kali Linux 里集成了大量密码破解工具,从字典生成到暴力破解,整套链路都可以在同一个系统里完成。这篇内容围绕的是“如何从零开始,利用 Kali 完成一次完整的密码破解流程”,它不是单纯教你敲几条命令,而是把背后“为什么这么做”讲清楚。
先说清楚边界:密码破解必须建立在合法授权的前提下。要么是你自己忘了密码需要恢复,要么是你在客户书面授权范围内做渗透测试。没有授权的破解行为,轻则违反服务条款,重则触犯法律。我这边遇到的绝大多数正规项目,都会把“弱口令检测”写进安全评估范围,这才是密码破解技术的合法使用场景。
这次实战涉及的核心环节包括三块:字典怎么生成、哈希怎么识别、暴力破解怎么跑得又快又准。工具上我主要用了 Crunch、CeWL、John the Ripper、Hashcat 和 Hydra,这几个是 Kali 里默认自带的,开箱即用,覆盖了“离线破解”和“在线密码尝试”两条路线。适合的人群是刚入门渗透测试的从业者、做安全运维的工程师,以及想知道“密码是怎么被破掉的”系统管理员——了解攻击手法,才能更好做防御。
整个项目下来,我的体会是:密码破解拼的不是算力,而是“对目标的了解程度”。一个精心构造的小字典,命中率可能比几个 GB 的大字典还高。所以本文会把大量篇幅放在“字典怎么造”这件事上,而不是简单堆命令。
1.1 核心需求解析
先说清楚密码破解的几种应用场景:
- 第一种是找回自己的密码,比如你接手一台老设备,管理员把密码忘了,系统进不去,数据在里面出不来,这种场景下离线破解哈希是可行路径。
- 第二种是授权安全测试,这是我在项目中遇到最多的。客户要求检测内部系统是否存在弱口令,比如某财务系统的登录页用了 admin/admin123 这种组合,测试报告里就会给出明确风险等级。
- 第三种是取证分析,司法机关或企业内部审计拿到嫌疑设备后,需要解出加密容器或压缩包的密码。
不管哪种场景,流程都是相似的:先拿到“密码的痕迹”——要么是一个哈希文件,要么是一个登录接口——然后通过字典生成和破解工具,把明文密码尝试出来。
1.2 为什么选择 Kali 作为实战平台
Kali Linux 本身不神奇,神奇的是它把所有常用工具集成好了。过去在 Ubuntu 上要自己编译安装 Hashcat,还得折腾显卡驱动,一来一回半天就没了。Kali 默认带完整工具链,省去了环境搭建的时间。
实际项目中我通常用 Kali 的 Live USB 模式启动,或者装在虚拟机里。这里有个取舍:虚拟机方便快照,做实验时出问题可以随时回滚;但如果你要跑大规模 GPU 破解,宿主机直通显卡是必要条件,虚拟机里的 GPU 穿透配置比较折腾,这时候直接用 Kali 的独立安装版更省心。我个人在项目里是混合用的——现场测试用 U 盘启动的 Kali,回到办公环境把抓到的东西丢到实验室的高性能机器上跑,效率和灵活性兼顾。
2. 字典生成全解析
很多人一想到暴力破解,就以为是把所有字符排列组合挨个试一遍。这个思路不能算错,但效率极低。打个比方,8 位纯数字密码只有 1 亿种组合,GPU 破解几秒就完事;但一旦混入大小写字母和特殊符号,组合数直接膨胀到 10 的 14 次方量级,再强的算力也得跑几百年。所以实战中真正可行的思路是:用字典缩小尝试范围。
字典破解的原理很朴素——现实世界中的密码并不是均匀分布的随机串,而是人脑偷懒的产物。大多数人会用自己的姓名拼音、生日、手机号、常用单词的组合来设置密码。字典就是把这些“人类习惯”变成候选列表,逐条去试。对比纯暴力枚举,字典破解往往能在几分钟内解决。
2.1 使用 Crunch 生成自定义组合字典
Crunch 是 Kali 自带的一款字符组合生成工具,它的特点是可以按照你给定的字符集和长度规则,穷举生成所有可能的组合。语法结构是:Crunch 最小长度 最大长度 字符集 偏移量 输出文件。
举个例子,如果目标系统里大量员工使用“部门缩写+工号”作为默认密码,比如 IT 部门的用户习惯用 it001234 这种格式,我就可以用 Crunch 专门生成这种形态的字典:
crunch 8 8 -t it%%%%%% -o dict_itinternal.txt其中 % 代表数字占位符,这条命令会生成从 it000000 到 it999999 共一百万条密码,文件大小约 8MB。跑这种定向字典,GPU 破解一个哈希文件可以说是一瞬间的事。
Crunch 还支持自定义字符集,比如只生成以大写字母开头、后面跟数字的密码,用 -p 参数指定字符集合。更高级的用法是和掩码攻击结合——先确定密码中的已知部分,只对未知部分做穷举,这种做法在针对个人定制的场景特别有效。
注意:Crunch 生成的字典可能非常大。8 位以内的小写字母加数字组合就足以产生几十 GB 的文件,磁盘空间不够时可以考虑用管道直接把输出喂给破解工具,避免中间文件占空间,但前提是破解工具支持从标准输入读取字典。
2.2 基于目标信息生成定向字典
这是我认为整个项目中价值最高的一环。在我参与过的一次某企业内部测试中,甲方提供的授权范围包括其 OA 系统。前期的信息搜集阶段发现,该企业名称缩写是 “ABC”,总经理的姓名拼音是 wangqiang,公司成立于 2010 年,办公电话区号是 010。
基于这些信息,我用 CeWL 爬取了企业官网和内部论坛的公开页面,收集公司文化和新闻稿里的常用词汇,然后用 cupp(一个交互式字典生成脚本)输入目标员工的人名拼音、生日、手机号等,自动组合出大约 2 万条候选密码。最终破解出的 12 个弱口令中,有 7 个都来自这份定向字典,包括 wangqiang2010、abc@010、qiang1234 这种带明显个人特征的组合。
这就是目标信息字典的威力:它不是泛泛地“试遍所有密码”,而是预测目标“最可能用什么密码”。在实战中我甚至遇到过用配偶姓名加生日的组合直接命中管理员账号的情况。可以这么说,字典生成的精度直接决定了密码破解的成败。
2.3 规则变形与单词表组合
规则变形是字典攻击里容易被忽视的一环。基础思路是:先从某个基准词表出发——比如 rockyou.txt 前 1000 行,或者专门下载的常用密码列表——然后通过规则引擎,把每个词替换成多种变体。
Hashcat 的规则引擎是我用得最顺手的。它的语法看起来有点绕,但核心概念不复杂:把规则文件里的每一行当作一组指令,作用于字典中的每条密码。比如:
hashcat -m 0 hash.txt dict.txt -r rules/best64.rulebest64.rule 是 Hashcat 自带的规则文件,包含 64 条常用变形规则,比如在词尾追加 123、把字母 a 替换成 @、把首字母大写等。别看只有 64 条规则,它能把一个 100 万行的字典扩展成大约 6400 万条候选密码,覆盖面远超单纯用原字典。
我自己常用的组合是 three rules 的思路:先用原始字典跑一遍,再用规则跑一遍,最后用掩码跑一遍。三层叠加,命中率比单层高很多。但要注意:规则变形会显著增加计算量,如果 GPU 算力有限,建议先从规则文件里挑选 20 到 30 条高效的规则,而不是一次性跑全部。
2.4 字典选择的经验之谈
这里分享几个我在项目里反复验证过的经验:
- 万能字典不如小而专的字典。rockyou.txt 虽然经典(它来自一次真实的数据泄露),但动辄上百兆,跑一轮耗时很长。对单台服务器做测试时,我通常先用 10 万行的高频密码表,命中率已经能接近 60% 了。
- 字典要按场景分区。一个针对员工系统的字典,应该侧重姓名拼音、生日 8 位组合、入职年份后缀;一个针对路由器和 IoT 设备的字典,则应该包含 admin、root、123456、password 这类出厂默认组合。
- 不要忘了中文特色。很多中文目标的密码里藏着“woaini”(我爱你)、“19900101”这类组合,纯英文单词表往往覆盖不到,需要额外生成中文拼音相关的字典。
3. 暴力破解核心工具实操
字典准备好了,接下来就是让工具跑起来。Kali 里的破解工具按工作方式可以分成两类:离线破解和在线探测。两者思路不同,适用的场景也不同。
离线破解的对象是“密码的指纹”——也就是哈希值。攻击者拿到的是类似 $6$salt$hash 这样的字符串,需要用哈希算法反推出明文密码。在线探测则是对一个真实的登录接口不断尝试用户名和密码组合,比如网页登录、SSH 登录、RDP 登录等。
3.1 哈希识别与格式判断
拿到一个哈希文件,第一件事不是急着破解,而是识别它的算法类型。用错了模式,跑多久都是白费。Kali 里有一个工具叫 hashid,可以自动判断哈希类型:
hashid -m '$6$cFpzF1nC$VcLQ7Z...'输出会给出可能的算法,比如 $6$ 开头的基本可以确定是 SHA-512 crypt,对应 Hashcat 的 -m 1800 模式。但 hashid 的自动判断有时候会误报,我会再结合哈希的长度和格式做交叉验证。比如 WPA2 的握手包可以用 aircrack-ng 直接识别,而一个 40 位的十六进制字符串更像老式 WEP 的口令时,就要用不同的工具来分析。
哈希格式的规范处理非常关键。John the Ripper 通常要求标准的 passwd 或 shadow 文件格式,Hashcat 则要求每行一个 “哈希:用户名” 的结构。从 Windows 系统提取的 NTLM 哈希通常还需要先去掉域控相关的字段。这一步如果不清洗干净,后续的破解根本无法启动。我一般会在导入文件前用 awk 或 sed 做一次预处理,确保格式符合工具预期。
3.2 John the Ripper 的实战用法
John the Ripper(JtR)是老牌的 CPU 破解工具,优势在于自动识别哈希类型和内置的密码模式。它适合处理中等规模(几十万条)的哈希文件,虽然速度不如 GPU 破解,但胜在稳定、配置简单。
基本流程:
john --wordlist=dict.txt --format=sha512crypt hash.txtJtR 会在当前目录生成一个 john.pot 文件,记录已经破解出来的密码。下次再跑同一个哈希文件时,它会自动跳过已破解的条目,避免重复劳动。这个特性看似不起眼,实际用起来非常舒服——尤其是你分批加入新字典的时候。
JtR 还支持“增量模式”(incremental),本质上是一种经过优化的暴力枚举。它的原理是先对常见字符组合做概率建模,优先尝试高概率的序列。在处理一些字典完全没命中的哈希时,这个模式偶尔能创造惊喜。但它的缺点也很明显——速度比字典慢得多,我通常只把它用在最后兜底。
3.3 Hashcat 的高速 GPU 破解
Hashcat 是我在正式项目中使用频率最高的破解工具。它的核心优势是 GPU 并行计算。以 8 位纯数字的 MD5 哈希为例,中端显卡(比如消费级 RTX 系列)可以跑出每秒数十亿次的尝试速度,这样的破解几乎是秒级完成的。
常用命令结构:
hashcat -m 1000 -a 0 hash.txt dict.txt -w 3 -o cracked.txt其中 -m 1000 是 NTLM 哈希对应的模式,-a 0 代表字典攻击,-w 3 表示工作负载控制——值越高,GPU 参与程度越大,但同时会让电脑变得卡顿。我一般建议在专用测试机上用 -w 3,在办公机上用 -w 2。
Hashcat 最强大的地方是它的六种攻击模式组合:字典、组合、掩码、混合、关联和规则变形。实战中我常用的是“字典加掩码”的混合模式:比如先用字典跑一遍,再把字典里的词和 4 位数字(如 0000-9999)做拼接,对应命令是 -a 6。这样可以覆盖 “password1234” 这种典型弱密码场景。
3.4 Hydra 在线密码探测实战
离线破解能够完全发挥算力,但很多现实场景中的目标根本没有给你下载哈希的机会,明文密码只存在于真实的登录服务后面。这时候就需要 Hydra——一个灵活的在线暴力破解工具,支持 HTTP 表单、SSH、FTP、RDP、MySQL 等多种协议。
针对一个带用户名密码表单的登录系统,Hydra 的典型用法是先抓取登录请求的 POST 数据,然后指定失败时返回的提示信息,这样 Hydra 才能知道是否成功。这是在线破解里最需要细心的一步。请求格式一旦写错,Hydra 要么全部显示失败,要么把成功信号全部吞掉。
一个实际例子:
hydra -L users.txt -P pass.txt 目标IP http-post-form "/login:user=^USER^&pass=^PASS^:F=error"关键在冒号后面的 F=error——表示页面中出现 error 时就认为登录失败。如果网站的失败提示语不是 error,Hydra 会误判所有尝试都成功。所以实际使用中,我会先用 Burp Suite 手动登录一次,观察失败响应里的关键词,再来配置 Hydra。
在线暴力破解要注意频率控制。不加限制地尝试,很快会把目标的 IP 封掉,甚至触发账号锁定。也就是说,即便你字典里存在正确密码,一旦尝试次数过多触发了锁定策略,破解也就无从继续了。更稳妥的做法是控制在每分钟 5-10 次尝试,用慢速但隐蔽的方式推进。
4. 完整密码破解流程演练
工具熟归熟,能不能跑通一条完整的链路才是真本事。下面以一个模拟项目为例,串起从信息收集、字典生成、哈希获取,到最终破解成功的整个过程。
假设场景:某公司委托你做一次内部网络渗透测试,授权范围内的测试目标是公司内部的一台 Jenkins 服务器和部分员工的域账号。你的任务是检查是否存在弱口令。
4.1 信息收集与字典定制
首先,通过公开渠道收集目标公司的域名、员工姓名、组织架构等基础信息。这一步常规可用的渠道是公司官网的团队介绍页、招聘公告、新闻稿,以及一些合法的工商信息查询平台。工具的用法是把这些页面集中抓取后再清洗成词表。
在 Kali 里,CeWL 可以一步完成:指定目标 URL,设置抓取深度和最小词长,输出到一个词表文件:
cewl -d 2 -m 5 http://target-site.com/team.html -w team_words.txt然后我用脚本把姓氏与名字的拼音组合(如 wangqiang、qiangwang、wangqiang123)、生日(19900101、0101、990101)、公司缩写(ABC、abc)、常见弱密码前缀(password、admin、Welcome)全部拼接成候选字典,规模控制在 10 万条以内,尽量保证针对性。
4.2 获取哈希并做离线破解
针对域账号的场景,如果拿到了一个域控备份文件或本地的 SAM 文件,就能提取 NTLM 哈希。模拟项目中我通过临时获得的管理员权限,成功导出了一批账号哈希。这一步技术上不复杂,关键是要在授权范围内操作,并且只针对测试目标,不越界碰其他系统。
拿到哈希后,首先用 hashid 确定格式——NTLM 哈希的开头通常是用户名的十六进制表示加冒号。对这批哈希,我优先跑高频密码表,再用规则变形扩展。实际结果很有代表性:39 个账号哈希里,有 8 个密码直接弱到离谱,比如 123456、P@ssw0rd、Welcome1;还有 5 个是用姓氏拼音加公司缩写组合的,比如 zhangsanABC、liabc01。整个过程不到 10 分钟,因为这种规模的目标不需要太多算力。
对 Jenkins 服务器,则是用 Hydra 对登录页做在线探测,字典就是刚才定制好的那批候选密码。由于登录接口设置了验证码,这里就没法用 Hydra 了——需要单独写脚本模拟登录流程,这属于更高阶的自定义测试,以后可以单独展开。
4.3 结果整理与报告输出
破解结果整理这一阶段最容易被人忽视,但其实非常关键。在实际渗透测试报告里,我们不会赤裸裸地列出一堆明文密码,而是会做分级处理:哪些账号是管理员权限、哪些账号可以登录哪些系统、弱密码是否符合企业密码策略等。同时需要在报告中给出整改建议——比如强制使用密码管理器、开启多因素认证、设置账户锁定阈值等。
这里有个细节:明文密码和用户名不要直接贴在正文里,报告要走加密通道交给甲方指定的联系人。密码破解的信息展示越克制,越能体现你的专业度。
5. 常见问题与排查技巧实录
做密码破解不可能一帆风顺。下面把我这些年踩过的坑集中列出来,每条都配了排查思路和解决方案,可以当成一个速查表用。
5.1 Hashcat 驱动报错或速度低于预期
这是新手上手 Hashcat 时遇到最多的故障。现象是运行命令后直接报错说 no devices found 或者 OpenCL 相关错误。原因通常有三个:一是显卡驱动没装好,二是 Kali 默认使用的桌面环境屏蔽了 GPU 计算,三是 OpenCL 运行时缺失。
排查顺序我个人是这样:先跑一下 hashcat -I 查看是否能看到设备列表,看不到就检查驱动;如果能看到设备但速度极慢,检查 -w 参数是否设置过低,以及是否不小心开启了 --force 参数导致走了 CPU 计算。
经验之谈:在虚拟机里跑 Hashcat 就不要指望 GPU 速度了。虚拟机默认只给你虚拟的显卡,性能最多比 CPU 模式好一点。如果非要跑大规模 GPU 破解,物理机安装 Kali 并装好 N 卡驱动是唯一靠谱的选择。
5.2 字典命中率低
当跑完一个字典文件,破解结果依然一片空白时,先别急着换更大的字典。更有效的做法是检查目标信息有没有收集到位。我遇到过一个案例:某客户内部的密码统一是“公司英文名+入职年份”,比如 company2018。这种密码在任何公开字典里都命中不了,因为它包含了高度定制的公司专属信息。
所以排查字典命中率低的思路是:第一,回到信息收集阶段,看看有没有遗漏关键的个人信息;第二,检查规则变形是否覆盖了常见的变换模式;第三,尝试混合攻击模式,把字典和数字掩码做拼接。如果这三步都完成还是零命中,要考虑目标密码是否用的是完全随机生成的密码——这种情况下字典破解本来就不该报什么期望,建议改用更长位数的掩码攻击。
5.3 在线暴力破解导致账号锁定
在线破解最大的风险是触发目标系统的安全机制。很多企业系统会设置“连续 5 次失败就锁定 30 分钟”的策略,一旦触发,即便密码正确也登录不了,还会惊动安全团队。这在授权测试中不一定是好事——虽然你测试出了薄弱环节,但同时也在目标系统里留下了大量异常日志。
我个人的实践方法是:优先选择低频次慢速尝试,把 Hydra 的 -t 参数调低(并发线程数设为 1),-w 参数拉大(每次间隔 5 秒以上),以便模拟正常人工登录的节奏。更重要的是,先用 3-5 个明显错误的密码测一下系统的失败反馈与锁定逻辑,确认安全性后再决定后续速度。如果系统已有锁定策略,就切换到离线破解路线,通过导出哈希解决,不再做在线尝试。
5.4 破解结果乱码或编码异常
有些哈希破解出来是乱码,或者看起来像是一堆十六进制字符。这个现象常见于从 Windows 系统抓取的哈希,因为 NTLM 哈希的字节序与 ASCII 编码不一致。解决办法是用 hex 模式解析:
hashcat -m 1000 --show hash.txt --username --outfile cracked.txt如果破解出的密码包含不可打印字符,可以用 hashcat 的 --outfile-format 2 参数把结果输出为十六进制格式,再在本地转换成可读的 UTF-16 字符串。对于 WPA/WPA2 握手包,密码本身就是一串 8 到 63 位的 ASCII 字符串,如果破解出的结果中含有不可识别字符,基本可以判断是字典不够准确,重新检查字典内容即可。
5.5 测试环境与生产环境的结果不一致
有时候在测试环境里能轻松破解的密码,到生产环境却完全跑不动。不是工具变了,而是生产环境的密码策略往往更严格,比如强制要求密码至少 12 位且包含大小写、数字和符号。面对这种系统,字典攻击的命中率天然下降,需要转向更长的掩码或规则变形策略。
这里顺便强调一个防御视角:如果你是企业安全负责人,上面这些案例其实为你提供了一份“如何让密码更难被破解”的清单——强制密码长度、禁用常见弱密码、开启多因素认证、部署账户锁定策略,这四件事做到位,绝大多数暴力破解攻击都会被挡在门外。
5.6 手握工具库的误用风险
最后补充一个容易忽略的点:Kali 自带工具非常多,每个工具都要理解它的能力边界和潜在风险。比如一些扫描工具默认发送的探测流会让目标设备的 IPS/IDS 直接报警。在授权测试中,这种行为只要向客户提前说明即可,但在非授权环境中,这就是实打实的违规操作。所以我接到项目的第一件事永远是确认授权边界、签字画押、明确允许的测试范围和测试时间窗口,避免后续扯皮。
写在最后
密码破解这个方向,本质上考验的是你对“密码作为人机接口”这一特性的理解深度。工具只是执行者,真正的价值在于你能多准确地预测人类设置密码的行为。每次破解任务结束后,我都会把新收录的密码形态、字典规则、工具参数整理到自己的知识库中,日积月累之后,面对新的目标时往往第一轮字典就能命中大半。
对于刚开始接触这块的读者,我的建议是别急着追求大字典和豪华硬件。先拿自己的测试设备练手,把一个 100 万条的小字典玩透——掌握规则怎么加、掩码怎么配、速度怎么调优,远比盲目堆算力实在。等理解了整套节奏,再考虑上多显卡集群也不迟。
最后分享一个小技巧:破解不是终点,结果输出同样重要。无论是测试报告里的风险评级,还是代码里强密码策略的一行配置,都要用明确的证据支撑你的结论。密码破解做得再漂亮,如果输出报告含糊其辞,客户依然不知道该怎么改进。真正体现专业水平的地方,往往就在这最后一公里。