用户与身份


Linux 启明道场.

你以为自己,也就是 hacker,是这台机器中唯一的用户吗? 典型的 Linux 系统中有很多用户! Linux 系统的完整用户列表记录在 /etc/passwd 文件中(这个名字源于历史原因;现在它已经不存储密码了)。 下面是 dojo 容器中的一个例子:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:101:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
mysql:x:104:105:MySQL Server,,,:/nonexistent:/bin/false
messagebus:x:105:106::/nonexistent:/usr/sbin/nologin
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
hacker:x:1000:1000::/home/hacker:/bin/bash

用户真不少,信息也很丰富! 每行用 : 分隔各个字段,依次是用户名、一个 x(作为占位符,表示这里曾经存储密码;稍后会介绍密码现在存在哪里)、数字形式的用户 ID、数字形式的默认组 ID、用户的详细信息、主目录,以及默认 shell。

列表最后可以看到 hacker 用户。 这就是你! 其他用户大多是出于历史原因保留下来的账号、用于支持各种已安装软件的服务账号,或者某些“工具”账号(例如,nobody 用户用于确保某些程序运行时不具备任何特殊权限)。

其中一个重要用户是 root,也就是系统管理员。 系统管理员身份显然关系到系统安全:如果 hacker 用户通过 Linux 的某些功能变成了 root 用户,就能对系统造成严重破坏。 入侵系统的攻击者经常以提升权限、成为 root 为目标,因此必须竭尽所能保护 root!

本模块将探索各种与用户身份有关的操作,学习管理系统时正规切换用户的方法,并在过程中享受探索的乐趣!


需要成为 root 的并不只有攻击者。 作为计算机的拥有者,你也经常需要使用 root 权限来管理它。 切换为 root 是 Linux 用户常做的操作,有两个工具专门用于此目的:su 和 sudo。

这一关将介绍其中较早出现的工具 su(即 substitute user,意为切换用户,名称取自 s 和 u 这两个首字母)。 如今,人们通常已经不再用它获取 root 权限,但它是一款来自早期时代的优雅工具,所以我们先介绍它。

su 是一个设置了 setuid 的二进制程序:

hacker@dojo:~$ ls -l /usr/bin/su
-rwsr-xr-x 1 root root 232416 Dec 1 11:45 /usr/bin/su
hacker@dojo:~$

由于设置了 SUID 位,su 会以 root 身份运行。 以 root 身份运行的程序,自然可以启动一个 root shell! 当然,su 会进行检查:允许用户提升权限成为 root 之前,它会确认用户知道 root 的密码:

hacker@dojo:~$ su
Password: 
su: Authentication failure
hacker@dojo:~$

恰恰是对 root 密码的检查,让 su 逐渐退出了主流系统管理方式。 现代系统很少设置 root 密码,而是使用其他机制(后面会学到)授予管理权限。

不过,这一关(也只有这一关)确实设置了 root 密码。 密码是 hack-the-planet,你必须把它提供给 su,才能成为 root! 去试试,然后读取 flag 吧!

不带参数时,su 会启动一个 root shell(前提是通过 root 密码验证)。 不过,你也可以把用户名作为参数传给它,切换到指定用户,而不是 root。 例如:

hacker@dojo:~$ su some-user
Password:
some-user@dojo:~$

很方便吧! 在这一关中,你必须切换到 zardus 用户,然后运行 /challenge/run。 zardus 的密码是 dont-hack-me。 祝你好运!

向 su 输入密码时,它会将输入与该用户存储的密码信息进行比较。 这些密码信息曾经存放在 /etc/passwd 中,但由于 /etc/passwd 是所有用户都能读取的文件,不适合存放密码信息,因此后来移到了 /etc/shadow。 下面是上一关中的 /etc/shadow 示例:

root:$6$s74oZg/4.RnUvwo2$hRmCHZ9rxX56BbjnXcxa0MdOsW2moiW8qcAl/Aoc7NEuXl2DmJXPi3gLp7hmyloQvRhjXJ.wjqJ7PprVKLDtg/:19921:0:99999:7:::
daemon:*:19873:0:99999:7:::
bin:*:19873:0:99999:7:::
sys:*:19873:0:99999:7:::
sync:*:19873:0:99999:7:::
games:*:19873:0:99999:7:::
man:*:19873:0:99999:7:::
lp:*:19873:0:99999:7:::
mail:*:19873:0:99999:7:::
news:*:19873:0:99999:7:::
uucp:*:19873:0:99999:7:::
proxy:*:19873:0:99999:7:::
www-data:*:19873:0:99999:7:::
backup:*:19873:0:99999:7:::
list:*:19873:0:99999:7:::
irc:*:19873:0:99999:7:::
gnats:*:19873:0:99999:7:::
nobody:*:19873:0:99999:7:::
_apt:*:19873:0:99999:7:::
systemd-timesync:*:19901:0:99999:7:::
systemd-network:*:19901:0:99999:7:::
systemd-resolve:*:19901:0:99999:7:::
mysql:!:19901:0:99999:7:::
messagebus:*:19901:0:99999:7:::
sshd:*:19901:0:99999:7:::
hacker::19916:0:99999:7:::
zardus:$6$bEFkpM0w/6J0n979$47ksu/JE5QK6hSeB7mmuvJyY05wVypMhMMnEPTIddNUb5R9KXgNTYRTm75VOu1oRLGLbAql3ylkVa5ExuPov1.:19921:0:99999:7:::

