Linux下SUID提权入门
什么是SUID
说到suid
提取,就必须先要解释下什么是suid
。suid
全称为Set owner User ID up on execution
,通过字面的意思也可以理解:在执行时设置所有者用户的id。这是Linux
给可执行文件的一个属性,suid
权限仅对二进制可执行文件有效。
SUID作用
通常来说,Linux
执行程序是以当前用户权限来运行,但对于一些特殊的指令,就需要用到suid
权限。例如普通用户修改个人密码需要用到passwd
命令,我们知道/etc/passwd
文件中每一行都存储着用户的一些基本属性,如用户名、口令、用户标识号、组标识号、注释性描述、主目录、登录Shell等信息,通过passwd
命令修改密码也会对/etc/passwd
文件进行修改,查看下/etc/passwd
文件权限:
1 | admin@kali:/$ ls -al /etc/passwd |
可以看出,/etc/passwd
文件对所有用户可读,但只允许root
用户写入。但在实际修改密码的过程中,并不需要转为root
权限或使用sudo
命令,查看下passwd
命令:
1 | admin@kali:/$ ls -al $(which passwd) |
一般来说,大部分文件对权限的划分可分为r
可读、w
可写、x
可执行这三种权限。通过查看passwd
命令发现,文件拥有者的x
权限变为了s
权限,这里的s
权限就是上面提到的suid
权限。
当文件的拥有者的x
权限被设为s
权限时,其他用户在执行该二进制文件时便会临时被赋予文件拥有者的权限,这里的passwd
命令的拥有者为root
用户,这也就解释了为什么普通用户修改密码时不需要切换为root
用户或者使用sudo
命令。
这里先总结下使用suid
权限的一些限制:
suid
权限仅对二进制可执行文件有效- 执行者需要对该文件具有
x
权限 suid
权限仅在执行过程中有效- 执行者将具有该文件拥有者的权限
除了passwd
命令设为了suid
权限,还可通过find / -perm -u=s -type f 2>/dev/null
命令查找具有suid
权限的命令。
1 | /表示从文件系统的顶部(根)开始并找到每个目录 |
利用SUID提权
这里直接使用VulnHub上的靶机来做演示,靶机地址:
1 | https://www.vulnhub.com/entry/dc-1,292/ |
此靶机的渗透流程这里就不做具体介绍,可参考如下文章:
1 | https://www.freebuf.com/articles/network/218073.html |
在使用msf的shell
命令获取一个交互式shell后,发现当前用户为www-data
,www-data
是默认运行web服务的用户/组,一般在通过apt安装web服务程序时生成。
这里的www-data
权限较低,只能执行部分操作,使用find / -perm -u=s -type f 2>/dev/null
查找设置为suid
权限的命令。
重点关注/usr/bin/find
命令,他是用来在指定目录下查找文件的命令。使用man help
命令查看find的具体使用方式,发现存在-exec
参数:
这个参数主要作用是方便查找结束的后续操作,它的终止是以 ;
为结束标志的,利用此参数进行suid
提权:
其他命令
Nmap
较旧版本的Nmap
(5.20之前)带有interactive
交互模式允许用户执行shell命令,因此可以通过这个模式来提权,如下:
1 | !sh |
针对5.20之后版本,网上有说可以通过加载自定义script的方式来执行命令,在本地进行测试,并没有提权,结果与P神文章中的结论一致,有关无法提权的具体原因可查看如下文章:
1 | https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html |
Bash
使用bash -p
命令将以root身份打开一个bash shell。
Less
less 与 more 类似,都适用于查看文件内容。
1 | less /etc/passwd |
更多
上面提到的命令都是可直接提权为root的,有些设置suid
的命令虽无法直接提权,但可获取重要的系统信息,如cat
命令读取敏感文件,cp
命令用来替换/etc/sudoers
文件来间接提权。因此在实际的提权过程中要有灵活的思路,有时候可通过组合拳的方式来达到提权的目的。
更多利用方式参考如下链接:
1 | https://gtfobins.github.io/ |
小结
假如作为系统的运维人员,要严格的查看被设置suid
权限的二进制文件,是否有必要进行提权后操作。如果不可避免的需要root权限来进行操作,设置suid
虽然可行,但不满足权限最小化的要求,也有可能带来安全问题。从Linux内核 2.2 开始,Linux 将传统上与超级用户 root 关联的特权划分为不同的单元,称为capabilites
,root的权限被分隔成很多子权限,这就避免了滥用特权的问题。
类似于ping
和nmap
这样的程序,只需要网络相关的特权即可。通过capabilities
机制来划分权限,可以看到在kali
系统下,ping
命令就没有设置suid
权限,普通用户依然可以使用。
假如作为渗透测试人员,可以利用suid
的特性提权或者留下后门。如将usermod
命令设置suid
权限,将/bin/bash
命令复制为一个隐藏文件并设置suid
权限,等等。
参考
1 | https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html |