نحصل على كلمة المرور الرئيسية من مدير كلمات المرور المقفلة 1Password 4

أدوات جديدة ، الأساليب القديمة. نحن عكس مهندس والعثور على خطأ قاتل من 1Password.

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

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

هذا صحيح بالنسبة 1Password 4 (لاحظ أن الإصدار الأخير هو السابع اليوم). قبل أن أتحول إليها قبل بضع سنوات ، تأكدت من عدم وجود كلمات مرور بوضوح عندما يكون المدير في حالة قفل. لذلك في حالة وجود حل وسط ، سيتعين على المهاجم التعامل مع التخزين المشفر.


المدفن مغلق!

في هذه الحالة ، لا توجد إدخالات كلمة مرور أو كلمة مرور رئيسية. معقول جدا وصحيح ، و 1Password 4 اجتاز هذا الاختبار. أم لا؟

للتخلص من التفاصيل المملة ، سأقول على الفور: لقد استطعنا استعادة كلمة المرور الرئيسية من مثيل مغلق في 1Password 4 ، كما هو موضح أدناه.


فتح 1Password 4 واستعادة كلمة المرور الرئيسية الخاصة بك

تظهر الرسوم المتحركة أن 1Password 4 تم إلغاء قفله أولاً بالطريقة العادية ، ثم تم إغلاقه. بعد ذلك ، نقوم بتشغيل الأداة المساعدة multass ، والتي تستعيد بنجاح كلمة المرور. تستغل الأداة المساعدة المعالجة غير الصحيحة لحقل إدخال كلمة المرور في 1Password 4 لاستعادة المخزن المؤقت لكلمة المرور الرئيسية المبهمة ، وإلغاء تشفيرها ، وإلغاء تأمين 1Password 4 تلقائيًا ، وأخيراً عرض كلمة المرور الرئيسية في وحدة التحكم.

تفاصيل مملة


تتمثل الخطوة الأولى في تقييم مدير كلمات المرور في التحقق من كلمة مرور رئيسية واضحة في الذاكرة. هذا ممكن في أي محرر hex قادر على التفاعل مع مساحة ذاكرة العملية. على سبيل المثال ، محرر HxD المجاني. استخدمه لفتح مساحة ذاكرة 1Password 4.



نقع على الفور في أول منطقة يمكن قراءتها وهي مساحة ذاكرة 1Password 4.


مثال تمثيل الذاكرة HxD

لا شيء خاص بعد. ولكن يمكنك القيام بالبحث. على سبيل المثال ، كيف يبدو الموقف إذا كتبت كلمة المرور في نافذة إلغاء القفل 1Password 4 ، ولكن لا تنقر فوق الزر "إلغاء القفل":


قبو مغلق 1Password 4 مع كلمة المرور الرئيسية التي تم إدخالها في هذا المجال

بالتأكيد كلمة المرور في مكان ما في الذاكرة؟

نفتح HxD ، لكن البحث عن سطر بكلمة المرور الرئيسية ("Z3Superpass #") لا ينتج عنه نتائج.



يبدو أن 1Password يشفر أو يحجب الشكل بطريقة ما عند إدخاله. إذا كان الإجراء يعمل بشكل صحيح ، ثم كل شيء على ما يرام.

الغوص أعمق


لمعرفة لماذا لا يمكن العثور على كلمة المرور الرئيسية في الذاكرة عندما تكون موجودة بوضوح في مربع الحوار فتح ، يجب عليك العثور على الرمز الذي يتفاعل معها. هناك عدة طرق. يمكنك تتبع معالجة أحداث لوحة المفاتيح والماوس من خلال تعريب "GetMessage" أو "PeekMessage" أو "GetWindowText" أو واجهات برمجة التطبيقات الأخرى لـ Windows التي تعالج عادةً إدخال المستخدم. لذلك نجد المخزن المؤقت حيث يتم تسجيل ضربات المفاتيح ، ومن خلالها نذهب إلى روتين التشفير / التشويش. لكن هذه عملية طويلة ومعرضة للخطأ ، خاصةً مع الأطر الكبيرة التي تدير الذاكرة في بعض الأحيان بشكل غريب للغاية ، لذلك يجب عليك إنشاء العديد من النسخ والتحويلات لتتبع المخزن المؤقت.