每行以 : 分隔,第一个字段是用户名,第二个字段是密码信息。 值为 * 或 !,实际上表示该账号已禁用密码登录;字段为空,表示没有设置密码(这是一种并不少见的配置错误,在某些配置下,会允许无需密码就使用 su)。像 zardus 的 $6$bEFkpM0w/6J0n979$47ksu/JE5QK6hSeB7mmuvJyY05wVypMhMMnEPTIddNUb5R9KXgNTYRTm75VOu1oRLGLbAql3ylkVa5ExuPov1. 这样的长字符串,则是对上一关中 zardus 的密码(本例中为 dont-hack-me)进行单向转换(哈希计算)后的结果。 文件中的其他字段各有含义,你可以在这里进一步了解。

向 su 输入密码时,它会对输入进行单向转换(哈希计算),并将结果与存储的值比较。 如果结果一致,su 就允许你切换到该用户!

但如果你不知道密码呢? 只要拿到了密码的哈希值,就有可能破解密码! 虽然 /etc/shadow 默认只有 root 能读取,但泄露仍然可能发生! 例如,文件服务器上的备份经常没有加密,保护措施也不充分,这已经造成了无数次数据泄露。

如果攻击者拿到了泄露的 /etc/shadow,就可以开始破解密码,进而破坏系统。 破解可以使用著名的 John the Ripper,如下所示:

hacker@dojo:~$ john ./my-leaked-shadow-file
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Will run 32 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password1337      (zardus)
1g 0:00:00:22 3/3 0.04528g/s 10509p/s 10509c/s 10509C/s lykys..lank
Use the "--show" option to display all of the cracked passwords reliably
Session completed
hacker@dojo:~$

这里,John the Ripper 破解了泄露的 zardus 密码哈希,找到了真实密码 password1337。 可怜的 zardus!

本关模拟了这一情景,为你提供了一份泄露的 /etc/shadow(位于 /challenge/shadow-leak)。 破解它(可能需要几分钟),用 su 切换为 zardus,再运行 /challenge/run,获取 flag!

过去,典型的 Linux 系统会设置一个 root 密码。管理员先用普通账号的密码登录,再通过 su 切换为 root。 但 root 密码维护起来很麻烦,密码本身(甚至密码哈希!)可能泄露,而且不适合较大的环境,例如大量服务器组成的集群。 为了解决这些问题,近几十年来,系统管理逐渐从 su 转向了 sudo(小知识:sudo 最初是 superuser do 的缩写,取自 su 和 do,意为以超级用户身份执行;后来改为“su 'do'”。由于 su 表示 substitute user,sudo 现在的含义是“切换用户并执行”)。

su 默认会以指定用户身份启动一个 shell;sudo 则默认以 root 身份运行一条命令:

hacker@dojo:~$ whoami
hacker
hacker@dojo:~$ sudo whoami
root
hacker@dojo:~$

下面这个例子,与获取 flag 的场景更接近:

hacker@dojo:~$ grep hacker /etc/shadow
grep: /etc/shadow: Permission denied
hacker@dojo:~$ sudo grep hacker /etc/shadow
hacker:$6$Xro.e7qB3Q2Jl2sA$j6xffIgWn9xIxWUeFzvwPf.nOH2NTWNJCU5XVkPuONjIC7jL467SR4bXjpVJx4b/bkbl7kyhNquWtkNlulFoy.:19921:0:99999:7:::
hacker@dojo:~$

su 依赖密码验证,而 sudo 会检查策略,判断用户是否有权以 root 身份执行命令。 这些策略定义在 /etc/sudoers 中。虽然本课程基本不会展开这部分内容,但有很多学习资料可以参考!

因此,在系统管理方面,人们已经转向 sudo,逐渐不再使用 su。 实际上,连 pwn.college 的特权模式也是通过授予你 sudo 权限来实现提权的!

在这一关中,我们会给你 sudo 权限,你需要用它读取 flag。 轻松又简单!


注意: 完成本关后,我们将启用特权模式! 在工作区中,点击闭合的锁图标,即可将挑战重新启动到特权模式;点击打开的锁图标,则可返回普通模式。 启用特权模式时,终端提示符中的主机名以 ~practice 结尾。 特权模式会授予你完整的 sudo 权限,便于查看内部情况和调试,但该模式提供的是无法提交的占位 flag。


30天排行榜:

此排行榜反映本模块在道场上线后各挑战的解出情况。

排名 黑客 徽章 得分
暂无解题排行数据 —— 注册账号并完成挑战即可登上榜单!