وآخر بخار عميل ويندوز التصعيد المحلي امتياز 0day

في السلسلة السابقة


منذ وقت ليس ببعيد نشرت وصفًا لضعف Steam. حصلت على الكثير من ردود الفعل من القراء. لم يقل Valve كلمة ، وأرسل HackerOne خطابًا ضخمًا دموعًا ، وكان صامتًا في الأساس. نتيجةً لذلك ، حظرني Valve على H1 - لا يمكنني المشاركة في برنامجهم لرفض الثغرات الأمنية (بقية H1 متاحة لي).



يمكنك معرفة المزيد حول القصة في منشور سابق ، وهنا سأقول بضع كلمات عن الوضع الحالي.

لكنها بسيطة وحزينة - صمام لا يزال فشل. يتم تجاوز التحديث الأخير ، الذي تم تصميمه لحل المشكلة ، بسهولة وما زالت مشكلة عدم الحصانة ذات صلة. نعم ، راجعت ذلك - إنه يعمل بشكل رائع.

ولكن هذا المقال لا يدور حول حقيقة أن الضعف القديم لا يزال موجودا ، ولكن عن الجديد. بما أن Valve عبرت مرة أخرى عن رغبتها في قراءة تقرير عام ، بدلاً من تقرير خاص ، فلن نحرمهم من هذه المتعة.

وصف موجز للضعف


وصف عام لاستغلال مشكلة عدم الحصانة بسيط إلى حد ما ويتكون من ثلاث خطوات:

  1. نحن نعد البيئة للتشغيل (ما يصل إلى طريقتين للاختيار ، وذلك باستخدام عيوب أمان مختلفة).
  2. الحصول على البخار لنسخ وتشغيل دلل لدينا.
  3. يجب دلل تلبية الاحتياجات الصغيرة.

يمكن تنفيذ جميع هذه الإجراءات من قبل أي مستخدم لنظام التشغيل ، أو بدقة أكثر ، أي برنامج على الكمبيوتر. نتيجة لذلك ، يمكنك تنفيذ أي تعليمات برمجية ذات امتيازات قصوى ، وتسمى هذه الفئة من نقاط الضعف تصعيد الامتيازات (eop) أو تصعيد الامتياز المحلي (lpe). على الرغم من حقيقة أن أي تطبيق في حد ذاته يمكن أن يحدث بعض الضرر ، فإن الحصول على أقصى الحقوق سيؤدي إلى عواقب أكثر أهمية. إن إيقاف تشغيل برنامج الحماية من الفيروسات وجدار الحماية ، وتثبيت برنامج rootkit ، وإخفاء عملية التعدين ، وسرقة البيانات الشخصية لجميع مستخدمي الكمبيوتر ، ليس سوى جزء صغير مما يمكنك التفكير فيه.

الحد الأدنى النظري


كان من المضحك للغاية مشاهدة التعليقات على المقال السابق ، حيث كتب الناس "لا يمكن للمستخدم كتابة مفاتيح التسجيل في HKLM" أو "حقوق المسؤول ضرورية لإنشاء رابط". ومن المثير للاهتمام ، أن فحص هذه الادعاءات سيستغرق وقتًا أطول من كتابة مثل هذا التعليق. ونعم ، فقط في حالة: كلا البيانين كاذبان. لذلك ، قررت في هذه المقالة إنشاء قسم صغير وصفت فيه عددًا من اللحظات الصعبة من العملية.

"لا يمكنك الكتابة إلى مفتاح التسجيل HKLM"


لا يوجد مثل هذه القاعدة العامة. توجد قواعد أمان محددة لمفاتيح التسجيل المحددة. عيّن Valve حقوق وصول كاملة لجميع المستخدمين إلى فرع HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam ، وبالتالي ، يمكن لأي مستخدم أن يفعل ما يريد في هذا الفرع.

"لا يمكنك بدء أو إيقاف الخدمة دون حقوق المسؤول"


لا يوجد مثل هذه القاعدة العامة. هناك قواعد أمنية محددة لخدمات محددة. ضبط Valve الحقوق بحيث يمكن بدء تشغيل خدمة عميل Steam وإيقافها بواسطة أي مستخدم.

