提取和破解 Linux Shadow 文件中的哈希

Kali LinuxBeginner
立即练习

引言

在本实验中,你将学习 Linux 密码安全审计的基本流程。你将探索 Linux 如何存储用户密码信息,提取这些信息,然后尝试使用字典攻击来破解密码。这个过程对于渗透测试人员和系统管理员识别和修复系统中的弱密码至关重要。

你将使用两个关键文件:/etc/passwd,它存储用户账户信息;/etc/shadow,它安全地存储哈希后的密码。你将使用标准的 Linux 命令行工具和专门的软件,如 unshadow (来自 John the Ripper 套件) 和 Hashcat 来执行破解过程。

在本实验结束时,你将获得以下方面的实践经验:

  • 理解 /etc/shadow 文件的格式。
  • 将用户和密码数据合并为可破解的格式。
  • 识别密码哈希类型。
  • 使用 Hashcat 执行字典攻击。

理解 /etc/shadow 文件格式

在此步骤中,你将检查 /etc/shadow 文件。此文件存储 Linux 系统上用户的实际密码哈希值,出于安全原因,只有 root 用户才能读取。理解其结构是提取哈希值的首要步骤。

首先,使用 sudo 获取查看 /etc/shadow 文件内容的必要权限。

sudo cat /etc/shadow

你将看到包含多行的输出,每行对应一个用户账户。让我们看看我们创建的 testuser 的条目。它看起来会是这样的(salt 和 hash 会有所不同):

root:*:19327:0:99999:7:::
daemon:*:19327:0:99999:7:::
...
testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:19422:0:99999:7:::

每行都是一系列由冒号分隔的字段。对于本实验,我们关注前两个字段:

  1. 用户名testuser
  2. 哈希密码$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1

哈希字段中的美元符号 ($) 非常重要。前两个 $ 字符之间的数字表示哈希算法。在这种情况下,$6$ 表示密码是使用 sha512crypt 算法哈希的。

使用 unshadow 工具合并 passwd 和 shadow 文件

在此步骤中,你将使用 unshadow 工具创建一个适合 Hashcat 等密码破解工具的单一文件。破解工具需要 /etc/passwd 中的用户名和 /etc/shadow 中的哈希值,并且需要特定的格式。unshadow 工具是 John the Ripper 套件的一部分,它自动化了这个合并过程。

你现在将运行 unshadow,将 /etc/passwd/etc/shadow 作为输入,并将输出重定向到你的 ~/project 目录下的一个名为 hashes.txt 的新文件中。

在你的终端中执行以下命令:

sudo unshadow /etc/passwd /etc/shadow > ~/project/hashes.txt

此命令读取两个系统文件,合并相关信息,并将其保存到 ~/project/hashes.txt

现在,让我们查看新创建的文件内容,看看结果。

cat ~/project/hashes.txt

输出将显示用户列表及其对应的哈希值,格式是破解工具所期望的。testuser 的那一行将如下所示:

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:1001:1001::/home/testuser:/bin/bash

此文件现在已准备好与 Hashcat 一起使用。

识别哈希类型 (例如 sha512crypt)

在此步骤中,你将确认用户密码所使用的哈希类型。这是一个关键步骤,因为你必须准确告知 Hashcat 在破解尝试中要使用的哈希算法。错误的算法将永远无法成功。

正如我们在步骤 1 中观察到的,哈希字符串本身的格式就揭示了算法。让我们再次检查 hashes.txt 文件。

cat ~/project/hashes.txt

关注 testuser 的哈希字符串:

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:...

哈希以 $6$ 开头。这是特定类型哈希的标准标识符。以下是常见 Linux 哈希标识符的快速参考:

  • $1$ = md5crypt (MD5)
  • $2a$$2y$ = bcrypt (Blowfish)
  • $5$ = sha256crypt (SHA-256)
  • $6$ = sha512crypt (SHA-512)

基于 $6$ 前缀,我们可以确信地将哈希类型识别为 sha512crypt。这是我们在下一步需要的信息。

选择对应的 Hashcat 模式

在此步骤中,你将找到 Hashcat 用于识别 sha512crypt 算法的正确模式编号。Hashcat 支持数百种不同的哈希类型,每种类型都被分配了一个唯一的模式编号。

要查找 sha512crypt 的模式,你可以使用 grep 搜索 Hashcat 的帮助信息。这是一种有效的方法,可以在不阅读整个帮助菜单的情况下找到你需要的特定模式。

运行以下命令搜索 sha512crypt

hashcat --help | grep -i sha512crypt

grep 中的 -i 标志使搜索不区分大小写,这是一个好习惯。输出将显示帮助菜单中的匹配行:

...
1800 | sha512crypt, SHA512(Unix)                  | Operating System
...

从这个输出中,你可以看到 sha512crypt 的模式编号是 1800。你将在最后一步中使用此模式编号来告诉 Hashcat 如何解释 hashes.txt 文件中的哈希。

对 Linux 哈希发起字典攻击

在此最终步骤中,你将使用 Hashcat 对捕获的哈希发起字典攻击。字典攻击的工作原理是:获取一份潜在密码列表(一个“字典”或“单词列表”),使用与目标哈希相同的算法对每个密码进行哈希处理,然后比较结果。如果找到匹配项,则密码已被破解。

你将使用在实验设置期间下载到 ~/project 目录中的 rockyou.txt 单词列表。这是密码审计中非常常用的单词列表。

现在,使用你收集到的所有信息构建完整的 Hashcat 命令:

  • 模式 (-m): 1800,用于 sha512crypt
  • 哈希文件: ~/project/hashes.txt
  • 单词列表: ~/project/rockyou.txt
  • 选项 (--force): 添加此选项是为了防止在虚拟化环境或使用某些驱动程序运行 Hashcat 时可能出现的错误。

执行命令以开始攻击:

hashcat -m 1800 --force ~/project/hashes.txt ~/project/rockyou.txt

Hashcat 将初始化并开始破解会话。由于密码 password123 存在于 rockyou.txt 列表中,因此过程应该非常快。

...
Session..........: hashcat
Status...........: Running
Hash.Name........: sha512crypt, SHA512(Unix)
Hash.Target......: testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn...
...
Approaching final keyspace - workload adjusted.

Session..........: hashcat
Status...........: Cracked
...

一旦 Hashcat 显示状态为 Cracked(已破解)或 Exhausted(已穷尽),攻击就完成了。要查看破解的密码,你可以使用 --show 选项执行相同的命令。

hashcat -m 1800 --force ~/project/hashes.txt --show

输出将清晰地显示破解的哈希及其对应的明文密码。

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:password123

你已成功破解 testuser 的密码!

总结

恭喜你完成了本次实验!你已成功地在 Linux 系统上执行了一个经典的密码审计工作流程。

在本次实验中,你学习了如何:

  • 阅读和理解 /etc/shadow 文件的结构,该文件存储用户密码哈希。
  • 使用 unshadow 工具将 /etc/passwd/etc/shadow 中的用户和哈希数据合并到一个文件中。
  • 通过检查哈希格式来识别密码哈希算法 (sha512crypt)。
  • 在 Hashcat 中找到已识别哈希类型的对应模式 (1800)。
  • 使用 Hashcat、一个强大的单词列表和提取的哈希发起字典攻击。
  • 查看成功破解的密码。

这个练习展示了使用强壮、复杂且不常见于通用单词列表中的唯一密码的重要性。系统管理员可以利用这些相同的技术来主动发现并修复其环境中的弱密码。