☰
Linux密码破解与安全审计:从哈希提取到弱密码加固实战
2026/10/13 4:15:54 网站建设 项目流程

我先说句实在话:听到“Linux密码破解”这几个字,很多人第一反应是能不能拿到别人的root权限。真在一线做过运维或安全审计的人都知道,日常遇到最多的场景恰恰是——测试环境的root密码没人记得、交接文档里的密码和实际对不上、安全加固要检查全站弱密码。密码恢复和强度审计,才是这个领域真正的高频刚需。这篇文章我按实际工作中“拿到系统、提取哈希、跑字典、出报告、做加固”的完整链路来讲,把你需要理解的技术原理、工具选型、实操参数和踩过的坑一次说清楚。

1. 先把基础搞明白:Linux密码都藏在哪、长什么样

1.1 /etc/passwd与/etc/shadow的分工

早期Linux把用户信息和密码哈希直接放在/etc/passwd里,这个文件对所有用户可读,等于把哈希公开给全世界围观。后来改成双文件结构:/etc/passwd只存用户基本信息,密码字段用一个x占位;真正的哈希挪到/etc/shadow,权限默认600,只有root(以及个别特权组)能读。

/etc/shadow每一行格式如下:

username:$6$randomsalt$hashvalue:19000:0:99999:7:::

字段依次是用户名、密码哈希、最后一次修改时间(从1970年1月1日起的天数)、最小修改间隔、最大有效期、过期前警告天数、宽限期、失效日期。日常审计里前面几个字段最有价值,后面基本不用管。看到是600权限就知道,普通用户想读/etc/shadow会直接被拒,这也是为什么密码破解前必须先拿到root权限或至少能读到shadow文件——这一步过不去,后面无从谈起。

1.2 哈希前缀一眼识别算法

哈希字符串里带有一个$数字$或$字母$的前缀,用来标明算法类型。我刚入行时经常对着哈希发呆,后来总结了这个快速对照表:

前缀算法常见场景破解难度
$1$MD5加密变体老版本Linux低
$5$SHA-256部分发行版过渡期中
$6$SHA-512大多数主流发行版默认中高
$y$yescrypt新版本Debian/Ubuntu高
$2y$ / $2b$bcrypt部分定制系统很高
$argon2id$Argon2id新系统可选方案很高

理解这个前缀的意义在于,它直接决定后面破解工具的选择和参数。同样一个8位数字密码,MD5变体可能几秒就出来,bcrypt就需要几分钟到几小时。新发行版已经逐步把默认算法从SHA-512迁移到yescrypt,就是因为GPU并行破解对老算法的威胁太大。做审计前先看一眼哈希前缀,基本能判断这次要花多少时间成本。

2. 工具选型:John the Ripper还是hashcat

密码破解工具很多,但实战中真正扛得住场面的是两个:John the Ripper(简称JtR)和hashcat。很多人纠结选哪个,我的建议是别二选一,按场景定。

2.1 John the Ripper:老牌稳妥,适合快速审计

JtR最大的优点是“开箱即用”和“自动识别”。它内置了大量哈希格式的识别逻辑,你把提取出来的哈希文件丢给它,它能自动判断算法。它还自带unshadow工具,能把/etc/passwd和/etc/shadow合并成一个破解文件,这个操作在审计场景里极其常用。

JtR默认走CPU多线程,虽然速度不如GPU,但胜在稳定、兼容性好、不依赖显卡驱动。我在客户服务器上做审计时,通常优先用它——很多生产环境根本没有GPU,JtR反而是唯一能跑起来的方案。而且JtR的输出格式清晰,支持--show查看已破解列表,方便直接生成报告。

2.2 hashcat:GPU暴力机器,适合大批量攻坚

hashcat把计算压在GPU上,速度是JtR的几十倍甚至上百倍。但它有两个门槛:一是需要NVIDIA或AMD显卡以及对应驱动环境;二是它不负责提取哈希,你得手动从shadow里把哈希字段拆出来,按特定格式存成文件。对新手来说这个拆分过程容易出错。

我用hashcat的场景通常是规模较大的加固项目:系统里有几百个账户,SHA-512哈希,GPU跑掩码攻击的效率远高于CPU。另外hashcat支持很多高级模式,比如多字典组合、规则文件、掩码攻击、混合攻击,灵活性比JtR高一个档次。缺点是配置参数多、命令行复杂,出错提示又比较晦涩。

2.3 选型原则:环境决定一切

我的经验是分三步判断:先看机器有没有GPU,再看哈希数量多不多,最后看目标密码复杂度预期。一次只跑两个弱密码样例,JtR足够;几百上千个哈希又带GPU工作站,hashcat是正解。日常学习的话建议两个都装,先用JtR熟悉流程,再上手hashcat体会速度差距。

3. 完整实操:从拿到哈希到恢复口令

下面按我实际操作时的流程逐步走一遍,用的都是真实命令和参数,可以直接抄。