"لإنشاء رابط ، تحتاج إلى حقوق المسؤول"


هذا سؤال مضحك في حد ذاته ، بالنظر إلى أن الأنواع الرئيسية الخمسة من الروابط في ويندوز ، واحد فقط ونصف يتطلب هذه الحقوق. لذا ، يجتمع: ملف رمزي ، رابط رمزي لدليل الكائن ، ارتباط ثابت ، نقطة إعادة توزيع NTFS و reg_link. هناك حاجة إلى حقوق المسؤول فقط لإنشاء ارتباط رمزي للملف ولارتباط رمزي بدليل كائن دائم (الارتباط المؤقت يعيش تمامًا ما دامت الجلسة التي تم إنشاؤه فيها حية ، بالمعنى العام ، قبل إعادة التشغيل ولا تتطلب حقوقًا خاصة).

Simlink من مجلد إلى مجلد


وهذا ما يسمى نقطة إعادة توزيع NTFS أو نقطة تحميل NTFS. الاسم ليس مهمًا بشكل خاص ، والحقيقة هي أن هذا الشيء يسمح لك باستخدام مجلد واحد كمؤشر لآخر. يمكن إنشاؤه بواسطة مستخدم عادي من مجلد فارغ إذا كان لديه حقوق الكتابة إليه. من أجل الإنشاء ، سوف نستخدم الأداة المساعدة CreateMountPoint.exe من مجموعة من الأدوات المساعدة لاختبار العمل مع الارتباطات .

ترك قفل


حظر الرسائل الصادرة ( OpLock أو قفل الفرص ) هو آلية خاصة يستطيع أحد التطبيقات من خلالها منع الجميع مؤقتًا من الوصول إلى مورد ملف معين. هنا يمكنك كتابة الكثير من جميع أنواع التفاصيل ، وميزات العمل مع المجلدات ووصول مختلفة. خلاصة القول هي: يمكن للبرنامج "اللحاق" الحدث من الوصول إلى ملف معين والاحتفاظ به لفترة من الوقت. يمكنك تثبيت oplocks باستخدام الأداة المساعدة SetOpLock.exe من مجموعة الاختبار نفسها للعمل مع الارتباطات . تشغيل الأداة المساعدة بتثبيت القفل المطلوب ؛ عندما يحدث الوصول ، تكتب الأداة المساعدة رسالة ؛ الضغط على Enter يزيل الفتح.

BaitAndSwitch


هذا هو اسم التقنية ، والذي يجمع بين إنشاء الروابط وتثبيت oplos للفوز بـ TOCTOU (وقت الفحص / وقت الاستخدام). الجوهر هو أسهل لتوضيح مع مثال.

تخيل أن هناك بعض البرامج التي تفعل شيئا مثل هذا على التوالي:

ReadContentFromFile(“C:\test\myfile.txt”); ReadContentFromFile(“C:\test\myfile.txt”); 

إنه مجرد قراءة الملف نفسه مرتين على التوالي. هل سيتم قراءة الشيء نفسه دائمًا؟ لا ، ليس بالضرورة.

أولاً ، قم بإنشاء مجلدين باستخدام الملفات C: \ test1 \ myfile.txt و C: \ test2 \ myfile.txt. وبشكل عام ، سنقوم بمسح المجلد C: \ test وإنشاء نقطة إعادة توزيع على C: \ test1. نضع القفل على الملف من الدليل الأول ونشغل البرنامج. بمجرد أن تفتح الملف ، سيعمل القفل. سنقوم بتغيير نقطة إعادة التوزيع وسيشير C: \ test إلى C: \ test2. الآن ، بعد إزالة القفل ، سيقوم البرنامج بقراءة الملف مرة أخرى من ملف آخر.

لماذا هذا مطلوب؟ بسيط للغاية - موقف نموذجي إلى حد ما حيث يتم فحص الملف لأول مرة (القراءة الأولى) ثم إطلاقه (القراءة الثانية). هذه هي الطريقة التي نرسل بها ملفًا واحدًا للتحقق ، وآخر للتنفيذ.

الآن كل شيء جاهز للعمل.

