环境变量提权实验
环境变量提权
PATH
是Linux和Unix操作系统中的环境变量,它指定所有存储可执行程序的bin和sbin目录。
当用户在终端中执行任何命令时,它会通过PATH变量来响应用户执行的命令,并向shell发送请求以搜索可执行文件。
超级用户通常还具有/sbin
和/usr/sbin
目录,以便系统管理命令的执行。
环境变量的执行优先级是从前向后查询的,所以当前后两个目录拥有同名命令时,只会执行前面目录中的命令。
环境搭建
以root用户搭建模拟环境。
编辑c语言脚本
vim shell.c
#include <unistd.h>
void main(){
setuid(0);
setgid(0);
system("ps");
}
脚本意思:以root权限执行ps命令。
编译c语言脚本
gcc shell.c -o shell #编译shell.c文件,编译后的文件名称为shell
添加SUID权限
说明:部分脚本可能会出现一些命令必须使用root权限来执行的情况。但是管理比较严格的公司不允许随便使用root权限来管理服务器,就会导致普通用户创建的文件会出现无法执行的情况。这时就会使用root用户给文件添加一个SUID权限,来使得脚本在执行时默认使用root权限来执行。
chmod +s shell #给shell文件添加SUID权限
同时将该文件移动到/tmp
路径下。
mv shell /temp/
提权操作
切换回普通用户。
查找SUID权限文件
find / -perm -u=s -type f 2>/dev/null
find
:搜索符合条件的文件或目录。/
:从根目录开始搜索。-perm
:用于指定权限条件;-u=s
:表示搜索设置了用户ID(SUID)位的文件。
-type
:用于指定文件类型;f
:表示搜索普通文件。
2
:标准错误输出(stderr,文件描述符为2);>/dev/null
重定向到/dev/null,是一个特殊的设备文件,也被称为“空设备”、“黑洞”,写入的文件都会被系统丢弃,永远无法找回。
综上所述,该命令的作用是在整个文件系统中搜索具有SUID权限的普通文件,并忽略因权限问题而产生的错误消息。
发现一个shell文件,在tmp路径下。
- 拥有SUID权限
- 在普通用户权限路径下
尝试执行搜索到的脚本
┌──(root㉿kali)-[/]
└─# ./tmp/shell
PID TTY TIME CMD
10816 pts/0 00:00:00 su
10833 pts/0 00:00:01 zsh
16860 pts/0 00:00:00 shell
16861 pts/0 00:00:00 sh
16862 pts/0 00:00:00 ps
发现脚本是执行ps命令。
找找是否存在相关源码(shell.c),或者为了避免脚本影响一些服务,可以将其进行反编译查看里面是什么内容。
查看脚本源码
分析环境变量
默认情况下执行ps是执行/bin/ps
,同时这里设定的ps并不是通过绝对路径来执行的,而是通过环境变量执行的。此时可以考虑对环境变量进行劫持。
查看环境变量
echo $PATH
劫持环境变量
提权需要用到bash,所以需要
- 将
/bin/bash
复制到环境变量第一个目录下 - 且改名为脚本中对应的
ps
以便bash会被以管理员权限执行。
将任意目录添加到环境变量第一位
export PATH=路径:$PATH #从头添加
export PATH=$PATH:路径 #从尾添加
export PATH=/tmp:$PATH #将tmp目录添加为环境目录的第一位
将改名后的bash放在第一个环境目录下
cp /bin/bash /tmp/ps
执行脚本
./shel
总结
整体的原因就是由于开始管理员给予shell就是SUID权限,同时shell是一个执行脚本,通过对其反编译或者寻找源码,来判断脚本里面所调用的命令是什么。然后根据这个命令将bash修改成对应的命令名称,同时添加环境变量,根据环境变量的特性,让其优先寻找到我们将bash修改后的命令名称,让其执行的ps命令成为执行bash。而shell恰巧是SUID权限也就是root权限执行,那么root权限去执行bash就能够进行提权