بدلاً من ذلك ، نستخدم أداة ترابط الصور الخاصة بنا ، المصممة للهندسة العكسية لبروتوكولات الملكية "الغريبة" على مستوى التطبيق. سيساعدك هذا على تحديد المكان الذي يتفاعل فيه 1Password في الذاكرة مع كلمة المرور الرئيسية الخاصة بنا. تعرّف الأداة "تلقائيًا" مناطق التعليمات البرمجية في 1Password 4 التي تتفاعل مع كلمة مرور مبهمة (تُبرز ببساطة الإرشادات التي تتفاعل مع البيانات المهمة لمزيد من التحليل). النتيجة تبدو شيء مثل هذا:


يبحث مؤشر ترابط Imager عن رمز 1Password 4 الذي يتفاعل مع كلمة مرور رئيسية غير مركزة

نظرًا لأنه يتم تخزين كلمة المرور الرئيسية في الذاكرة في شكل غامض ، يجب أن تُظهر الأداة أولاً مكان حدوث التشويش.

يوضح جزء من النتيجة الأولى أن المظهر الأول لكلمة المرور الرئيسية يكون مصحوبًا بنقل رمز من العنوان 0x7707A75D إلى 0x701CFA10.


يبرز إدخال تفصيلي في مؤشر ترابط Imager انتقال الرمز من 0x7707A75D إلى 0x701CFA10 ، بينما تشير سجلات EAX و ECX إلى المخزن المؤقت بكلمة المرور الرئيسية

دراسة هذا المكان 0x7707A75D في مصحح الأخطاء (x64dbg) تؤكد نظريتنا. بالفعل ، لأول مرة ، السلسلة "Z3superpass #" تحدث عندما تنتهي وظيفة فك التشفير 'RtlRunDecodeUnicodeString' من مكتبة ntdll.dll.



بعد قليل من التحليل ، من الواضح أن هاتين الوظيفتين تستخدمان لتعتيم كلمة المرور: 'RtlRunEncodeUnicodeString' و 'RtlRunDecodeUnicodeString'. لذلك يتم إخفاء كلمة المرور الرئيسية من النسخ البدائي من الذاكرة ، ولهذا السبب في وقت سابق لم نتمكن من العثور عليها في محرر hex.

إذا قمت بدراسة المخزن المؤقت المشفر في نهاية وظيفة RtlRunEncodeUnicodeString ، فإن السطر المشفر بكلمة المرور الرئيسية يبدو كما يلي:


كلمة السر المشفرة الرئيسية

بعد RtlRunDecodeUnicodeString 'يتم فك تشفيره:


كلمة السر ماجستير فك تشفير

ومن المثير للاهتمام ، يتم حفظ هذه المنطقة في نفس العنوان 0x00DFA790 ويمكننا ملاحظة تغيرها حرفيًا عند إدخال كلمة مرور في نافذة إلغاء القفل 1Password 4:



الضعف


يعد كل من "RtlRunEncodeUnicodeString" و "RtlRunDecodeUnicodeString" دالات بسيطة تقوم بتعديل سلسلة باستخدام عملية XOR بسيطة. هذا ليس سيئًا للغاية: يبدو أنه الطريقة القياسية لإخفاء كل عناصر تحكم تحرير Windows الأصلية باستخدام مجموعة إشارة "ES_PASSWORD".

المشكلة هي أنه بعد فتح 1Password 4 ، لا يتم مسح كلمة المرور الرئيسية المشفرة من الذاكرة.

والأسوأ من ذلك ، أنها تظل في الذاكرة حتى بعد قفل 1Password 4. وهذا هو ، لدينا متجر كلمات مرور مقفلة ، ولكن مع كلمة مرور رئيسية مشفرة في الذاكرة.

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

التحدي


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



يسهِّل هذا الرسم التخطيطي فهم مكان المكتبات والمشاركة فيها من أجل تحديد المناطق الموجودة في الذاكرة بشكل موثوق حيث يمكنك استرداد كلمة المرور الرئيسية.

استغلال


