Sploitus

Exploit for CVE-2021-3560-PolkitPrivilegeEsclation

kitploit · 2026-08-25

Exploit Code

MARKDOWN62 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-YUTASATO88-CVE-2021-3560-POLKITPRIVILEGEESCLATION
# CVE-2021-3560-Polkit-Privilege-Esclation PoC

## البحث الأصلي بقلم Kevin Backhouse

هذا مجرد سكربت PoC بلغة Bash، يعمل على أتمتة خطوات الاستغلال المذكورة في مدونة Kevin Backhouse. اقرأ منشوره حول هذه الثغرة: https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/

## الاستخدام

root@kitploit:~
    
    
    USAGE:
         ./poc.sh
         -h --help
         -u=Enter custom username to insert (OPTIONAL)
         -p=Enter custom password to insert (OPTIONAL)
         -f=y, To skip vulnerability check and force exploitation. (OPTIONAL)
         -t=Enter custom sleep time, instead of automatic detection (OPTIONAL)
         Format to enter time: '-t=.004' or '-t=0.004' if you want to set sleep time as 0.004ms 
    Note:
    Equal to symbol (=) after specifying an option is mandatory.
    If you donot specify the options, then the script will automatically detect the possible time and
    will try to insert a new user using that time.
    Default credentials are 'secnigma:secnigmaftw'
    If the exploit ran successfully, then you can login using 'su - secnigma'
    and you can spawn a bash shell as root using 'sudo bash'
    

## أمور يجب ملاحظتها:

  * يعمل هذا الاستغلال فقط على التوزيعات التي تم تثبيت `accountsservice` و`gnome-control-center` عليها، ويجب أن يكون لديها `polkit` الإصدار 0.113 (أو أحدث) أو `0-105-26` (نسخة دبيان المشتقة من `polkit`).
  * تم اختبار هذا الاستغلال على `Ubuntu` `20.04`، مع `polkit` الإصدار `0-105-26` (نسخة دبيان المشتقة من `polkit`)، وعلى `Centos 8` مع polkit الإصدار `0.115`. إذا كنت متأكدًا من أن هدفك معرّض للثغرة، لكن وظيفة الفحص في الاستغلال تفشل، فاستخدم الخيار `-f=y` لتجاوز جميع الفحوصات وإجبار الاستغلال على التنفيذ.
  * تبين أن التوزيعات مثل RHEL 8 وFedora 21 وDebian testing ("bullseye") وUbuntu 20.04 معرّضة للثغرة.
  * يمكن العثور على قائمة بتوافق التوزيعات من  Kevin.



## كيف يعمل الاستغلال؟

يتم تقديم شرح شامل وPoC لاستغلال هذه الثغرة يدويًا بالتفصيل في مدونة الباحث.

_الخلاصة المختصرة (TL;DR)_ لهذا الاستغلال موضحة أدناه:

  * يتطلب هذا الهجوم توقيتًا دقيقًا، ويجب علينا تسجيل الدخول عبر SSH (أو بعض جلسات سطر الأوامر، حيث لا يكون فتح التطبيقات الرسومية خيارًا متاحًا).
  * يمكن للمهاجم استغلال هذه الثغرة عن طريق تحفيز `polkit` بإرسال رسالة `dbus`، مع إغلاق الطلب فجأة بينما يقوم `polkit` بمعالجة الطلب. بعد ذلك يمكن للمهاجم إرسال طلب ثانٍ باستخدام معرّف الناقل الفريد للطلب السابق، لتنفيذ الطلب بصلاحيات UID `0` والمعروف أيضًا باسم `root`.
  * تكمن هذه الثغرة في `polkit`، لأنه يعامل UID الخاص باتصال يحمل معرّف ناقل لم يعد موجودًا، على أنه طلب قادم من UID `0`. وهذا يعني أنه إذا تمكنا من توقيت الهجوم بشكل صحيح وإنهاء طلبنا الأول في اللحظة المناسبة، فيمكننا إرسال الطلب الثاني بصلاحيات UID `0` والمعروف أيضًا باسم `root`.
  * يتم حساب توقيت إنهاء الاتصال على أنه الوقت المطلوب لإرسال رسالة dbus مقسومًا على 2. مشروح بالتفصيل هنا.



## ما الذي يفعله هذا السكربت فعليًا؟

كما قلت سابقًا، هذا مجرد سكربت bash يقوم بأتمتة إثبات المفهوم (PoC) الخاص بـ Kevin Backhouse. الأوامر الأساسية هي نفسها؛ لقد قمت فقط بأتمتة بعض الخطوات الأولية (مثل ضبط التوقيت الصحيح، فحص الثغرة، إدخال بيانات اعتماد مخصصة، طباعة ألوان جميلة، وما إلى ذلك).

إذا تم تشغيل هذا السكربت دون أي معامل، فإن السلوك الافتراضي لهذا السكربت يكون كما يلي:

  * التحقق من نوع التوزيعة. [باستخدام ملف `/etc/os-release`.]
  * التحقق من تثبيت `accountservice` و`gnome-control-center`. [في توزيعات `rhel/centos/fedora`، يستخدم `rpm -qa`، وفي توزيعات `debian/ubuntu`، يستخدم `dpkg -l`].
  * إذا تم العثور على التثبيتات، يقوم السكربت بالتحقق من إصدار polkit. [الإصدار 0.113 (أو أحدث) لتوزيعات `rhel.centos,fedora`، والإصدار `0-105-26` لتوزيعات `Debian/Ubuntu`]
  * إذا تبين أن إصدار polkit معرّض للثغرة، يبدأ السكربت في الاستغلال
  * أولاً، يقوم السكربت بحساب الوقت المطلوب لإرسال الطلب باستخدام debus-send عن طريق تنفيذ `bash time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:`echo $username` string:"`echo $username`" int32:1 2>&1 >/dev/null `