window.cnblogsConfig = { webpageTitleOnblur: '404-页面丢失', } window.cnblogsConfig = { webpageTitleOnblurTimeOut: 500, }

环境变量提权实验

环境变量提权

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权限的普通文件,并忽略因权限问题而产生的错误消息。

image-20241112214609220

发现一个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),或者为了避免脚本影响一些服务,可以将其进行反编译查看里面是什么内容。

查看脚本源码

image-20241112214708831

分析环境变量

默认情况下执行ps是执行/bin/ps,同时这里设定的ps并不是通过绝对路径来执行的,而是通过环境变量执行的。此时可以考虑对环境变量进行劫持。

查看环境变量

echo $PATH

image-20241112214755280

劫持环境变量

提权需要用到bash,所以需要

  • /bin/bash复制到环境变量第一个目录下
  • 且改名为脚本中对应的ps以便bash会被以管理员权限执行。

将任意目录添加到环境变量第一位

export PATH=路径:$PATH  #从头添加
export PATH=$PATH:路径  #从尾添加
export PATH=/tmp:$PATH  #将tmp目录添加为环境目录的第一位

image-20241112214835039

将改名后的bash放在第一个环境目录下

cp /bin/bash /tmp/ps

执行脚本

./shel

image-20241112220219297

总结

整体的原因就是由于开始管理员给予shell就是SUID权限,同时shell是一个执行脚本,通过对其反编译或者寻找源码,来判断脚本里面所调用的命令是什么。然后根据这个命令将bash修改成对应的命令名称,同时添加环境变量,根据环境变量的特性,让其优先寻找到我们将bash修改后的命令名称,让其执行的ps命令成为执行bash。而shell恰巧是SUID权限也就是root权限执行,那么root权限去执行bash就能够进行提权

posted @ 2024-11-12 22:04  憂心如惔  阅读(3)  评论(0编辑  收藏  举报