引言
在本实验中,你将探索使用强大的工具 John the Ripper 来提取、准备和破解 Linux 密码哈希(password hashes)的过程。理解密码破解的工作原理对于实施强大的安全措施至关重要。你将了解 /etc/shadow 文件,如何将其与 /etc/passwd 结合创建可破解文件,然后使用 John the Ripper 查找弱密码。最后,你将深入了解 shadow 文件的结构以及在 Linux 系统上保护用户密码的最佳实践。
提取 /etc/shadow 文件
在此步骤中,你将学习如何访问和提取 /etc/shadow 文件的内容。/etc/shadow 文件存储着加密的用户密码和其他安全相关信息。由于其敏感性,只有 root 用户才能读取此文件。在本实验中,我们在你的 ~/project 目录中创建了虚拟的 passwd_dummy 和 shadow_dummy 文件,以模拟真实文件,而无需 root 权限直接访问 /etc/shadow。
首先,让我们查看虚拟的 passwd_dummy 文件内容。此文件包含基本的用户账户信息,但不包含密码哈希。
cat ~/project/passwd_dummy
你应该会看到类似以下的输出:
root:x:0:0:root:/root:/bin/bash
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash
testuser:x:1001:1001:Test User,,,:/home/labex/testuser:/bin/bash
接下来,让我们查看虚拟的 shadow_dummy 文件内容。此文件包含实际的密码哈希。
cat ~/project/shadow_dummy
你应该会看到类似以下的输出,其中第二个字段是哈希后的密码:
root:$6$rounds=40000$abcdefghijklmnop$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./:18000:0:99999:7:::
labex:$6$rounds=40000$fedcba9876543210$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./:18000:0:99999:7:::
testuser:$6$rounds=5000$testsalt$testpasswordhash:18000:0:99999:7:::
在实际场景中,你通常会使用 sudo cat /etc/shadow 来提取 shadow 文件,但在此实验中,我们将使用虚拟文件。
Unshadow 密码文件
在此步骤中,你将使用 unshadow 工具,它是 John the Ripper 套件的一部分,将 passwd_dummy 和 shadow_dummy 文件合并为一个 John the Ripper 可以处理的单一文件。unshadow 工具将密码文件中的用户信息与 shadow 文件中的密码哈希合并,创建一个适合破解的统一格式。
执行以下命令,将 passwd_dummy 和 shadow_dummy 合并到你的 ~/project 目录中一个名为 unshadowed.txt 的新文件中:
unshadow ~/project/passwd_dummy ~/project/shadow_dummy > ~/project/unshadowed.txt
现在,让我们查看新创建的 unshadowed.txt 文件内容,以了解其格式。
cat ~/project/unshadowed.txt
你应该会看到输出,其中每行都以用户名开头,后跟密码哈希,然后是其他用户信息。例如:
root:$6$rounds=40000$abcdefghijklmnop$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./:0:0:root:/root:/bin/bash
labex:$6$rounds=40000$fedcba9876543210$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./:1000:1000:LabEx User,,,:/home/labex:/bin/bash
testuser:$6$rounds=5000$testsalt$testpasswordhash:1001:1001:Test User,,,:/home/labex/testuser:/bin/bash
这个 unshadowed.txt 文件现在已准备好供 John the Ripper 用于密码破解。
使用 John the Ripper 破解 Shadow 哈希
在此步骤中,你将使用 John the Ripper 来破解 unshadowed.txt 文件中包含的密码哈希。John the Ripper 可以执行多种类型的攻击,包括字典攻击,即尝试使用预定义列表中的单词。在设置过程中,我们已经在你的 ~/project 目录中创建了一个名为 wordlist.txt 的简单单词列表。
执行以下命令,使用 wordlist.txt 文件开始破解密码:
john --wordlist=~/project/wordlist.txt ~/project/unshadowed.txt
John the Ripper 将尝试破解哈希。如果找到匹配项,它将显示破解出的密码。在我们的虚拟文件中,testuser 的密码很弱,并且存在于 wordlist.txt 中。
你应该会看到类似以下的输出,表明密码已被破解:
Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts to test (sha512crypt, crypt(3) $6$)
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
testpassword (testuser)
3g 0:00:00:00 DONE (2024-01-01 12:00) 100.0% (ETA: 00:00:00) 3.000g/s 180.0p/s 180.0c/s 180.0C/s testpassword
Session completed.
破解完成后,你可以使用 --show 选项查看 John the Ripper 找到的已破解密码:
john --show ~/project/unshadowed.txt
此命令将显示会话中所有成功破解的密码。
testuser:testpassword
1 password hash cracked, 2 left
这演示了使用现成的工具和单词列表可以多么容易地破解弱密码。
理解 Shadow 文件格式
在此步骤中,你将深入了解 /etc/shadow 文件中各字段的结构和含义。理解这种格式对于理解 Linux 如何安全地存储和管理用户密码信息至关重要。
/etc/shadow 文件每行代表一个用户,每行包含九个由冒号分隔的字段。让我们重新审视一下我们 shadow_dummy 文件中的一行:
testuser:$6$rounds=5000$testsalt$testpasswordhash:18000:0:99999:7:::
以下是每个字段的详细说明:
- 用户名:
testuser- 用户的登录名。 - 加密密码:
$6$rounds=5000$testsalt$testpasswordhash- 这是最关键的字段。它包含哈希后的密码。$6指示使用的哈希算法(在此例中为 SHA-512)。其他常见类型包括$1(MD5)、$2a(Blowfish)、$5(SHA-256)。rounds=5000指定哈希轮数,这增加了破解的计算成本。testsalt是盐值(salt),是在哈希密码之前添加的随机字符串,用于防止彩虹表攻击。testpasswordhash是实际的哈希密码。
- 上次密码更改时间:
18000- 自 1970 年 1 月 1 日以来上次更改密码的天数。 - 最小密码年龄:
0- 两次密码更改之间所需的最小天数。值为0表示用户可以随时更改密码。 - 最大密码年龄:
99999- 密码有效的最大天数。超过此期限后,用户将被强制更改密码。99999通常表示密码永不过期。 - 密码过期警告期:
7- 用户将在密码过期前多少天收到警告。 - 密码不活动期:(空) - 密码过期后账户将被禁用的天数。如果为空,则账户因密码不活动而永远不会被禁用。
- 账户过期日期:(空) - 账户将被禁用的日期(自 1970 年 1 月 1 日以来的天数)。如果为空,则账户永不过期。
- 保留字段:(空) - 此字段保留供将来使用。
理解这些字段有助于配置密码策略和增强系统安全性。
实施 Shadow 文件安全最佳实践
在此步骤中,你将学习并理解在 Linux 系统上保护 /etc/shadow 文件和用户密码的最佳实践。鉴于 shadow 文件的敏感性,保护它是系统安全的首要任务。
以下是一些关键的最佳实践:
强密码策略:
- 复杂度:强制执行强密码复杂度要求(例如,最小长度、大小写字母、数字和特殊字符的组合)。
- 唯一性:防止用户重复使用旧密码。
- 定期更改:实施定期更改密码的策略,尽管现代安全建议有时倾向于为非特权账户使用长而强的唯一密码,而不是频繁更改。
- 密码短语:鼓励使用长密码短语而不是简短、复杂的密码,因为密码短语通常更容易记住且更难破解。
文件权限:
/etc/shadow文件应具有非常严格的权限:0640(-rw-r-----)。这意味着只有root可以读取和写入它,而shadow组的成员可以读取它。其他用户不应有访问权限。- 使用
ls -l /etc/shadow验证权限(在真实系统中,而不是我们的虚拟文件中)。
哈希算法:
- 始终使用现代、强大的哈希算法,如 SHA-512 (
$6) 或 Blowfish ($2a,$2b,$2y)。避免使用较旧、较弱的算法,如 MD5 ($1) 或 DES。 - 确保你系统的
PAM(Pluggable Authentication Modules) 配置设置为使用强大的哈希算法。
- 始终使用现代、强大的哈希算法,如 SHA-512 (
**加盐 (Salting)**:
- 始终为每个密码使用唯一的盐值。这由现代哈希算法自动处理,并可防止彩虹表攻击。
账户锁定策略:
- 实施账户锁定策略以防止暴力破解攻击。在一定次数的登录失败尝试后,账户应被暂时锁定。
监控可疑活动:
- 定期监控系统日志,查找异常的登录尝试或对
/etc/shadow文件的修改。AIDE或Tripwire等工具可以检测文件完整性更改。
- 定期监控系统日志,查找异常的登录尝试或对
用户教育:
- 教育用户关于强密码、唯一密码的重要性以及网络钓鱼和社交工程的风险。
通过实施这些最佳实践,你可以显著增强用户账户的安全性,并保护你 Linux 系统上的敏感密码信息。
总结
在此次实验中,你通过 John the Ripper 在 Linux 系统上获得了密码破解的实践经验。你学会了如何使用 unshadow 提取并合并 /etc/passwd 和 /etc/shadow 文件,然后使用 John the Ripper 和字典文件来破解弱密码哈希。此外,你还探索了 /etc/shadow 文件的详细格式,理解了每个字段的意义,特别是哈希算法和盐值。最后,你回顾了保护用户密码和 shadow 文件必不可少的最佳实践,包括强密码策略、正确的文件权限以及使用强大的哈希算法。这些知识对于进攻性安全(理解系统如何被攻破)和防御性安全(实施措施以防范此类攻击)都至关重要。