عملية 1. إعداد البيئة


من الضروري إعداد بيئة عمل صغيرة. بادئ ذي بدء ، تحتاج إلى اتخاذ الملفات القابلة للتنفيذ CreateMountPoint.exe و SetOpLock.exe.

الآن نحن بحاجة إلى إجراء تغييرات صغيرة على هيكل ملف Steam. مهمتنا هي الحصول على مجلد مع ملفين Steam.exe و steamclient.dll والغياب الإلزامي لمجلد bin. هناك طريقتان للقيام بذلك.

طريقة 1


إعادة تسمية \ حذف مجلد bin من مجلد Steam الرئيسي. هذا كل شيء ، أنت رائع (Steam أثناء التثبيت يمنح أي مستخدم حقوق كل شيء في مجلده).

الطريقة 2


في مفتاح التسجيل HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam قم بتغيير المعلمة InstallPath إلى بعض من مجلدنا. في هذا المجلد ، قم بإسقاط Steam.exe و steamclient.dll من المجلد الرئيسي لـ Steam.

افترض أننا قمنا بإعداد مجلد C: \ Steam بأي من الطرق (يمكن أن يكون المسار موجودًا ، ولكن في الأمثلة سأستخدم هذا). الآن قم بإنشاء مجلدات أخرى b1 و b2 و b3 و b4 فيها. في الثلاثة الأولى ، سنقوم بتحميل ملف steamservice.dll (من مجموعة Steam ، في الأصل كان موجودًا في مجلد bin) ، وفي مجلد b4 سنقوم بإسقاط المكتبة المشكلة خصيصًا بنفس الاسم - steamservice.dll. تفاصيل عن إعداد المكتبة ستكون في الفقرة 3.

نفتح نافذتين من وحدة التحكم. هذا يكمل إعداد البيئة.

عملية 2. استبدال الملف


أعتقد أنه من الاستعدادات أصبح من الواضح بالفعل أنه سيكون هناك شيء مثل BaitAndSwitch الموصوف أعلاه.

لقطة شاشة من ProcMon:



هذا جزء من الإطلاق النموذجي لخدمة عملاء Steam. لاحظ الجزء الذي يتم فيه نسخ dll أولاً إلى C: \ Program Files (x86) \ Common Files \ Steam ، ثم تحميلها. سوف نتأكد من نسخ مكتبتنا من C: \ Steam \ b4. لسوء الحظ ، يتم إجراء الاختبارات أولاً ، بما في ذلك توقيع المكتبة ، بحيث لا يمكن استبدالها (يا للسخرية).

لذلك ، سوف أسجل الخطوات. يتم دمج الخطوات في مجموعات من نفس الإجراءات. في كل خطوة ، سيتم الإشارة إلى المكان الذي سيتم تشغيله وما يحدث (دعوت نوافذ التحكم المختلفة cmd1 و cmd2).

  1. إنشاء المجلد C: \ Steam \ bin وفي cmd1 تنفيذ:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b1
  2. في cmd1 نضع oplock:
    SetOpLock.exe C: \ Steam \ b1 \ steamservice.dll
  3. نبدأ تشغيل خدمة عملاء Steam ، ونرى في cmd1 أننا تمكنا من الوصول إلى الملف.

    ***
  4. حذف C: \ Steam \ bin ، قم بإنشاء مجلد C: \ Steam \ bin في مكانه وفي cmd2 ، قم بتنفيذ:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b2
  5. في cmd2 نضع oplock:
    SetOpLock.exe C: \ Steam \ b2 \ steamservice.dll
  6. في cmd1 أطلقنا القفل ، نرى أن cmd2 تمكن من الوصول إلى الملف.

    ***
  7. حذف C: \ Steam \ bin ، إنشاء المجلد C: \ Steam \ bin في مكانه وتنفيذ cmd1:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b3
  8. في cmd1 نضع oplock:
    SetOpLock.exe C: \ Steam \ b3 \ steamservice.dll
  9. في cmd2 أطلقنا الفتح ، نرى أن cmd1 قد تمكن من الوصول إلى الملف.

    ***
  10. حذف C: \ Steam \ bin ، قم بإنشاء المجلد C: \ Steam \ bin في مكانه وتنفيذ cmd2:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b2
  11. في cmd2 نضع oplock:
    SetOpLock.exe C: \ Steam \ b2 \ steamservice.dll
  12. في cmd1 أطلقنا القفل ، نرى أن cmd2 تمكن من الوصول إلى الملف.

    ***
  13. حذف C: \ Steam \ bin ، إنشاء المجلد C: \ Steam \ bin في مكانه وتنفيذ cmd1:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b3
  14. في cmd1 نضع oplock:
    SetOpLock.exe C: \ Steam \ b3 \ steamservice.dll
  15. في cmd2 أطلقنا الفتح ، نرى أن cmd1 قد تمكن من الوصول إلى الملف.

    ***
  16. حذف C: \ Steam \ bin ، قم بإنشاء المجلد C: \ Steam \ bin في مكانه وتنفيذ cmd2:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b4
  17. في cmd1 أطلقنا الفتح

