浅析Linux下SUID提权

Linux下SUID提权入门

什么是SUID

说到suid提取,就必须先要解释下什么是suidsuid全称为Set owner User ID up on execution,通过字面的意思也可以理解:在执行时设置所有者用户的id。这是Linux给可执行文件的一个属性,suid权限仅对二进制可执行文件有效。

SUID作用

通常来说,Linux执行程序是以当前用户权限来运行,但对于一些特殊的指令,就需要用到suid权限。例如普通用户修改个人密码需要用到passwd命令,我们知道/etc/passwd文件中每一行都存储着用户的一些基本属性,如用户名、口令、用户标识号、组标识号、注释性描述、主目录、登录Shell等信息,通过passwd命令修改密码也会对/etc/passwd文件进行修改,查看下/etc/passwd文件权限:

1
2
admin@kali:/$ ls -al /etc/passwd
-rw-r--r-- 1 root root 3328 4月 22 01:15 /etc/passwd

可以看出,/etc/passwd文件对所有用户可读,但只允许root用户写入。但在实际修改密码的过程中,并不需要转为root权限或使用sudo命令,查看下passwd命令:

1
2
admin@kali:/$ ls -al $(which passwd)
-rwsr-xr-x 1 root root 63736 7月 27 2018 /usr/bin/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
2
3
4
5
6
7
8
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u=s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
>表示重定向
/dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。

image-20200422141217111

利用SUID提权

这里直接使用VulnHub上的靶机来做演示,靶机地址:

1
https://www.vulnhub.com/entry/dc-1,292/

此靶机的渗透流程这里就不做具体介绍,可参考如下文章:

1
https://www.freebuf.com/articles/network/218073.html

在使用msf的shell命令获取一个交互式shell后,发现当前用户为www-datawww-data是默认运行web服务的用户/组,一般在通过apt安装web服务程序时生成。

image-20200422154354642

这里的www-data权限较低,只能执行部分操作,使用find / -perm -u=s -type f 2>/dev/null查找设置为suid权限的命令。

image-20200422154530824

重点关注/usr/bin/find命令,他是用来在指定目录下查找文件的命令。使用man help命令查看find的具体使用方式,发现存在-exec参数:

image-20200422160357025

这个参数主要作用是方便查找结束的后续操作,它的终止是以 ; 为结束标志的,利用此参数进行suid提权:

image-20200422165707326

其他命令

Nmap

较旧版本的Nmap(5.20之前)带有interactive交互模式允许用户执行shell命令,因此可以通过这个模式来提权,如下:

1
2
3
nmap> !sh
# whoami
root

针对5.20之后版本,网上有说可以通过加载自定义script的方式来执行命令,在本地进行测试,并没有提权,结果与P神文章中的结论一致,有关无法提权的具体原因可查看如下文章:

1
https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html

image-20200422171253930

Bash

使用bash -p命令将以root身份打开一个bash shell。

image-20200422173655213

Less

less 与 more 类似,都适用于查看文件内容。

1
2
less /etc/passwd
!/bin/sh

更多

上面提到的命令都是可直接提权为root的,有些设置suid的命令虽无法直接提权,但可获取重要的系统信息,如cat命令读取敏感文件,cp命令用来替换/etc/sudoers文件来间接提权。因此在实际的提权过程中要有灵活的思路,有时候可通过组合拳的方式来达到提权的目的。

更多利用方式参考如下链接:

1
https://gtfobins.github.io/

小结

假如作为系统的运维人员,要严格的查看被设置suid权限的二进制文件,是否有必要进行提权后操作。如果不可避免的需要root权限来进行操作,设置suid虽然可行,但不满足权限最小化的要求,也有可能带来安全问题。从Linux内核 2.2 开始,Linux 将传统上与超级用户 root 关联的特权划分为不同的单元,称为capabilites,root的权限被分隔成很多子权限,这就避免了滥用特权的问题。

类似于pingnmap这样的程序,只需要网络相关的特权即可。通过capabilities机制来划分权限,可以看到在kali系统下,ping命令就没有设置suid权限,普通用户依然可以使用。

假如作为渗透测试人员,可以利用suid的特性提权或者留下后门。如将usermod命令设置suid权限,将/bin/bash命令复制为一个隐藏文件并设置suid权限,等等。

参考

1
2
https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
https://www.anquanke.com/post/id/86979
Author: Sys71m
Link: https://www.sys71m.top/2020/04/28/浅析Linux下SUID提权/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.