使用 John the Ripper 破解 Linux Shadow 密码

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索使用强大的工具 John the Ripper 来提取、准备和破解 Linux 密码哈希(password hashes)的过程。理解密码破解的工作原理对于实施强大的安全措施至关重要。你将了解 /etc/shadow 文件,如何将其与 /etc/passwd 结合创建可破解文件,然后使用 John the Ripper 查找弱密码。最后,你将深入了解 shadow 文件的结构以及在 Linux 系统上保护用户密码的最佳实践。

提取 /etc/shadow 文件

在此步骤中,你将学习如何访问和提取 /etc/shadow 文件的内容。/etc/shadow 文件存储着加密的用户密码和其他安全相关信息。由于其敏感性,只有 root 用户才能读取此文件。在本实验中,我们在你的 ~/project 目录中创建了虚拟的 passwd_dummyshadow_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_dummyshadow_dummy 文件合并为一个 John the Ripper 可以处理的单一文件。unshadow 工具将密码文件中的用户信息与 shadow 文件中的密码哈希合并,创建一个适合破解的统一格式。

执行以下命令,将 passwd_dummyshadow_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:::

以下是每个字段的详细说明:

  1. 用户名testuser - 用户的登录名。
  2. 加密密码$6$rounds=5000$testsalt$testpasswordhash - 这是最关键的字段。它包含哈希后的密码。
    • $6 指示使用的哈希算法(在此例中为 SHA-512)。其他常见类型包括 $1 (MD5)、$2a (Blowfish)、$5 (SHA-256)。
    • rounds=5000 指定哈希轮数,这增加了破解的计算成本。
    • testsalt 是盐值(salt),是在哈希密码之前添加的随机字符串,用于防止彩虹表攻击。
    • testpasswordhash 是实际的哈希密码。
  3. 上次密码更改时间18000 - 自 1970 年 1 月 1 日以来上次更改密码的天数。
  4. 最小密码年龄0 - 两次密码更改之间所需的最小天数。值为 0 表示用户可以随时更改密码。
  5. 最大密码年龄99999 - 密码有效的最大天数。超过此期限后,用户将被强制更改密码。99999 通常表示密码永不过期。
  6. 密码过期警告期7 - 用户将在密码过期前多少天收到警告。
  7. 密码不活动期:(空) - 密码过期后账户将被禁用的天数。如果为空,则账户因密码不活动而永远不会被禁用。
  8. 账户过期日期:(空) - 账户将被禁用的日期(自 1970 年 1 月 1 日以来的天数)。如果为空,则账户永不过期。
  9. 保留字段:(空) - 此字段保留供将来使用。

理解这些字段有助于配置密码策略和增强系统安全性。

实施 Shadow 文件安全最佳实践

在此步骤中,你将学习并理解在 Linux 系统上保护 /etc/shadow 文件和用户密码的最佳实践。鉴于 shadow 文件的敏感性,保护它是系统安全的首要任务。

以下是一些关键的最佳实践:

  1. 强密码策略

    • 复杂度:强制执行强密码复杂度要求(例如,最小长度、大小写字母、数字和特殊字符的组合)。
    • 唯一性:防止用户重复使用旧密码。
    • 定期更改:实施定期更改密码的策略,尽管现代安全建议有时倾向于为非特权账户使用长而强的唯一密码,而不是频繁更改。
    • 密码短语:鼓励使用长密码短语而不是简短、复杂的密码,因为密码短语通常更容易记住且更难破解。
  2. 文件权限

    • /etc/shadow 文件应具有非常严格的权限:0640 (-rw-r-----)。这意味着只有 root 可以读取和写入它,而 shadow 组的成员可以读取它。其他用户不应有访问权限。
    • 使用 ls -l /etc/shadow 验证权限(在真实系统中,而不是我们的虚拟文件中)。
  3. 哈希算法

    • 始终使用现代、强大的哈希算法,如 SHA-512 ($6) 或 Blowfish ($2a, $2b, $2y)。避免使用较旧、较弱的算法,如 MD5 ($1) 或 DES。
    • 确保你系统的 PAM (Pluggable Authentication Modules) 配置设置为使用强大的哈希算法。
  4. 加盐 (Salting)

    • 始终为每个密码使用唯一的盐值。这由现代哈希算法自动处理,并可防止彩虹表攻击。
  5. 账户锁定策略

    • 实施账户锁定策略以防止暴力破解攻击。在一定次数的登录失败尝试后,账户应被暂时锁定。
  6. 监控可疑活动

    • 定期监控系统日志,查找异常的登录尝试或对 /etc/shadow 文件的修改。AIDETripwire 等工具可以检测文件完整性更改。
  7. 用户教育

    • 教育用户关于强密码、唯一密码的重要性以及网络钓鱼和社交工程的风险。

通过实施这些最佳实践,你可以显著增强用户账户的安全性,并保护你 Linux 系统上的敏感密码信息。

总结

在此次实验中,你通过 John the Ripper 在 Linux 系统上获得了密码破解的实践经验。你学会了如何使用 unshadow 提取并合并 /etc/passwd/etc/shadow 文件,然后使用 John the Ripper 和字典文件来破解弱密码哈希。此外,你还探索了 /etc/shadow 文件的详细格式,理解了每个字段的意义,特别是哈希算法和盐值。最后,你回顾了保护用户密码和 shadow 文件必不可少的最佳实践,包括强密码策略、正确的文件权限以及使用强大的哈希算法。这些知识对于进攻性安全(理解系统如何被攻破)和防御性安全(实施措施以防范此类攻击)都至关重要。