前阵子给一台老服务器做安全巡检,发现运维同事把 root 密码设成了Admin@123这种一眼就能猜出来的组合。检查/etc/shadow的时候,我顺手用 John the Ripper 跑了一下,不到两分钟就解开了。这事其实挺常见——很多人以为 Linux 密码很安全,但实际上如果 shadow 文件泄露给了攻击者,弱口令就是一层窗户纸。今天这篇就围绕 Linux 密码破解与恢复这件事,把原理、工具选型、实操流程和防御策略完整梳理一遍,希望对做运维、搞安全审计、或者纯粹忘了自己 root 密码的同学都有帮助。
文章会分成五块:先讲清楚 Linux 密码体系是怎么回事,再介绍常用工具和字典准备,接着给出三类核心实操流程(离线破解、在线测试、系统密码重置),然后整理我踩过的坑和排查经验,最后从防御视角聊聊怎么让密码更难被破解。整篇偏向实战,命令都给全,你可以直接照着在自己的测试环境里操作,但务必记住:所有破解操作必须针对自己拥有权限的系统,或在获得书面授权的渗透测试中进行,别拿这些手段去碰别人的机器。
1. 先搞清楚目标:Linux 密码体系与常见破解场景
1.1 密码到底存在哪里
很多人以为 Linux 密码存在/etc/passwd里,这是十几年前的老黄历了。现在的 Linux 系统,密码相关数据分两个文件存:/etc/passwd存用户基本信息,/etc/shadow存加密后的密码哈希,后者只有 root 和 shadow 组才能读取。这就是为什么你拿到一个普通用户的 shell 后,看不到别人的密码哈希——系统在设计上就把这部分数据保护起来了。
/etc/shadow里每一行对应一个用户,冒号分隔的字段很多,最关键的是前几个。举个例子:
root:$6$samplesalt$9F5yK3Vb...:19000:0:99999:7:::从左到右分别是:用户名、加密密码、最近修改时间、最小修改间隔、密码有效期、过期前警告天数等。第二段密码哈希里,$6$表示使用 SHA-512 算法,$samplesalt$是盐值,后面的长串是哈希结果。$1$是 MD5,$2a$或$2y$是 bcrypt,$5$是 SHA-256,还有$y$是 yescrypt,新版 Debian、Ubuntu 已经默认用它了。
盐值的作用是防止相同的密码产生相同的哈希。如果没有盐,攻击者可以预先算好常见密码的哈希表(就是彩虹表),拿到哈希一对比就出来了。加了盐之后,每一个用户的哈希都不同,预计算表基本失效,攻击者只能老老实实逐个跑。
理解这一点对做破解非常关键:破解工具的核心思路,就是把字典里的每个候选词用同样的算法、同样的盐值算一遍哈希,再和目标哈希比对。算法越慢,破解时间越长。MD5 在 GPU 上每秒能跑几十亿次,SHA-512 慢一些,bcrypt 刻意设计得很慢,所以用 bcrypt 加密的密码,即使用弱口令,破解成本也会高很多。
1.2 哪些场景会用到密码破解
我总结下来,正经用途主要是三类。
第一类是系统密码找回。服务器装完系统设了复杂密码,结果几个月没用忘了,或者员工离职没交接 root 密码,这时候你不能重装系统,只能通过单用户模式或者 live CD 重置密码。这类操作严格说不是“破解”,而是“重置”,但很多人搜“Linux 密码破解”其实要找的就是这个。
第二类是安全审计和渗透测试。企业内部做等保、红蓝对抗,安全团队会拿一份 hash 字典去测员工的密码强度。如果五分钟内就被跑出来的弱口令,说明该用户需要强制改密码。这种场景必须走正式授权流程,测试范围、时间、方式都要白纸黑字写清楚,否则就是违法。
第三类是取证分析。拿到一台被入侵的服务器,攻击者可能创建了后门账号,你需要尝试破解这些账号的密码来判断攻击路径和数据泄露范围。这种同样要确保自己有合法处置权。
1.3 攻击面大致分三条路
- 离线破解:已经拿到了
/etc/shadow内容(比如通过漏洞拿到了 root 权限、或者备份文件泄露),在本地用 John、hashcat 慢慢跑。优点是速度快、不产生网络流量,缺点是前提是“你已经拿到 hash”。 - 在线测试:知道目标 IP,有 SSH、RDP、Web 登录接口,用 Hydra、Medusa 这类工具去试密码。优点是不需要提前拿 hash,缺点是慢、容易被日志记录、可能触发 lockout 策略。
- 物理重置:有服务器或虚拟机的控制台权限,直接进单用户模式改密码。这是运维救命的操作,不需要猜密码,只需要能重启机器。
很多人把“破解”理解成“黑别人”,其实在运维日常里,前两类出现频率最高的反而是客户忘了密码、员工离职交接、以及内部弱口令检查。理清楚场景,你才能选对方法。
2. 工具选型与字典准备
2.1 三款主力工具怎么选
John the Ripper,圈里叫 john,老牌神器,开源免费。它支持 CPU 多核,能自动识别大部分 hash 类型,用法简单。缺点是纯 CPU 跑效率不如 GPU 工具。我在排查问题、快速验证时用 john 最多,因为它不需要额外配置,装上就能跑,而且自带小字典。
hashcat,号称世界上最快的密码恢复工具。它利用 GPU(NVIDIA、AMD)并行计算,跑 MD5、NTLM 这类算法时速度能到每秒几百亿次。缺点是配置门槛高一点,需要装显卡驱动和 OpenCL 运行时,而且对 hash 格式要求比较严格,需要知道具体算法类型。适合批量跑大字典、跑掩码、跑规则的高级玩法。
Hydra,在线密码测试工具,支持 SSH、RDP、FTP、HTTP 表单、MySQL、PostgreSQL 等几十种协议。它的逻辑是:对一个用户名,反复尝试不同的密码去登录,直到成功。速度受网络延迟限制,但胜在覆盖面广。注意:用 Hydra 测在线服务,非常容易被目标系统记录,失败次数多了还可能被封锁 IP,所以一定要控制速度,并且确认自己有权这么干。
这三者的关系,可以简单理解成:john 是瑞士军刀,什么都能干,适合在地铁上用笔记本排查;hashcat 是挖掘机,功率大,适合架好机器跑大规模任务;Hydra 是钓鱼竿,针对具体在线目标一根根试。
2.2 字典:破解的灵魂
工具再强,没有好字典等于白跑。密码破解的本质是“猜测”,字典质量直接决定成功率。常见字典来源有这几种:
- 系统自带:
/usr/share/wordlists/,Kali 里通常有 rockyou.txt 的压缩包,解压后有 1400 万条真实泄露的密码,命中率相当高。 - SecLists:GitHub 上的安全测试字典集合,包含用户名、密码、Web 路径各种分类,是渗透测试必备。
- crunch:可以按照你定义的规则生成字典,比如指定 8 位纯数字、指定前缀加生日组合,生成出来就是一个大文件。
- 规则变形:在字典基础上做替换、追加、首字母大写等变换。比如字典里有 password,规则可以生成 Password、password1、Password1、password! 等。John 和 hashcat 都支持规则,效果比单纯堆字典高一个量级。
选字典有个窍门:先跑一个小字典试水,比如 Top10w,如果命中了就皆大欢喜;如果没有,再上大字典加规则。一上来就跑 1400 万条的 rockyou 也不是不行,但耗时可能翻好几倍。
我自己的习惯是准备三层字典:第一层是 Top10000 常见弱口令,第二层是 rockyou 基础版,第三层是根据目标定制的字典(比如公司名、品牌名、域名、年份组合)。最多的一次,我在一次授权测试里用定制字典五分钟内解出了四个人的密码,而标准大字典跑了半小时才中一个。
2.3 Kali 环境准备
做密码破解不一定要用 Kali,任何发行版装 john 和 hashcat 都行,但 Kali 的优势是预装了大量安全工具,省去配置环境的时间。如果你没有合适的测试机器,装个虚拟机是成本最低的方案。
# 以 Ubuntu/Debian 为例安装 john sudo apt update sudo apt install john -y # hashcat 需要额外配置 GPU,先用 CPU 模式测试 sudo apt install hashcat -y # Kali 里这些工具默认就有,不用装记得给虚拟机至少两个 CPU 核心和 2G 以上内存,破解是纯粹的计算密集型任务,配置太低跑起来很煎熬。如果你用 hashcat 配合独显,NVIDIA 需要装nvidia-driver和nvidia-cuda-toolkit,AMD 需要rocm,这一步最容易出错,后面会讲排查方法。
3. 核心实操:三类破解/恢复流程
3.1 离线破解 shadow 文件
拿到/etc/shadow后,第一步是把用户和哈希提取成 john 认识的格式。其实 john 自带脚本可以直接读 shadow 文件:
# 先看 hash 类型 sudo head -n 3 /etc/shadow # 直接用 john 读 shadow 文件 john --format=sha512crypt /etc/shadow # 也可以只破解指定用户 john --format=sha512crypt --user=root /etc/shadowjohn 默认使用/etc/john/john.conf里的规则和字典,跑起来后会显示实时进度。如果跑完没出结果,可以指定字典:
# 使用 rockyou 字典,注意先解压 sudo gunzip /usr/share/wordlists/rockyou.txt.gz john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt /etc/shadow # 显示已破解的密码 john --show /etc/shadowhashcat 的命令稍微讲究一点,需要把 hash 提出来,加上 hash 类型标识。SHA-512 对应的 hashcat 模块号是 1800:
# 提取 root 用户 hash sudo grep '^root:' /etc/shadow | cut -d: -f1,2 > hash.txt # hashcat 跑 SHA-512,指定 rockyou 字典 hashcat -m 1800 -a 0 hash.txt /usr/share/wordlists/rockyou.txt # -a 0 表示字典攻击模式,-m 1800 表示 SHA-512 crypthashcat 成功破解后会输出明文密码,状态栏会显示Cracked。它的输出比较“酷”,新手容易看懵,记住几个关键状态就行:Status: Running表示在跑,Cracked表示成功,Exhausted表示字典跑完了但没命中。
我在实操中发现一个细节:john 对格式的容错性比 hashcat 好。有时候拿到的 shadow 文件来自不同的发行版,算法标识是$y$(yescrypt),john 能自动识别,hashcat 则需要手动查模块号,比如 yescrypt 是 20200。不确定的时候,可以先用 john 跑,john 识别不了再查 hashcat 的hashcat --example-hashes找到对应模块。
3.2 在线服务口令测试
在线测试我用得少,因为风险高、容易被发现,但作为一个运维人也应该知道怎么操作,产品上线前自测自己的服务密码强度是合理需求。以测试本机 SSH 为例:
# 安装 hydra sudo apt install hydra -y # 测试 ssh 服务的 root 密码,用户字典 u.txt,密码字典 p.txt hydra -L u.txt -P p.txt ssh://192.168.1.100 # 控制并发和速度,防止触发 lockout hydra -L u.txt -P p.txt -t 4 -w 5 ssh://192.168.1.100-t 4表示同时四个连接,-w 5表示每次等待五秒再试下一个。在线测试的瓶颈在延迟和限流,不是计算速度,开太多线程只会把自己搞得很可疑,还可能把目标机器的 SSH 服务拖挂。
这里有个重要的提醒:在线测试一定会留下日志。/var/log/auth.log里会记录来自哪个 IP、尝试了什么用户。所以如果是测试自己的服务器,测完记得清理日志,如果你是做了授权的渗透测试,建议把测试时间和来源 IP 提前告知对方运维,避免误判为攻击。
3.3 忘记 root 密码:单用户模式重置
这是运维最常遇到的情况,不涉及任何哈希破解,而是直接绕过密码验证。原理是:通过 GRUB 引导菜单进入单用户模式,此时系统以 root 权限运行一个最小环境,你可以直接修改密码或去掉密码字段。
具体步骤:
# 1. 重启系统,在 GRUB 启动菜单出现时,选中内核行,按 e 进入编辑 # 2. 找到以 linux 或 linux16 开头的行,在末尾加上 init=/bin/bash # 3. 按 Ctrl + X 或 F10 启动,系统会直接进入 bash shell # 4. 重新挂载根文件系统为可写状态 mount -o remount,rw / # 5. 修改密码 passwd root # 6. 如果只想清空密码,也可以编辑 shadow 文件去掉第二个字段 # 注意:清空密码有安全风险,不建议这么干 # 7. 重启 exec /sbin/init如果服务器有系统加固措施,比如 GRUB 设置了密码、或者使用了 SELinux 强制模式,单用户模式的操作路径会复杂一些,可能需要你先验证 GRUB 密码,然后临时修改 SELinux 策略。不同的发行版细节有差别,有的版本需要用rd.break配合 chroot 来改密码,这个思路是相通的:核心就是在根文件系统可写的情况下,用passwd命令重置密码。
UEFI 引导的主机,如果在 GRUB 菜单里看不到内核编辑选项,可能是 GRUB 菜单被隐藏了,需要在启动时按住 Shift 或 Esc 强制显示。物理机有 IPMI/KVM 的话,直接用虚拟控制台操作最方便;虚拟机就在 vSphere 或 VirtualBox 的管理界面操作,跟在现场一样。
3.4 从 Live CD 重置密码
如果单用户模式进不去,比如磁盘加密(LUKS)被锁了、或者 GRUB 完全损坏,最后一招是用安装盘或 live CD 启动,挂载原系统根目录,直接改 shadow 文件。
# 1. 用 Ubuntu/Debian 安装盘启动,选择“试用” # 2. 找到原系统的根分区,比如 lsblk 查看,假设是 /dev/sda2 sudo mount /dev/sda2 /mnt # 3. 挂载必要的文件系统 sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys # 4. chroot 进原系统 sudo chroot /mnt # 5. 重设密码 passwd root # 6. 退出并重启 exit sudo reboot这个方法唯一的难点是搞清楚根分区是哪个。用lsblk -f能看到分区和文件系统类型,有 LUKS 加密的先cryptsetup luksOpen /dev/sda2 crypto_root解密,再挂载解密后的设备。如果你不太确定,就多看几遍lsblk的输出,别急着挂载,挂错了地方改了半天发现没用,白折腾。
我客观说,LUKS 全盘加密加 GRUB 密码加 SELinux 强制,这套组合下来,物理重置这条路基本就断了。如果你运维的就是这种高安全环境,密码管理系统(比如 Vault、pass)必须提前做好,否则忘密码就是重大事故。
4. 常见问题与排查经验实录
4.1 hash 类型识别错误
这是新手最容易卡住的地方。拿到的 shadow 文件里,第二段开头是$1$、$5$、$6$、$y$、$2y$这些标识,对应不同的算法,你指定了错误的格式,john 和 hashcat 可能会直接报错或者疯狂跑但永远不匹配。
我之前碰到一台客户发给我的 shadow 文件,所有用户都是$y$开头,我用 sha512crypt 跑了一晚上没结果,后来发现是 yescrypt。DEBIAN 13 换源、新版系统默认算法常有变化,最好先确认系统版本再决定格式。john 的优势是可以直接用默认模式自动识别,所以我的建议是:遇到不确定的,先跑 john,让它自己猜。
4.2 性能瓶颈与进度判断
CPU 跑 SHA-512 的效率很感人,单核每秒大概几万次,跑一个百万级字典要好几个小时。hashcat 用 GPU 之后,每秒能到几千万甚至上亿次,差距是千倍级别。如果条件允许,强烈建议用 hashcat。
判断破解进度不要只看刷新时间,关键是看速度和剩余空间:
hashcat -m 1800 -a 0 hash.txt rockyou.txt --show # 或者用 --status 查看进度跑 Incremental(增量模式)时要小心,8 位所有可打印字符的组合是天文数字,就算 GPU 快也跑不完。实操里基本都是先跑字典,字典跑不到再上规则和掩码,掩码也设置合理的字符集,比如?d?d?d?d?d?d表示六位纯数字,范围一下就小多了。
4.3 字典命中率为什么低
很多人抱怨 rockyou 跑不出密码,这不奇怪。rockyou 是 2009 年泄露的数据,现在很多用户的密码早就不在里面了。破解效果好的组合不是纯靠字典,而是“字典 + 规则”:
# john 使用规则 john --wordlist=dict.txt --rules=All /etc/shadow # hashcat 使用规则 hashcat -m 1800 -a 0 hash.txt dict.txt --rules=best64.rule规则的本质是自动化变形。best64 规则里涵盖了最常见的 64 种变形方式,比如p表示在密码尾部加1,c表示首字母大写,d表示加数字前缀。跑完基础字典再用规则变一次,覆盖率能提升 30% 以上。还有一点,自定义字典一定要结合目标信息,比如公司域名、电话区号、关键产品名,这是我实测最有效的超车方案。
4.4 在线测试被大量错误日志淹没
Hydra 跑的时候,目标机器的/var/log/auth.log会被刷屏,有些 sshd 配置里有MaxAuthTries参数,超过次数端口会短时间封掉。我看过不少因为测试把自己 IP 封了的例子,解决思路有两个:一是放慢速度、调低并发;二是换用--fallback机制让 hydra 在检测到 lockout 时等待一段时间。千万不要把并发拉满硬刚,那样大概率什么都测不出来,还搞得对方安全告警响半天。
我把常见的失败原因整理成了一张速查表,方便你定位问题。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| john 报 unknown ciphertext format | hash 格式错误 | 检查$6$、$y$标识,改用自动识别 |
| hashcat 启动报 CL/OOM | GPU 驱动没装好或显存不足 | 重新安装 OpenCL 驱动,更换小字典 |
| 跑了一晚没结果 | 算法慢 + 字典不匹配 | 改用规则、掩码、定制字典 |
| Hydra 总是 Fail | 目标启用了锁账户策略 | 放慢速度,提前和对方沟通 |
| 单用户模式找不到磁盘 | 根文件系统是 LVM/LUKS | 用 lsblk 确认,chroot 前挂载 /boot |
shadow 文件内容全是!或* | 该用户被锁定或禁用登录 | 检查passwd -S状态 |
4.5 小心 rate limiting 与并发陷阱
在线测试的另一个隐藏坑是对端可能配置了速率限制。简单的fail2ban就能让你的 IP 被禁掉。我的建议永远是这样:在线测试前,先跑一个非常小的字典(比如 3 到 5 个候选密码),用合法账号自己登录一次确认服务正常,再正式开跑。测试中定期看日志,不要把所有宝押在一次全速爆破上,测试本质上是慢工出细活的事。
5. 防御视角:怎么让密码更难被攻破
5.1 从源头上提高密码强度
破解难度的核心是熵足够。一个 6 位纯数字密码,即使加了 bcrypt,也有被擦中的概率;而一个 16 位随机且包含大小写数字符号的密码,破解成本高到让对方直接放弃。
密码策略建议:
- 密码长度不少于 12 位,越长越重要。长度增加一位,破解时间呈指数级增长。
- 避免用键盘序列、生日、手机号、公司名等可预测信息,这些是定制字典的重点攻击目标。
- 不同主机用不同密码,尤其不要用同一个密码管所有服务器。
- 能用密钥登录就不要用密码,SSH 的密码登录默认可以关。
5.2 利用 PAM 和系统策略控制口令生命周期
Linux 原生就有 PAM(可插拔认证模块),可以通过配置限制密码复杂度、过期时间、重复使用次数。/etc/pam.d/common-password里可以加上密码强度检查规则,/etc/login.defs里可以设置密码有效期。
# 编辑 /etc/pam.d/common-password # 密码最短长度 12,强制包含数字和特殊字符 password requisite pam_pwquality.so minlen=12 dcredit=-1 ocredit=-1 # 登录失败策略,连续 5 次失败锁定登录 15 分钟 auth required pam_faillock.so deny=5 unlock_time=900如果你刚上手,建议先用pam_pwquality做基础强度校验,同时用faillock做登录失败锁定。这样即使密码被猜测,攻击者的尝试次数也会被限制,跑在线破解的效率会大打折扣。
5.3 弱口令自动化审计
与其等攻击者来破解,不如自己先扫一遍。思路是写一个脚本,定期把/etc/shadow导出到安全环境用同样工具检查,命中弱口令就强制用户改密码。这个方案在企业内部很有价值,也是我目前做得最多的安全运维工作之一。
#!/bin/bash # 简单的弱口令检查脚本,配合 cron 每周跑一次 # 注意:导出的 shadow 文件必须严格保管,避免二次泄露 sudo cp /etc/shadow /tmp/audit_shadow sudo chmod 600 /tmp/audit_shadow john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt /tmp/audit_shadow john --show /tmp/audit_shadow # 把结果定向发送给安全负责人,发现有弱口令再联系对应同事这里必须强调:你自身写出来的这类脚本,审计的对象是公司授权的服务器,跑完的 hash 文件要及时删除,不要留在临时目录里。安全审计的本质是控制风险,自己却不能制造新的泄露点。
5.4 服务层面的加固
除了密码本身,还要减少攻击面:
- SSH 开启
PermitRootLogin no,用普通用户加 sudo 提权。 - 配置 fail2ban 自动封禁恶意 IP。
- 开启审计日志
auditd,记录关键命令执行。 - 重要服务器尽量关闭密码登录,改用 SSH 密钥或证书。
我做过的安服项目里,很多服务器不是被爆破了密码,而是密码登录端口暴露到公网,MySQL、Redis 等服务的弱口令被打穿。密码破解只是入口,后续的横向移动、提权才是真正的威胁,所以防守思路一定是纵深防御,而不是指望密码不被猜中。
最后再说点实际的
做这一行久了,我对“密码破解”这四个字的态度变得很复杂。它既是我帮客户找回系统、排查弱口令的日常工具,也是每次做安全演练时最需要谨慎对待的能力。密码这种东西,真正的风险往往不是算法不够强,而是使用者嫌麻烦。我在实际运维中见过太多123456、P@ssw0rd、Admin@123,甚至把密钥写在桌面文本文件里的。工具和命令只是手段,你心里得有一杆秤——什么时候该用、能不能用、用了之后怎么处理数据,这些问题比命令本身重要得多。
最后分享一个小技巧:如果你偶尔需要记忆大量服务器密码,不要再用明文表格了,改为用pass(基于 GPG 的密码管理器)配合团队共享,不仅每个密码可以独立随机生成,审计起来也清晰。破解和防护的攻防永远不会停,但在工作中守住边界、把自己系统的“锁”做得比隔壁强一点,就已经赢下了大多数场景。