3.1 第一步:用unshadow合成破解文件

把/etc/passwd和/etc/shadow合并成JtR能直接读的文件:

unshadow /etc/passwd /etc/shadow > hashes.txt

如果你手上只有shadow文件,也可以手动构造。JtR要求每行格式为用户名:哈希:其他字段,unshadow做的工作本质上就是把passwd里的uid、gid、home目录等信息和shadow里的哈希拼在一起。生成后先跑一个测试确认格式没问题:

john --show hashes.txt

3.2 第二步:字典攻击与规则变形

拿到哈希文件后第一件事永远是跑字典,不是暴力枚举。大部分真实弱密码都在常见字典里,直接撞库效率最高。

john --wordlist=rockyou.txt hashes.txt

rockyou.txt是我最常用的大字典,包含大约1400万条真实泄露密码,覆盖范围很广。如果字典跑完还有大量哈希没破,就加规则变形,让工具在每个字典词基础上做变化:

john --wordlist=rockyou.txt --rules hashes.txt

JtR内置的规则会尝试把单词首字母大写、末尾加数字、常见年份(比如加123、2024)、大小写互换等变形。实测下来规则攻击能把命中率提升30%到50%,很多人的密码就是“弱密码+简单后缀”的组合,规则正好打中这个习惯。

hashcat对应字典攻击参数更繁琐,以SHA-512(哈希模式1800)为例:

hashcat -m 1800 -a 0 hashes.txt rockyou.txt

-a 0就是字典模式,加规则的写法是:

hashcat -m 1800 -a 0 hashes.txt rockyou.txt -r rules/best64.rule

best64.rule是hashcat自带的精选规则文件,覆盖了最常见的变形模式,新手用它起步比较稳妥。

3.3 第三步:掩码攻击兜底

字典加规则跑完还有漏网的,说明密码有一定的随机性或自定义特征,这时候上掩码攻击。掩码就是定义密码每一位的字符集合,让工具按指定格式穷举:

掩码符号含义
?l小写字母a-z
?u大写字母A-Z
?d数字0-9
?s特殊符号
?a以上所有

比如推测目标密码是“8位纯数字”,写法是:

john --mask='?d?d?d?d?d?d?d?d' hashes.txt

hashcat写法:

hashcat -m 1800 -a 3 hashes.txt "?d?d?d?d?d?d?d?d"

掩码攻击的关键在于猜位置结构。你看到目标系统有密码复杂度要求,常见特征是“一个大写+一个小写+六个数字”,掩码就写成?u?l?d?d?d?d?d?d。完全不知道结构时用全字符集会让空间爆炸,8位全字符集就是95的8次方,这个量级GPU也扛不住,所以尽量先用信息推断结构。

JtR还提供增量模式,本质上就是智能掩码,但运算开销大,速度不如直接掩码。我通常只在掩码攻击小规模试探后仍失败、且确认密码不是常见结构时才启用增量模式,平时不推荐。

4. 常见问题与卡壳现场

这里整理几类我实际踩过的坑,每个都配有排查思路,按顺序对照基本能解决90%的问题。

4.1 “No password hashes loaded”与权限问题

第一次用JtR的人最容易碰见这个报错。原因通常是哈希文件格式不对,比如手动从shadow里复制哈希时带了多余空格或注释。先用head -3 hashes.txt检查原始内容,确保每行是用户名:哈希结构。

更隐蔽的问题在于权限:普通用户读不了/etc/shadow,即使unshadow命令能拼文件,读不到shadow也是白搭。有些环境用sudo或者先拷贝shadow到分析目录再操作,这一步容易在自动化脚本里出乱子。我的习惯是先在临时目录里生成hashes.txt,再单独给这个文件设置权限,避免把shadow内容暴露在普通用户可见的目录里。

4.2 哈希算法识别失败

JtR偶尔会检查不出新版发行版的yescrypt哈希,报“Unknown ciphertext format”。解决办法是手动指定格式:

john --format=crypt hashes.txt

更精确一点可以指定yescrypt格式,不同版本JtR支持的名称略有差异,john --list=formats可以查看所有支持格式。hashcat里对应模式是-m 15300(yescrypt)。如果手动指定后还报错,大概率是从shadow里截取哈希时少了前缀字符,重新用完整字段再试。

4.3 字典跑完没结果怎么办

这是最让人心慌的场景,我在一个加固项目里就遭遇过:rockyou加规则跑了一整晚,命中率不到20%。排查思路按顺序来:

先确认字典没被系统过滤掉重复项、没有被截断。再检查是否启用了规则——很多人以为加了--rules但实际上命令拼写错误。然后看目标是不是高开销算法:如果是yescrypt或bcrypt,CPU跑一整晚可能只尝试了很少的单词,这时候必须换GPU。

