Web安全入门与靶场实战(30)- 什么是SUID

时间:2023-02-08 15:06:51

在上个靶机中,我们介绍了sudo提权。sudo主要是用来给普通用户分配权限,在当前靶机中我们虽然也获取了系统Shell,但这个Shell是通过网站获取的。通过命令提示符也可以看出来,当前所使用的用户是“www-data”:

Web安全入门与靶场实战(30)- 什么是SUID

这是一个用来支撑Web服务程序运行的程序用户,像这种用户并没有登录系统的权限,也无需设置密码,更不会被配置sudo授权。所以在这种情况下,基本不用考虑利用sudo来提权。

这里再介绍一种提权方式——suid提权,照例还是先介绍一下什么是suid。

什么是SUID

SUID是Linux系统中的一种特殊权限。

我们知道在Linux系统中有三种普通权限:读r、写w、执行x,如果用数字表示的话,r、w、x分别对应了数字4、2、1。

除了这三种普通权限之外,在Linux中还有三种特殊权限:suid、sgid、sbit,它们对应的数字也分别是4、2、1。

既然被称为特殊权限,所以它们肯定是在特殊情况才使用的。这三个特殊权限中的sgid和sbit主要是跟运维相关,我们就不去介绍了,在安全领域中主要是涉及suid。

那SUID到底是做什么用的呢?其实它的名字已经很直观地表达了自己的作用。SUID就是“switch user ID”,通过这个特殊权限,可以临时切换用户身份,当然肯定是把普通用户切换到root用户,所以才会被用来提权。

SUID权限专门针对所有者设置,权限字符为“s”,被设置了SUID权限的文件,所有者对应权限位置的“x”将变为“s”。

例如查看passwd命令所对应的程序文件的属性信息,可以发现所有者root的权限是rws,这就表示被设置了suid权限。

[root@localhost    ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 217 2012 /usr/bin/passwd

因为/usr/bin/passwd被设置了SUID权限,这样当任何用户执行passwd命令时,就会自动切换到文件所有者root,然后以root用户的身份去执行passwd。

为什么需要让所有的用户都以root用户的身份去执行passwd命令呢?

这是因为利用passwd命令为用户设置密码,这个操作必然需要去修改/etc/shadow文件,而查看/etc/shadow文件的权限可以发现,任何用户对它都没有任何权限(当然root用户除外):

[root@localhost    ~]# ll /etc/shadow
----------. 1 root root 1118 12

只有root用户才有权去修改/etc/shadow文件,因而如果希望让普通用户也能执行passwd命令来为自己设置密码,那么就必须得临时为他赋予root权限。

因而,SUID通常都是针对可执行的程序文件而设置的,所有的用户在执行这些程序文件所对应的命令时,都将临时具有root权限。

在查看/bin、/sbin和/usr/bin目录中的文件时,可以发现有好多文件使用了红色底纹,这些文件便是被设置了SUID权限。

系统中常见的已经设置了SUID权限的可执行文件还包括以下这些:

[root@localhost ~]# ll /bin/su /bin/mount /bin/ping
-rwsr-xr-x. 1 root root 34904 417 2012 /bin/su
-rwsr-xr-x. 1 root root 76056 46 2012 /bin/mount
-rwsr-xr-x. 1 root root 40760 322 2011 /bin/ping

这些具有SUID权限的程序文件都是由系统默认设置的,我们一般无需去改动。而且由于SUID权限会改变用户身份,因而一般不建议我们自己去设置SUID,如果胡乱设置SUID,那么很可能会产生严重的安全隐患。