على الرغم من أن الأمر يبدو معقدًا ، إلا أن الفكرة بسيطة في الواقع: من 6 مرات الوصول إلى الملف C: \ Steam \ bin \ steamservice.dll أول 5 مرات تم إعطاء الملفات الأصلية من مجلدات مختلفة (بترتيب الوصول: b1 ، b2 ، b3 ، b2 ، b3) ، وللمرة السادسة تم إعطاء ملف به حمولة للنسخ.

من الناحية التخطيطية ، قمت بتصويرها مثل هذا:


على اليسار هو السلوك الطبيعي ، على اليمين هو استغلال السلوك.

تشغيل 3. المكتبة المنفذة


بالنسبة إلى الحمولة النافعة ، استخدمت أولاً dll الأكثر شيوعًا ، والذي في DllEntry ينشئ وحدة تحكم تفاعلية. نظرًا لأنه سيتم تنفيذ رمز dll في سياق Steam Client Service ، فسيتم تنفيذه بنفس حقوق الخدمة نفسها - NT AUTHORITY \ SYSTEM. ولكن نتيجة للعملية ، لم تظهر وحدة التحكم.

بعد التنزيل ، لا تزال خدمة Steam تدرك أنها تراجعت عن الزيزفون وينتهي عملها ، لذلك لم يتم تنفيذ الحمولة النافعة من ملف dll الخاص بي.

اضطررت إلى الالتفاف قليلا ، واتضح أن الخدمة بعد تحميل دلل يتحقق من وجود وظائف

 int WINAPI SteamService_RunMainLoop() void WINAPI SteamService_Stop() 

في المكتبة. علاوة على ذلك ، تستدعي الخدمة الوظيفة الأولى ، حيث قررت وضع الحمولة الصافية (إطلاق وحدة تحكم تفاعلية مع حقوق الخدمة - NT AUTHORITY \ SYSTEM). الآن هذا هو كل شيء - نكرر كل الخطوات ونحصل على وحدة تحكم مع أقصى أذونات.

استنتاج


يمكنك لف كل هذا في ملف exe ، لكن بصراحة ، لا أرغب حقًا في الإزعاج. أعتقد أن مقطع الفيديو الذي يتضمن عرضًا توضيحيًا سيكون كافيًا ( خيار مع التسجيل ، خيار مع نظام الملفات ).
لن أنسخ هنا قسم "المضاربة" من مقال سابق. فقط الحقائق: الضعف القديم الحالي ، قرأت للتو عن واحدة جديدة ، لا يزال Valve لا تريد أن تسمع عن المشاكل.

تحديث (08/22/2019)


في الوقت الحالي ، هناك خبران:

  1. تلقى العميل بيتا إصلاح التصحيح . سوف أشاهد عندما يصل التحديث إلى العميل الرئيسي.
  2. لقد غيرت Valve سياسة LPE . وهذه أخبار رائعة!


تحديث (08/27/2019)


خبر جيد

  1. تلقى العميل الرئيسي تحديث التصحيح .
  2. لقد حظرت على H1 ودفعت مكافأة


هذا المقال باللغة الإنجليزية.

Source: https://habr.com/ru/post/ar464367/


All Articles