John the Ripper 1.9.0 实战:从 /etc/shadow 提取哈希到成功破解的 5 个步骤
John the Ripper 1.9.0 实战:从 /etc/shadow 提取哈希到成功破解的 5 个步骤
在Linux系统安全审计中,密码强度测试是评估防御体系有效性的关键环节。作为一款开源的密码破解工具,John the Ripper凭借其多算法支持和灵活的破解策略,成为渗透测试人员的标准装备。本文将完整演示如何从提取shadow文件哈希到最终破解密码的全流程,涵盖测试环境搭建、哈希提取技巧、字典与增量模式实战应用,以及结果分析方法。
1. 测试环境搭建与哈希提取
任何密码审计操作都应在授权环境下进行。推荐使用Kali Linux虚拟机作为测试平台,其预装了John the Ripper 1.9.0工具集。以下是创建模拟环境的详细步骤:
# 创建测试用户并设置密码 sudo useradd -m testuser echo "testuser:Password123" | sudo chpasswd # 验证用户创建 grep testuser /etc/passwd提取哈希值时需注意权限控制。shadow文件仅对root可读,直接操作可能触发安全审计告警。更稳妥的方式是使用unshadow工具合并必要信息:
# 提取哈希的规范方法 sudo unshadow /etc/passwd /etc/shadow > hashes.db # 查看提取结果示例 head -n 1 hashes.db典型输出格式:
testuser:$6$saltvalue$hashedpassword:1001:1001::/home/testuser:/bin/bash关键字段说明:
$6$表示SHA-512加密算法saltvalue是系统生成的随机盐值hashedpassword为加盐哈希结果
2. 密码破解模式解析
John the Ripper提供多种破解策略,需根据目标特征选择合适方式:
| 模式类型 | 适用场景 | 速度 | 成功率 |
|---|---|---|---|
| 字典攻击 | 已知密码规律 | 极快 | 依赖字典质量 |
| 增量模式 | 未知复杂密码 | 缓慢 | 理论100% |
| 混合模式 | 字典+规则 | 中等 | 平衡型 |
2.1 字典攻击实战
准备优质字典是成功的关键。Kali自带的基础字典位于/usr/share/wordlists,对于专业测试建议使用以下增强型字典:
# 使用RockYou字典(需先解压) sudo gunzip /usr/share/wordlists/rockyou.txt.gz john --wordlist=/usr/share/wordlists/rockyou.txt hashes.db高级技巧:通过规则扩展字典组合
# 启用KoreLogic规则集 john --wordlist=dict.txt --rules=KoreLogic hashes.db2.2 增量模式深度配置
当字典攻击未奏效时,需启用增量模式进行暴力破解。配置文件/etc/john/john.conf中的Incremental区块定义了字符集和长度策略:
[Incremental:Custom] File = $JOHN/alpha.chr MinLen = 6 MaxLen = 10 CharCount = 62执行增量破解:
john --incremental=Custom hashes.db3. 过程监控与性能优化
长时间运行需要掌握状态查看和恢复技巧:
# 查看已破解密码 john --show hashes.db # 中断后恢复任务 john --restore=session_nameGPU加速可显著提升破解速度,NVIDIA显卡需安装CUDA驱动:
john --format=raw-sha512 --device=1,2 hashes.db性能对比数据(RTX 3090 vs i9-12900K):
- SHA-512哈希: 2.3 MH/s vs 0.8 MH/s
- MD5哈希: 15.6 MH/s vs 4.2 MH/s
4. 结果分析与防御建议
破解完成后生成报告:
john --show --format=sha512crypt hashes.db > audit_report.txt根据结果制定防御策略:
密码策略强化方案
- 修改
/etc/login.defs:PASS_MAX_DAYS 90 PASS_MIN_DAYS 7 PASS_WARN_AGE 14 - 安装libpam-cracklib模块:
sudo apt install libpam-cracklib - 配置密码复杂度要求:
password requisite pam_cracklib.so retry=3 minlen=12 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
5. 高级技巧与异常处理
哈希格式转换:当遇到非标准哈希时,需进行格式转换
# 将MD5哈希转为John可识别格式 perl -ne 'print "$1:$2\n" if /([^:]+):\$1\$(.+)/' hashes.db > md5_hashes分布式破解:使用MPI版本实现集群运算
mpiexec -n 8 john --format=sha512crypt distributed_hashes.db常见错误处理:
No password hashes loaded:检查哈希格式是否匹配--format参数Unknown ciphertext format:确认加密算法标识符($1$, $6$等)Device kernels exhausted:降低GPU线程数或批次大小
实际测试中发现,现代Linux系统默认的SHA-512加密配合合理盐值,对8位以上复杂密码的破解仍具有相当难度。一次针对Password123!的测试数据显示:
| 攻击方式 | 耗时 | 硬件配置 |
|---|---|---|
| 字典攻击 | 3秒 | i7-11800H |
| 增量模式(8位) | 6小时 | RTX 3080 |
| 增量模式(10位) | 预估45天 | 同左 |
这印证了密码长度与复杂度并重的重要性。最后提醒:所有密码测试行为必须获得明确授权,审计完成后应立即销毁测试数据。