0X00 前言

几个月之前写的那篇 搭建docker的 CTF getshell环境 由于其中写了一句:“因为这里涉及到权限的问题,比较复杂,我会更新这篇文章或者新开一篇文章”,期间也有很多人问我这个问题,于是还是决定亲自再测试一下,搞一搞这里面权限应该怎么设置,为什么要这样设置,也算是给自己和他人一个交代,谁让我承诺了呢?

0X01 Linux下的权限管理

1.基本概念

权限是操作系统用来限制资源访问的机制,权限一般分为读、写、执行。Linux 系统中每个文件都拥有自己所属用户及所属组,并且通过10个字符表明了那些用户和用户组能有权对该文件进行哪些操作。

注意:

(1)每个进程都是以某个用户的身份运行,所以进程的权限与该用户的权限一样,用户的权限越大,该进程所拥有的权限也就越大。
(2)文件的所属用户就是创建文件的用户(或者说创建文件的进程所属的用户),文件的所属组就是文件的所属用户所在的组
(3)如果我们无法改变用户的访问权限(实际上通常情况下无法改变),我们控制权限的实质实际上就转化成了改变文件的所属,这样其他用户组的用户就对该文件没有了访问权限
(4)Linux 中每一个用户都必须属于一个用户组,无一例外

2.常用的命令

我们在Linux 中有一些比较常用的查看当前进程所属用户和用户组的命令

1.cat /etc/group

查看当前有哪些用户组存在

root@8235174cc513:/var/www/html# cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:
floppy:x:25:
tape:x:26:
sudo:x:27:
audio:x:29:
dip:x:30:
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
ssl-cert:x:101:

2.groups

查看当前进程所属用户所在的用户组

root@8235174cc513:/var/www/html# groups
root

这说明我现在所在的进程的所属用户是 root 组的,如果想看是属于这个组中的什么用户可以使用 whoami

(www-data:/var/www/html) $ groups
www-data

这个就是说明我启动这个进程的用户所属的组是 www-data

那比如说我想在 www-data 组中添加一个用户

useradd -g www-data K0rz3n

然后我们将我们的用户切换到 K0rz3n

su K0rz3n

然后我们看一下 whoami 和 groups 的结果

$ whoami
K0rz3n

$ groups
www-data

当然我们可以指定用户去查看其所属的用户组

root@8235174cc513:/# groups K0rz3n
K0rz3n : www-data

注意:

除了 groups 以外 id 这个命令也有着和 groups 一样的效果,如下所示

root@8235174cc513:/# id
uid=0(root) gid=0(root) groups=0(root)
root@8235174cc513:/# id K0rz3n
uid=1000(K0rz3n) gid=33(www-data) groups=33(www-data)

3.ls -la

这个命令能查看当前目录中所有文件的属主和属组,并且能根据最前面的 10个字符判断其他组的用户对当前文件所拥有的权限

root@8235174cc513:/var/www/html# ls -la
total 16
drwxr-xr-x 2 root root 4096 Nov  7 06:23 .
drwxr-xr-x 3 root root 4096 Nov  7 05:55 ..
-rw-r--r-- 1 root root   32 Nov  7 06:23 index.php
-rw-r--r-- 1 root root   29 Nov  7 06:23 qweasdzxc.php

解释一下两个 root

其中这两个 root 的前一个表示这个文件属于 root 用户组,后一个表示这个文件属于 root 用户所有,连起来就是这个文件的归属为 root 用户组下面的 root 用户

然后解释一下前面的10个字符

(1)第一个字符表示这个文件的属性 是目录(d) 文件(-) 还是连接(l) 还是块设备(b) 等
(2)后面三个字符表示的是这个文件的拥有者(也就是两个 root 的后一个) 对这个文件的操作权限
(3)中间三个字符表示的是与这个文件的拥有者在同一个用户组的用户对这个文件的操作权限
(4)最后三个字符表示的是其他用户组中的用户对这个文件的操作权限

我为什么把“对这个文件的操作权限”几个字加粗,实际上我想表达的是,我们所谓的控制权限实质上就是改变文件的属组和属主,让他和想操作这个文件的用户所起的进程不是一个用户,不在一个属组,然后再对这个文件配置 755 或者 644 之类的权限,剥夺其他用户组的用户的修改权限或者执行权限,这样就达到了我们控制权限的目的

0X02 如何控制 Shell 的权限

上面说那么多关于权限的问题,我们还是回归到我们的 Shell 上面来,我们首先可以自己测试一下 Shell 的权限,使用 whoami ,我发现是 www-data 权限,查了一下资料,发现 php-fpm 似乎默认就是 www-data 的权限

然后如果我们的 web 目录的所属用户就是 www-data 的话,那就比较危险,但是往往不是这样的,我看了一下我的 web 目录的所属组合用户都是 root ,也就是说它和我们的 shell 的用户所在的用户组根本不一样 ,那我们只要控制好三个数字中的最后一个为 4 就比较安全了,然后我看了一下文件权限设置为 644 ,这样就完全不用设置。

但是如果真的你的 web 目录的所属用户和 Shell 所属的用户真的就是一个的话,那么一定要对 web 目录的文件的所属用户和用户组进行修改(毕竟我们没法改变 shell 的权限,我们只能选择修改 web 目录的权限),这里使用我上一篇文章的方法就好了。

0X03 总结

对于权限问题,其实并没有相像的复杂,只要沉下心来稍微分析一下就很快能弄清楚啦,这篇文章也算是了了我的一个心愿。