共享体现协作,而 Linux 的设计本身就支持共享。
文件既有所属的用户,也有所属的组。
一个组可以包含多个用户,一个用户也可以属于多个组。
你可以使用 id 命令,查看自己属于哪些组:
hacker@dojo:~$ id
uid=1000(hacker) gid=1000(hacker) groups=1000(hacker)
hacker@dojo:~$
这里,hacker 用户只属于 hacker 组。
用户组最常见的用途,是控制对不同系统资源的访问。
例如,pwn.college 的“特权模式”会给你 root 权限,方便调试等操作。
它的实现方式是:在特权模式下启动时,将你加入一个额外的组:
hacker@dojo:~$ id
uid=1000(hacker) gid=1000(hacker) groups=1000(hacker),27(sudo)
hacker@dojo:~$
典型 Linux 桌面系统的主要用户通常属于很多组。
例如,下面是 zardus 的桌面系统:
zardus@yourcomputer:~$ id
uid=1000(zardus) gid=1000(zardus) groups=1000(zardus),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev),114(bluetooth),117(lpadmin),120(scanner),995(docker)
zardus@yourcomputer:~$
这些组让 zardus 能够读取光盘和软盘(现在还有谁用软盘呢?)、管理系统、播放音乐、向显示器输出图像、使用蓝牙等。
这种访问控制通常通过文件系统中的组所有权来实现!
例如,可以通过特殊文件 /dev/fb0 输出图像:
zardus@yourcomputer:~$ ls -l /dev/fb0
crw-rw---- 1 root video 29, 0 Jun 30 23:42 /dev/fb0
zardus@yourcomputer:~$
这是一个特殊的设备文件(类型 c 表示“字符设备”)。与它交互会改变显示输出,而不是像普通文件那样改变磁盘中的存储内容!
zardus 在自己机器上的用户账号能与这个文件交互,是因为文件的所属组为 video,而 zardus 是 video 组的成员。
不过,在 dojo 环境中,面对 /flag 文件,就没有这么幸运了!
看看下面的情况:
hacker@dojo:~$ id
uid=1000(hacker) gid=1000(hacker) groups=1000(hacker)
hacker@dojo:~$ ls -l /flag
-r--r----- 1 root root ... /flag
hacker@dojo:~$ cat /flag
cat: /flag: Permission denied
hacker@dojo:~$
这里,flag 文件归 root 用户和 root 组所有,而 hacker 用户既不是 root 用户,也不是 root 组的成员,所以无法访问该文件。
好在可以使用 chgrp 命令更改文件的所属组!它的名称来自 change group(更改组)中的 ch、gr 和 p。
除非你既是文件所有者,又是新组的成员,否则通常需要 root 权限。我们以 root 身份来看看:
root@dojo:~# mkdir pwn_directory
root@dojo:~# touch college_file
root@dojo:~# ls -l
total 4
-rw-r--r-- 1 root root 0 May 22 13:42 college_file
drwxr-xr-x 2 root root 4096 May 22 13:42 pwn_directory
root@dojo:~# chgrp hacker college_file
root@dojo:~# ls -l
total 4
-rw-r--r-- 1 root hacker 0 May 22 13:42 college_file
drwxr-xr-x 2 root root 4096 May 22 13:42 pwn_directory
root@dojo:~#
在这一关中,我们将 flag 设置为所属组可读,但它当前的所属组是 root。
好在我们也允许你以 hacker 用户身份调用 chgrp!
更改 flag 文件的所属组,然后读取 flag 吧!