Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
PwnKit-Exploit — استغلال لإثبات المفهوم مكتوب بلغة سي لـ CVE-2021-4034 (PwnKit) يتيح تصعيد الامتيازات المحلية عبر كتابة خارج الحدود في pkexec. يتضمن تعليمات البناء وشرح الثغرة. | Kitploit
أدوات/GitHubGitHub/luijait/pwnkit-exploit
تصعيد الامتيازاتتحليل الثغرات الأمنيةالاستغلالاختبار الاختراق
GitHubluijait/pwnkit-exploit

PwnKit-Exploit

استغلال لإثبات المفهوم مكتوب بلغة سي لـ CVE-2021-4034 (PwnKit) يتيح تصعيد الامتيازات المحلية عبر كتابة خارج الحدود في pkexec. يتضمن تعليمات البناء وشرح الثغرة.

عرض المستودع
9818منذ 4 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

PwnKit-Exploit

CVE-2021-4034

PolKit

@c0br40x ساعد في إنشاء هذا القسم في README!!

إثبات المفهوم

Proof of Concept

root@kitploit:~
debian@debian:~/PwnKit-Exploit$ make
cc -Wall    exploit.c   -o exploit
debian@debian:~/PwnKit-Exploit$ whoami
debian
debian@debian:~/PwnKit-Exploit$ ./exploit
Current User before execute exploit
hacker@victim$whoami: debian
Exploit written by @luijait (0x6c75696a616974)
[+] Enjoy your root if exploit was completed succesfully
root@debian:/home/debian/PwnKit-Exploit# whoami
root
root@debian:/home/debian/PwnKit-Exploit# 

الإصلاح

Commandالاستخدام
sudo chmod 0755 pkexecإصلاح CVE 2021-4034

التثبيت والاستخدام

git clone https://github.com/luijait/PwnKit-Exploit

cd PwnKit-Exploit

make

./exploit

whoami

Commandالغرض
make cleanتنظيف البناء لاختبار الكود المعدل

الشرح

مأخوذ من مدونة blog.qualys.com

دالة main() في بداية pkexec تعالج وسائط سطر الأوامر (الأسطر 534-568)، وتبحث عن البرنامج المراد تنفيذه، إذا لم يكن مساره مطلقًا، في أدلة متغير البيئة PATH (الأسطر 610-640):

root@kitploit:~

435 main (int argc, char *argv[])
436 {
...
534   for (n = 1; n < (guint) argc; n++)
535     {
...
568     }
...
610   path = g_strdup (argv[n]);
...
629   if (path[0] != '/')
630     {
...
632       s = g_find_program_in_path (path);
...
639       argv[n] = path = s;
640     }

لسوء الحظ، إذا كان عدد وسائط سطر الأوامر argc يساوي 0 – مما يعني أن قائمة الوسائط argv التي نمررها إلى execve() فارغة، أي {NULL} – فإن argv[0] يكون NULL. هذا هو فاصل قائمة الوسائط. لذلك:

  • في السطر 534، يتم تعيين العدد الصحيح n بشكل دائم إلى 1؛
  • في السطر 610، يتم قراءة المؤشر path خارج الحدود من argv[1]؛
  • في السطر 639، يتم كتابة المؤشر s خارج الحدود إلى argv[1].

ولكن ما الذي يُقرأ ويُكتب بالضبط من argv[1] خارج الحدود هذا؟

للإجابة على هذا السؤال، يجب أن نستطرد قليلاً. عندما ننفذ execve() برنامجًا جديدًا، تقوم النواة بنسخ وسائطنا وسلاسل البيئة والمؤشرات (argv و envp) إلى نهاية مكدس البرنامج الجديد؛ على سبيل المثال:

root@kitploit:~
|---------+---------+-----+------------|---------+---------+-----+------------| 
| 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 متجاورة في الذاكرة، إذا كان argc يساوي 0، فإن argv[1] خارج الحدود هو في الواقع envp[0]، المؤشر إلى أول متغير بيئة لدينا، "value". وبالتالي:

  • في السطر 610، يُقرأ مسار البرنامج المراد تنفيذه خارج الحدود من argv[1] (أي envp[0])، ويشير إلى "value"؛
  • في السطر 632، يتم تمرير هذا المسار "value" إلى g_find_program_in_path() (لأن "value" لا يبدأ بشرطة مائلة، في السطر 629)؛
  • ثم، تبحث g_find_program_in_path() عن ملف قابل للتنفيذ باسم "value" في أدلة متغير البيئة PATH لدينا؛
  • إذا تم العثور على ملف قابل للتنفيذ، يتم إرجاع مساره الكامل إلى دالة main() في pkexec (في السطر 632)؛
  • أخيرًا، في السطر 639، يتم كتابة هذا المسار الكامل خارج الحدود إلى argv[1] (أي envp[0])، وبالتالي يتم استبدال متغير البيئة الأول لدينا.

إذاً، بشكل أكثر دقة:

  • إذا كان متغير البيئة PATH لدينا هو "PATH=name"، وإذا كان الدليل "name" موجودًا (في دليل العمل الحالي) ويحتوي على ملف قابل للتنفيذ باسم "value"، فسيتم كتابة مؤشر إلى السلسلة "name/value" خارج الحدود إلى envp[0]؛ أو
  • إذا كان PATH لدينا هو "PATH=name=."، وإذا كان الدليل "name=." موجودًا ويحتوي على ملف قابل للتنفيذ باسم "value"، فسيتم كتابة مؤشر إلى السلسلة "name=./value" خارج الحدود إلى envp[0].

بعبارة أخرى، تسمح لنا هذه الكتابة خارج الحدود بإعادة إدخال متغير بيئة "غير آمن" (على سبيل المثال، LD_PRELOAD) في بيئة pkexec. هذه المتغيرات "غير الآمنة" يتم إزالتها بشكل طبيعي (بواسطة ld.so) من بيئة برامج SUID قبل استدعاء دالة main(). سنستغل هذه البدائية القوية في القسم التالي.

ملاحظة في اللحظة الأخيرة: polkit يدعم أيضًا أنظمة تشغيل غير Linux مثل Solaris و *BSD، لكننا لم نتحقق من قابليتها للاستغلال. ومع ذلك، نلاحظ أن OpenBSD غير قابل للاستغلال، لأن نواتها ترفض تنفيذ execve() لبرنامج إذا كان argc يساوي 0.

تنزيل الأداة