ماذا لدينا في الوقت الراهن؟ لدينا تخزين مغلق ، وفي مكان ما في الذاكرة ، يتم تخزين كلمة مرور مبهمة ، لأن البرنامج لم ينظف الذاكرة بشكل صحيح.



لاستعادته ، تحتاج إلى استدعاء الإجراء في 1Password 4 ، والذي يبدأ بـ "RtlRunEncodeUnicodeString" و "RtlRunDecodeUnicodeString". وبالتالي ، فإنه سيُظهر موقع المخزن المؤقت للذاكرة بكلمة المرور الرئيسية المشفرة.


منطقة الذاكرة مع كلمة سر رئيسية غامضة

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

يبدو أن الطريقة الوحيدة للاتصال بـ "RtlRunEncodeUnicodeString" و "RtlRunDecodeUnicodeString" هي إدخال كلمة المرور الرئيسية في الحرف في مربع الحوار. حتى نحصل على المخزن المؤقت المطلوب. لكننا لا نعرف طول كلمة المرور.

لقد حللنا هذه المشكلة عن طريق اعتراض الكود الذي يصل إلى الحرف الأول من المخزن المؤقت لدينا ، مع منع محاولة التغيير. هذا الروتين موجود في حلقة رسالة التحكم في comctl32 ، والذي يعالج التحكم المؤقت للعناصر المقابلة. استدعاء "memmove" مع الإزاحة 0x70191731 بالكتابة فوق المخزن المؤقت بالحرف الذي تم إدخاله:


(التأثير الجانبي: الخط المميز (الأصفر) يقوم بتحديث سطر كلمة المرور بالكامل)

الآن وصلنا أخيرًا إلى كل ما نحتاج إليه لإنشاء استغلال. تتيح لنا الخطوات التالية استخراج كلمة المرور الرئيسية:

  1. ربط "memmove" لمنع الكتابة فوق البايت الأول من كلمة المرور الرئيسية.
  2. ربط "RtlRunEncodeUnicodeString" للحصول على موقع المخزن المؤقت لكلمة المرور الرئيسية المبهمة.
  3. ربط "RtlRunDecodeUnicodeString" للوصول إلى المخزن المؤقت المبهم التي تم الحصول عليها في الخطوة السابقة.
  4. إدخال حرف في حقل إدخال كلمة المرور ورفض الخطوة 1 (حفظ كلمة المرور الرئيسية بالكامل) ، وإعادة توجيه الخطوة 2 إلى الخطوة 3 لفك تشفير كلمة المرور الرئيسية المبهمة.

لتنفيذ كل هذه الإجراءات ، قم بإنشاء DLL برمز المعالج لكل هذه السنانير. يتم تضمين المكتبة في عملية 1Password 4 ، وترسل حرفًا واحدًا إلى مربع حوار كلمة المرور الرئيسية ، عن طريق تشغيل memmove و RtlRunEncodeUnicodeString و RtlRunDecodeUnicodeString الخطوات التي يمكننا اعتراضها - ونفعل سحرنا لاستعادة كلمة المرور الرئيسية المبهمة. يحدث معظم السحر في DetourRtlRunEncodeUnicodeString ، وهذا هو ربط وظيفة "RtlRunEncodeUnicodeString" ، كما هو موضح أدناه:



وهو ما يقودنا إلى النتيجة النهائية: فتح مستودع التأمين المؤمن 1 كلمة المرور 4 من أي إصدار باستخدام إجراء عربات التي تجرها الدواب المستخدمة من قبل ويندوز API:



ملخص


عندما بحثنا أولاً في الدواخل 1Password 4 ، توقعنا أن نلتقي بنوع من نظام الأمان المعقد وتوقعنا أن يتم مسح جميع المعلومات الحساسة من الذاكرة ، كما يحدث في إجراءات PBKDF2 وغيرها من المناطق التي تستخدم فيها كلمة المرور الرئيسية. يتم مسح الإدخالات المقابلة أيضًا. ومع ذلك ، نظرًا للإشراف ، يُعتبر حقل إدخال كلمة المرور عنصر تحكم قياسي لـ Windows API باستخدام كلمة مرور مخفية ، مما يقوض أمان 1Password 4.

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


All Articles