还有一个容易被忽略的问题:pot文件。JtR会把已经破解的哈希记录在pot文件里,第二次跑同一个哈希会直接跳过。如果你改了字典想重跑,先清空pot文件或用--pot指定新的pot路径。排查完这些还是没结果,就老老实实上掩码,通常能兜住一部分。

4.4 速度太慢的优化方向

速度慢的根源要么是算法开销大,要么是没吃满硬件。SHA-512的迭代次数约5000次,单块普通显卡每秒能测几千万次;bcrypt默认迭代让单卡每秒只剩几百次。这是算法本身的抗并行设计,没有魔法能绕过。真遇到高开销算法,只能缩小攻击空间:先跑字典,再用规则,最后才是掩码,不要一上来就暴力。

CPU场景下检查JtR是否吃满所有核心,必要时用--fork指定多进程;GPU场景检查驱动、显存占用和供电状态,hashcat默认会自动检测设备,但如果机器上有多个GPU务必用-d指定目标设备,避免占用到集显上。

4.5 破解中途中断与断点续跑

密码破解常常耗时几小时到几天,中途断电、误关终端都很常见。JtR自带断点机制,进程中断后直接重跑相同命令,它会自动读取pot文件并从中断位置继续。hashcat同理,加--restore可以从保存的session恢复。两个工具都建议一开始就设置session名称,方便管理多个破解任务:

john --session=audit1 --wordlist=rockyou.txt hashes.txt hashcat -m 1800 audit_hashes.txt rockyou.txt --session=audit1

5. 防御视角:破解不是为了攻击,而是为了变强

跑完一轮密码审计,拿到了若干弱密码,事情还没完。真正有价值的环节是后续加固,否则下次审计还是同样的结果。我把这几年积累的加固经验整理成了一套做法。

5.1 先换算法再谈策略

密码哈希算法是防线的基础。老系统如果还在用MD5或SHA-256,优先迁移到yescrypt或Argon2id。Debian系新版本默认就是yescrypt,等宽密码本的破解成本已经比SHA-512高几个数量级。迁移方式各发行版文档写得很清楚,核心就是修改/etc/login.defs或PAM配置里的加密算法选项,然后让用户下次改密码时重新生成哈希。注意迁移后老哈希不会自动重写,需要配合“强制用户定期修改”策略才能逐步换完。

5.2 把密码策略从复杂度转向长度

这是我最想强调的一点:过去强调“必须含大小写、数字、特殊字符”,实际效果并不好,因为用户在被迫创造“符合规则但无意义”的密码,然后写在小本子上。现代建议改成“长度优先”,比如最少12位,不强制复杂字符组合。12位的全小写字母加数字的组合空间就已经非常可观,远比8位带符号的密码难破。规则越简单,越好记,用户就越会设唯一密码而不是到处复用。

5.3 用审计结果做定期巡检

把破解工具变成防御工具的核心思路:定期对自己系统做弱密码扫描,把发现的弱密码账户列为风险项。操作上可以写一个简单脚本,每周提取shadow、跑一轮快速字典、输出命中名单,再配合强制改密流程。审计用的字典不需要很大,top 1000的弱密码就能揪出大部分问题账户。

另外结合泄露库做检查也很重要。很多人的密码虽然符合复杂度策略,但早就在历史泄露事件中公开了。这类密码最危险,因为攻击者拿到泄露库后会批量撞库。检查手段就是把你系统的哈希和已知泄露哈希比对,命中就意味着该账户密码必须立即更换。

5.4 日志和锁定策略不能省

改密码不是万能药,还要配合登录保护和监控。PAM里开启失败登录锁定,限制连续错误次数与锁定时间,能挡住大部分远程爆破尝试。同时监控auth.log里的认证失败事件,看到单个IP高频尝试就要警觉。我自己在运维中会把auth日志接入简单的告警规则,连续失败超过阈值就触发通知,效果立竿见影。

5.5 关于权限与合规的最后提醒

整篇文章讲的所有操作,前提是你对自己的系统、或客户明确授权的系统进行安全审计。越权去碰别人机器属于违法行为,这个边界是底线。企业内部做密码审计也要先获得书面授权并限定范围,审计结果按敏感信息管理,不要外传。我见过的几乎所有严重安全事故,都源自内部人员滥用权限或日志泄露,所以拿到哈希和破解结果后要及时清理临时文件,pot文件也不要留在共享目录里。

写在后面

我说一个自己在项目里的体会:有次给客户做全量密码审计,跑完发现管理员组里三分之一账户用的是“公司名+年份”这种极其好猜的密码,更夸张的是有台机器的root密码和测试环境一模一样。那次之后我就养成一个习惯——每次交付前先自查一遍弱密码,再顺手把审计命令写进内部检查清单变成每月固定动作。如果你也是运维或安全岗位,我建议别把“密码破解”当成纯攻击技能来学,它更是一种让你真正理解“什么样的密码靠得住”的体检工具。把工具用在自己系统上,把经验转化成加固方案,这场攻防游戏才有意义。

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

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

立即咨询