Linux shadow 哈希破解
拿到 Linux 主机的 passwd 与 shadow 后,离线破解是恢复明文口令最直接的路径。shadow 中的哈希是加盐慢哈希,不可逆,只能用候选明文逐个验证;效率取决于格式识别是否正确与字典是否贴合目标。
准备哈希文件
passwd 与 shadow 都可读时,先合并成 John 认识的格式:
unshadow passwd shadow > hashes.txt
只有 passwd 可读时也有机会:历史配置会把哈希直接放在 passwd 第二字段而非 shadow,这类配置下哈希可以直接拿走,不需要 unshadow。
识别哈希格式
看第二字段的前缀:
| 前缀 | 算法 | hashcat 模式 |
|---|---|---|
$6$ | sha512crypt | -m 1800 |
$1$ | md5crypt | -m 500 |
$y$ | yescrypt | 较新发行版的默认算法 |
root:$6$saltstring$...:0:0:root:/root:/bin/bash
John 破解
john 能自动识别大部分格式:
john --wordlist=rockyou.txt hashes.txt
自动识别异常时显式指定格式:
john --format=md5crypt --wordlist=rockyou.txt hashes.txt
hashcat 破解
hashcat -m 1800 hashes.txt rockyou.txt # sha512crypt
hashcat -m 500 hashes.txt rockyou.txt # md5crypt
Web 应用侧哈希的对应玩法见 PHPass 哈希与 Hashcat 模式 400。
候选明文复核
哈希不可逆,任何"破解结果"都应作为候选明文复核一遍:
# sha512crypt:用同样的盐重算,与 shadow 中哈希比对
openssl passwd -6 -salt <盐> '<候选明文>'
# 无盐 MD5:直接摘要比对
echo -n '<候选>' | md5sum
echo -n 的换行坑在 MD5 换行符哈希破解 有专门说明。
复核要点
unshadow合并前确认两份文件来自同一台主机,否则盐与用户对不上。$y$(yescrypt)在旧版 john/hashcat 上可能不支持,先确认工具版本。- 破解出弱口令后,优先验证它是否在其他服务上复用,继续横向。
防御建议
- 使用 yescrypt、argon2 等现代口令哈希算法,淘汰 md5crypt 与 sha512crypt。
/etc/shadow权限收敛为640且属主root:shadow。- 实施口令策略:最小长度、复杂度与定期轮换。
- 监控
passwd/shadow的异常读取,例如 Web 进程读取 shadow。 - 口令疑似泄露后立即全局轮换,防止复用扩散。