"الأسرار" DPAPI أو DPAPI لـ Pentesters

المقالة الثانية تستند إلى نتائج أداء فريقنا في OFFZONE-2018. هذه المرة ، فكر في إجراء محادثة مع MainTrack "Windows DPAPI" Sekretiki "أو DPAPI for pentesters".

انتباه! الكثير من الزان!

عند إجراء حملات RedTeam ، أرغب في تقديم أسباب أقل لرد فعل BlueTeam ، ولكن يمكن أن يكون هناك الكثير. على سبيل المثال ، قم بتشغيل mimikatz للحصول على كلمات مرور أو شهادات المستخدم. حتى لو تمكنا من "otmazyvat" له من Kaspersky ، فإن BlueTeam لديه القدرة على التتبع باستخدام أدوات متخصصة مثل Sysmon و Microsoft ATA ، إلخ. في الوقت نفسه ، أود الحصول على أقصى قدر من المعلومات من جهاز مستخدم مخترق. في سياق الحملات التي أجرتها RedTeam مرارًا وتكرارًا لمواجهة فرق BlueTeam الحقيقية ، توصلنا إلى استنتاج أنه من الضروري تجنب الإجراءات التي يمكن أن تكون بمثابة مؤشرات على اختراق النظام. يمكن تحقيق هذا الهدف من خلال استخدام الآليات والإجراءات القانونية التي يوفرها نظام التشغيل للمستخدم.

إحدى هذه الأدوات القانونية هي آلية DPAPI (واجهة برمجة تطبيقات حماية بيانات Windows) ، والتي يستخدمها نظام التشغيل والتطبيقات المختلفة لتشفير بيانات المستخدم الحساسة (كلمات المرور ، مفاتيح التشفير ، إلخ.) بالنسبة للمستخدم النهائي وتطبيقاته ، تبدو DPAPI بسيطة للغاية : لا يوجد سوى وظيفتين - "تشفير البيانات" و "فك تشفير البيانات". في هذه المقالة ، أود أن أفكر في مدى فائدة هذه الآلية للمهندسين أثناء حملات RedTeam.

ما هو DPAPI؟ لفترة وجيزة فقط والروسية


منذ عام 2000 ، بدأت جميع أنظمة تشغيل Windows في استخدام مشغل DPAPI للحفاظ على أمان بيانات المستخدم.

إذا تخطينا كل تشفير فحصنا في التقرير ، لفك تشفير البيانات المشفرة عبر DPAPI ، نحتاج إلى: مفتاح رئيسي ، SID المستخدم ، تجزئة كلمة مرور المستخدم ، ونقطة DPAPI نفسها (بيانات DPAPI المشفرة).

بشكل عام ، تبدو العملية كما يلي:



يوجد داخل "قبعة التشفير" الخاصة بنا العديد من آليات التشفير المختلفة التي لن نأخذها في الاعتبار في هذه المقالة ، حتى لا تفرط في تحميل القارئ. نلاحظ فقط أن الجزء الرئيسي من DPAPI هو ما يسمى Masterkey (المفتاح الرئيسي). بعبارات بسيطة ، المفتاح الرئيسي هو 64 بايت من البيانات العشوائية المشفرة باستخدام المفتاح الأولي ، الذي يتم إنشاؤه من كلمة مرور المستخدم ومعرف الأمان الخاص بها.


وتشارك المعلمات الإضافية أيضًا في توليد prekey: عدد التكرارات (IterN) والملح و HMAC ، والتي يمكن أن تختلف من حالة إلى أخرى. يتم تخزين قيم هذه المعلمات مع المفتاح الرئيسي في ملف واحد.

وبالتالي ، ومع معرفة كلمة مرور المستخدم ، ومعرف الأمان الخاص به وقراءة معلمات التوليد من ملف المفتاح الرئيسي (HMAC ، و Salt ، و InterN) ، يمكننا إنشاء مفتاح رئيسي وفك تشفير المفتاح الرئيسي ، أي: احصل على 64 بايت عشوائيًا التي سنستخدمها لفك تشفير النقط DPAPI.

ماذا لو قمت بتغيير كلمة المرور الخاصة بي؟


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

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

قليلا عن المفاتيح الخاصة لوحدة تحكم المجال


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

جوهر آلية فك تشفير المفتاح الرئيسي بعد إعادة تعيين كلمة مرور المستخدم كما يلي: يتم إنشاء زوج من مفاتيح RSA - الخاصة والعامة - على وحدة تحكم المجال. يتم تخزين المفتاح الخاص على وحدة تحكم المجال في قاعدة بيانات NTDS ويسمى BCKUPKEY_xxxx (انظر الشكل أدناه) ، ويتم توزيع المفتاح العمومي على جميع أنظمة المجال ويستخدم لإنشاء نسخة مكررة من المفتاح الرئيسي عند إنشائه.

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



بوجود الامتيازات المناسبة في المجال (غالبًا ما يكون المسؤول) ، يمكنك الحصول على مفاتيح RSA الخاصة من وحدة تحكم المجال من خلال آلية النسخ المتماثل واستخدامها لفك تشفير المفاتيح الرئيسية التي تم إنشاؤها على أجهزة المجال. يمكن القيام بذلك باستخدام mimikatz أو DSInternals. يمكنك قراءة المزيد حول هذا الموضوع في مدونة mimikatz wiki أو DSInternals .

أين يتم تخزين المفاتيح الرئيسية وما هي؟


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

Users\%USER%\AppData\Roaming\Microsoft\Protect\%SID%\

فقط في حالة ، يقوم النظام بتخزين جميع المفاتيح الرئيسية المستخدمة من قبل المستخدم. بعد كل شيء ، فهي لا تعرف مقدمًا أي سيد سيحتاج إلى فك تشفير شيء باستخدام مفتاح ما. يتم تخزين GUID للمفتاح الحالي المستخدم في الملف المفضل.



يتم تخزين مفاتيح النظام الرئيسية بالطريقة التالية:
windows\system32\Microsoft\Protect\S-1-5-18\

وبالمثل مع المستخدم - يتم استخدام مفتاح رئيسي واحد ، يمكن العثور على اسمه في الملف المفضل ، حيث يتم تخزين جميع المفاتيح المستخدمة على الإطلاق.



حسنًا ، ما الذي يمكن أن يقدمه هذا DPAPI لـ Pentester؟


نظرًا لأن DPAPI آلية قانونية وبسيطة ، فإن التطبيقات المختلفة تحاول استخدامها. لأنها مريحة وآمنة. في الوقت الحاضر ، بالطبع.

على سبيل المثال ، يتم استخدام DPAPI لتشفير المفاتيح الخاصة لشهادات العميل والنظام ، ومفاتيح WIFI ، و Chrome (ملفات تعريف الارتباط ، كلمات المرور) ، DropBox ، Skype ، RSA SecurID (تطبيق برنامج يولد مفاتيح لمرة واحدة). وهذه ليست بأي حال قائمة شاملة.

مهمة pentester هي فك تشفير النقاط الضرورية والحصول على كلمات المرور وملفات تعريف الارتباط ، إلخ.

هناك عدة طرق للقيام بذلك. بطريقة أو بأخرى ، يتلخص الجميع في نصين - عبر الإنترنت وغير متصلين. يتم فك التشفير عبر الإنترنت عندما ندعو ببساطة على جهاز المستخدم وظائف النظام لفك تشفير البيانات وتمرير النقطة DPAPI إلى الإدخال ، ويقوم النظام بكل شيء بمفرده - يبحث عن المفتاح الرئيسي الذي تم تشفير النقطة ، وفك تشفيره باستخدام SID للمستخدم وتجزئة كلمة المرور المخزنة في ذاكرة LSASS.

يوضح الشكل أدناه مثالاً على استدعاء وظائف DPAPI للتشفير وفك التشفير على بوويرشيل.



أولاً ، نقوم بتشفير سرنا (في هذه الحالة ، كلمة "كلمة المرور") عن طريق استدعاء الدالة [Security.Cryptography.ProtectedData] :: Protect (). ونحن نفعل هذا مرتين - في الحالة الأولى باستخدام المفتاح الرئيسي للمستخدم (المعلمة CurrentUser) ، وفي الثانية - مفتاح النظام الرئيسي (المعلمة LocalMachine). ثم يمكننا فك تشفير النقط الناتجة عن طريق استدعاء الوظيفة العكسية - [Security.Cryptography.ProtectedData] :: UnProtect ().

علاوة على ذلك ، في هذه الحالة ، لا تكون قيمة المعلمة CurrentUser أو LocalMachine مهمة ، لأن يجد النظام نفسه مفتاحًا رئيسيًا مناسبًا لفك تشفير النقطة ، ويقوم بكل ما يلزم. في كلتا الحالتين ، نحصل على سرنا الأولي - كلمة "كلمة المرور" (تمثيل البايت بت).

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

يمكن أن يكون بديل بوويرشيل لفك التشفير DPAPI عبر الإنترنت استدعاء mimiktaz :: blob باستخدام المعلمة / unprotect. عند الإدخال ، يتم إعطاؤه ملفًا ثنائياً باستخدام نقطة DPAPI ، وعند الإخراج نحصل على بيانات غير مشفرة. تم توضيح المزيد من الحالات التي تستخدم mimikatz في مدونة HarmJ0y.

سقطت الكرة جديلة. ماذا تفعل مع مزرعتي مع vidyuhi؟


نظرًا لحقيقة أن مفاتيح DPAPI الرئيسية مشفرة على كلمة مرور المستخدم ، يمكنك تجربة العملية العكسية - فرض كلمة مرور المستخدم عن طريق مفتاحه الرئيسي. على سبيل المثال ، تلقينا اتصالًا عكسيًا من الماكرو أو DDE من ملف docx المرسل. يمكننا أخذ المفتاح الرئيسي للمستخدم واستعادة كلمة مرور المستخدم دون أي تصعيد للامتيازات وإطلاق mimikatz.

هل يمكنني استخدام Hashcat أو JohnTheRipper لكلمة المرور bruteforce؟ ولكن قبل ذلك ، تحتاج إلى الحصول على معلمات القوة الغاشمة من تكوين جون مع البرنامج النصي المناسب:

 ./DPAPImk2john.py –S <sid> -mk <masterkey> -c <domain|local> 

ثم يمكننا بالفعل إرسال نتيجة البرنامج النصي إلى المزرعة لدينا مع بطاقات الفيديو ونأمل أن يكون لدى المستخدم كلمة مرور ضعيفة ، لأن سرعة القوة الغاشمة الرئيسية الرئيسية تكاد تقارب سرعة تعداد WPA2 ، أي ببطء شديد.

تجدر الإشارة هنا إلى أنه في حالة إنشاء مفتاح رئيسي على مجال Windows 10 ، تتم إضافة 10000 جولة أخرى من خوارزمية PBKDF2 إلى الجيل الأولي. ولكن الأسوأ من ذلك ، لا تعرف Hashcat ولا JohnTheRipper حول هذا (على الأقل في وقت كتابة هذا التقرير) ، مما يعني أنهم لن يتمكنوا من إزالة كلمة المرور من هذا المفتاح الرئيسي.

"للتخلص من كل ما هو سيء ، ثم اكتشاف ذلك ..."


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

  • مفاتيح المستخدم الرئيسية
  • مفاتيح النظام الرئيسية
  • ملف CREDHIST (إذا لم يكن جهاز مجال) ؛
  • كلمة مرور المستخدم (أو تجزئة sha1 / ntlm لها) ؛
  • SID للمستخدم ؛
  • DPAPI النقط التي نريد فك تشفيرها.

لفك التشفير في وضع عدم الاتصال ، لا يمكننا الاستغناء عن الأدوات المتخصصة. قد تكون هذه الأدوات:

  • ميميكاتز
  • Impacket (بدءًا من الإصدار الثامن عشر ، يحتوي على وظائف DPAPI) ؛
  • إطار Dpapick.

إنه حول إطار dpapick الذي سنتحدث به بمزيد من التفاصيل.

تم إنشاء إطار عمل python dpapick نفسه بواسطة الباحث Jean-Michel Pikode مرة أخرى في عام 2014 وهو عبارة عن تطبيق لآليات DPAPI على مكتبات تشفير Python. يسمح استخدام الثعبان ، وكذلك هيكل الإطار ، بالتكيف بسهولة مع مختلف آليات DPAPI. في الإصدار الأصلي ، لم يكن dpapick قادرًا على استخدام مفتاح النسخ الاحتياطي للنطاق لفك تشفير المفاتيح الرئيسية ، وكان يفتقر إلى آليات لفك تشفير المفاتيح الرئيسية التي تم إنشاؤها على Windows 10 في وضع جهاز المجال.

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

Chrome - أخذ وفك تشفير ملفات تعريف الارتباط وكلمات المرور


يتم تخزين %localappdata%\Google\Chrome\User Data\Default\Cookies Chrome في الملف %localappdata%\Google\Chrome\User Data\Default\Cookies
بيانات تسجيل الدخول موجودة في الملف %localappdata%\Google\Chrome\User Data\Default\Login Data

كلا الملفين عبارة عن قواعد بيانات sqlite3 حيث يتم تخزين البيانات الحساسة في صورة نقاط DPAPI. كجزء من dpapick ، ​​يوجد منشق جاهز (محلل) لهذه البيانات (أمثلة / chrome.py). من أجل فك التشفير بنجاح ، يجب عليه تحديد الدليل باستخدام المفاتيح الرئيسية أو معرف المستخدم أو كلمة المرور الخاصة به أو موقع المفتاح الخاص لوحدة تحكم المجال ، وكذلك ملف sqlite3 من Chrome (ملفات تعريف الارتباط أو بيانات تسجيل الدخول).

إلغاء تشفير ملف تعريف ارتباط Chrome في وضع عدم الاتصال باستخدام كلمة مرور المستخدم

 ./chrome.py --cookie <cookiefile> --sid <SID> --password <..> --masterkey <masterkeydir> 

إلغاء تشفير ملف تعريف ارتباط Chrome في وضع عدم الاتصال باستخدام تجزئة من كلمة مرور المستخدم

 ./chrome.py --cookie <cookiefile> --sid <SID> --hash <..> --masterkey <masterkeydir> 

فك تشفير كلمات مرور Chrome في وضع عدم الاتصال باستخدام مفتاح خاص من وحدة تحكم المجال

 ./chrome.py --chrome <login file> --pkey <rsa-priv.pem> --masterkey <masterkeydir> 

DPAPI لشهادات العميل


يتم استخدام شهادات العميل كثيرًا - لإنشاء OTP أو EFS أو المصادقة في VPN أو تطبيقات الويب ، إلخ.

يتم تخزين شهادات المفتاح العمومي نفسها في ملف تعريف المستخدم:
%APPDATA%\Microsoft\SystemCertificates\My\Certificates\
ويتم تشفير المفاتيح الخاصة ، بمساعدة تنفيذ التوقيع أو عمليات تشفير أخرى عبر DPAPI ، كما توجد في ملف تعريف المستخدم على طول المسار:

 %APPDATA%\Roaming\Microsoft\Crypto\RSA\<SID>\ 

من أجل فك تشفير مفاتيح الشهادات الخاصة بنجاح وإعادة إنشاء ملفات PFX ، بالإضافة إلى الملفات المذكورة أعلاه ، نحتاج أيضًا إلى مفاتيح المستخدم الرئيسية ، بالإضافة إلى SID وكلمة المرور الخاصة به (أو مفتاح RSA خاص من وحدة التحكم).

باستخدام Dpapick وكلمة مرور المستخدم ، نقوم بفك تشفير هذا:

 ./efs.py --certificates <cert dir> --rsakyes <RSA dir> --sid <..> --password <..> --masterkey <masterkeydir> 



تتيح لك المعلمة rsaout الاختيارية في لقطة الشاشة تصدير مفاتيح RSA المشفرة بالإضافة إلى ذلك بتنسيق PEM. نتيجة البرنامج النصي هي ملف PFX مُعاد إنشاؤه بدون كلمة مرور ، والتي يمكن استيرادها بالفعل إلى نفسك واستخدامها للغرض المقصود منها. إذا كان هناك العديد من الشهادات والمفاتيح الخاصة في الدلائل أعلاه ، فسيحاول dpapick فك تشفير كل منهم وإنشاء عدة ملفات pfx.

يمكن تنفيذ نفس الإجراءات باستخدام مفتاح المجال الخاص لفك تشفير المفتاح الرئيسي من خلال تحديد المعلمة المناسبة:

 ./efs.py --certificates <cert dir> --rsakyes <RSA dir> --masterkey <masterkeydir> --pkey <domain bkp key> 

أكثر قليلا عن "رقائق" المجال


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

عند تشغيل هذه "الميزة" ، تنتقل جميع الشهادات التي يستوردها المستخدم ، وكذلك جميع مفاتيحه وكلمات المرور الخاصة به ، إلى AD ويتم تخزينها في سمات الحساب المقابلة: msPKIAccountCrdentailas و msPKIDPAPIMasterKeys.

يمكنك أن ترى كيف يبدو داخل م ، على سبيل المثال ، من خلال ldapsearch:

 ldapsearch -x -h dc1.lab.local -D “user1@lab.local" -s sub "samAccountname=user1" ldapsearch -x -h dc1.lab.local -D "admin@lab.local" -s sub "samAccountname=anyuser" 



افتراضيًا ، لا يمكن للمستخدم تلقي سمات DPAPI إلا لحسابه. ولكن مع امتيازات مرتفعة ، يمكن القيام بذلك لأي حساب ، بما في ذلك حساب الكمبيوتر.

Credential Roaming هي تقنية مريحة للغاية ، ليس فقط للمشرفين ، ولكن أيضًا للمخترعين. بعد الوصول إلى وحدة تحكم المجال عبر ldap ، يمكنك دمج جميع شهادات المستخدم ومفاتيحه الرئيسية وكلمات المرور المشفرة من خلال DPAPI (على سبيل المثال ، كلمات المرور للاتصال بمحركات أقراص الشبكة).

ولماذا لا تضيف هذه الوظيفة إلى dpapick ، ​​فكّرنا وعلمناه كيفية استخراج الشهادات تلقائيًا من وحدة تحكم مجال عبر ldap وفك تشفيرها وإنشاء ملفات pfx.

 ./efs.py –ldap-server <..> --ldap-connect admin:Passw0rd@lab.local --ldap-user user1 --password Password1 ./efs.py –ldap-server <..> --ldap-connect admin:Passw0rd@lab.local --ldap-user user1 --pkey <rsa-priv.pem> 



لتنفيذ البرنامج النصي ، من الضروري تحديد وحدة تحكم المجال كخادم ldap وتفاصيل الاتصال به واسم الحساب الذي نتلقى شهادات له وكلمة مرور لفك تشفير المفتاح الرئيسي (أو مفتاح نسخ احتياطي خاص لوحدة التحكم).

دروببوإكس ذهب في 60 ثانية ...


Dropbox هو مثال آخر على استخدام DPAPI لتخزين أسرار المستخدم. يتم تخزين الرموز المميزة لمصادر الإسقاط في الملفات:

 c:\users\<username>\Appdata\Local\Dropbox\instance1\config.dbx c:\users\<username>\Appdata\Local\Dropbox\instance_db\instanse.dbx 

هذه هي قواعد البيانات sqlite3 المشفرة التي تحتوي على بيانات للاتصال. بالنسبة للتشفير ، يتم استخدام مفتاح متماثل ، والذي بدوره يتم تشفيره عبر DPAPI ويتم تخزينه في السجل:

HKCU\SOFTWARE\Dropbox\ks
HKCU\SOFTWARE\Dropbox\ks1


وبالتالي ، فإن الترتيب العام لاختطاف صندوق الإسقاط هو على النحو التالي:

  1. نأخذ اثنين من ملفات قاعدة البيانات من الكمبيوتر.
  2. نحصل على المفاتيح من التسجيل ونفك تشفيرها باستخدام dpapick ؛
  3. باستخدام DPAPI ، نقوم بتشفير المفاتيح المستلمة على الجهاز الخاص بنا ووضعها في السجل ؛
  4. على الجهاز لدينا استبدال ملفات قاعدة البيانات وتشغيل Dropbox.

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

 $Sid="S-1-5-21-3463664321-2923530833-3546627382-1000"; $key=[Microsoft.Win32.Registry]::USERS.OpenSubKey("$sid\SOFTWARE\Dropbox\ks",[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::ChangePermissions); $acl = $key.GetAccessControl(); $rule = New-Object System.Security.AccessControl.RegistryAccessRule ("administrator","FullControl","Allow"); $acl.SetAccessRule($rule); $key.SetAccessControl($acl); $key_path = "REGISTRY::HKEY_USERS\$Sid\SOFTWARE\Dropbox\ks"; (Get-ItemProperty -Path $key_path -Name Client).Client; 

تحتوي مفاتيح ks و ks1 على رأس (8 بايت) من إصدار dbx قبل النقطة DPAPI و bld md5 HMAC DPAPI (16 بايت الأخيرة). يبدأ blap DPAPI نفسه مع البايت التاسع 0x01000000D0 ... يجب نسخ هذه البايتات بتنسيق base64 إلى ملف ، ثم يتم فك تشفيرها عبر dpapick:

 ./filegeneric.py --sid <..> --password <..> --masterkey <..> --base64file <..> 

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

بالنسبة للتشفير ، يعتبر استخدام بوويرشيل أكثر ملاءمة:

 $hdata="4efebbdf394d4003317fc5c357beac4b"; [Byte[]] $dv0_entropy = 0xd1,0x14,0xa5,0x52,0x12,0x65,0x5f,0x74,0xbd,0x77,0x2e,0x37,0xe6,0x4a,0xee,0x9b; $data = ($hdata -split "(?<=\G\w{2})(?=\w{2})" | %{ [Convert]::ToByte( $_, 16 ) }); Add-Type -AssemblyName System.Security; $dk1 = [system.security.cryptography.protecteddata]::Protect($data,$dv0_entropy,[System.Security.Cryptography.DataProtectionScope]::CurrentUser); $pr=([System.BitConverter]::ToString($dk1));$pr $OBJ_hmac = New-Object System.Security.Cryptography.HMACMD5 $hmac = $OBJ_hmac.ComputeHash($dk1) $pr=([System.BitConverter]::ToString($hmac));$pr 

في هذه الحالة ، hdata هو المفتاح الذي تم استلامه في مرحلة فك التشفير. dv0_entropy هو ثابت الكون المستخدم بواسطة DBOX في DPAPI. إلى النقطة الناتجة ، تحتاج إلى تعيين رأس 8 بايت 0x00000000F6000000 إلى الأمام ، و HMACMD5 + 0x00 إلى الخلف
بعد ذلك ، يمكنك كتابة البيانات إلى مفاتيح التسجيل المناسبة.

DPAPI و RSA SecurID


RSA SecurID هو برنامج عميل يستخدم لإنشاء كلمة مرور لمرة واحدة ، تم تطويره بواسطة RSA.

إنه أمر شائع بالنسبة للشركات الكبيرة ويستخدم DPAPI ، وهو أكثر تعقيدًا. في هذه الحالة ، قرر مهندسو RSA الشعور بالارتباك وتطبيق مخططات DPAPI الأكثر تعقيدًا.

يتم تخزين البيانات المميزة في الملف %LOCALAPPDATA%\RSA\SecurIDStorage ، وهي قاعدة بيانات sqlite3. يحتوي كل رمز مميز مشفر على EnTokenSid المشفر (معلمات التهيئة الأولية لخوارزمية إنشاء التعليمات البرمجية). يتم إنشاء EnTokenSid على أساس DBKey و SID للرمز المميز والمستخدم SID ، ويتم تكوين DBKey بالفعل بواسطة فك تشفير DPAPI DBKeyEnc بالتسلسل التالي:
DBKeyEnc = DPAPI(CurrenUser, DPAPI(LocalSystem(DBKey))

أي أولاً ، يتم تشفير مفتاح DB باستخدام المفتاح الرئيسي للنظام ، ثم يتم تشفير نقطة DPAPI الناتجة مرة أخرى باستخدام المفتاح الرئيسي للمستخدم.

أيضا في قاعدة البيانات هناك CryptoCheckSum من CheckSum:
CryptoCheckSum = نقطة DPAPI (CurrenUser)

وبالتالي ، لكي يعمل SecurIDStorage المدمج على جهازك ، يجب عليك:

  1. نظرًا لحقيقة أن SID للمستخدم متورط في تكوين EncTokenSid ، فمن الضروري تعيين المستخدم الحالي SID على الجهاز الظاهري إلى نفس قيمة SID للمستخدم الذي يتم أخذ قاعدة بيانات SecurIDStorage منه. الأداة المساعدة NewSid من SysInternals ستساعدنا في ذلك ؛
  2. فك تشفير DBKeyEnc باستخدام المفتاح الرئيسي للمستخدم وكلمة المرور أو المفتاح الخاص للنطاق (في حالة أن الجهاز مجال) ؛
  3. فك تشفير نتيجة فك التشفير السابق باستخدام المفتاح الرئيسي للنظام وقيمة المعلمة DPAPI_SYSTEM ؛
  4. فك تشفير CryptoCheckSum باستخدام المفتاح الرئيسي للمستخدم
  5. تشفير قيم DBKey و CheckSum المستلمة بترتيب عكسي بالفعل على جهازك الظاهري ؛
  6. في بعض إصدارات SecurID ، ستحتاج أيضًا إلى تعيين حجم محرك الأقراص الثابتة الخاص بالجهاز الظاهري إلى نفس حجم حجم محرك الأقراص الثابتة للجهاز المصدر ، كما يتحقق البرنامج عند بدء التشغيل.

كما ذكر أعلاه ، من أجل فك تشفير DBKeyEnc ، بالإضافة إلى المفتاح الرئيسي للمستخدم ، سنحتاج أيضًا إلى مفتاح رئيسي للنظام ، بالإضافة إلى القيمة DPAPI_SYSTEM ، التي يتم فك تشفير المفاتيح الرئيسية للنظام بها. DAPPI_SYSTEM هو في الحقيقة مفتاح مسبق تم إنشاؤه بالفعل ، ويشارك في تشكيل مفاتيح النظام الرئيسية. يمكنك الحصول عليها من ذاكرة LSASS (عبر mimikatz أو عن طريق تحليل تفريغ العملية) أو من فروع التسجيل المقابلة (HKLM \ SYSTEM ، HKLM \ SECURITY) ، وإلقاءها وتحليل نفس Impacket.

بعد ذلك ، يمكننا استخدام DPAPI_SYSTEM الذي تم الحصول عليه لفك تشفير النقاط الضرورية باستخدام dpapick (المحلل اللغوي هو أمثلة / filegeneric.py) ، كما هو موضح في لقطات الشاشة التالية:

1) الحصول على DPAPI_SYSTEM عبر mimikatz دون اتصال



2) الحصول على DPAPI_SYSTEM عبر Impacket دون اتصال



3) فك التشفير DPAPIck مع مفاتيح المستخدم والنظام الرئيسي



ورقة الغش


لكي لا تنسَ مكان بيانات محددة ، سنضعها في قسم منفصل:

مفاتيح رئيسية مخصصة

 %APPDATA%\Microsoft\Protect\<SID>\* 

مفاتيح النظام الرئيسية

 Windows\System32\Microsoft\Protect\* 

DPAPI_SYSTEM

 LSASecrets – online SYSTEM, SECURITY (reg save …, system\backup, etc) 

شهادات المستخدم

 %APPDATA%\Microsoft\SystemCertificates\My\Certificates\ %APPDATA%\Microsoft\Crypto\RSA\<SID>\ 

شهادات النظام

 HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\* C:\Programdata\Microsoft\Crypto\RSA\MachineKeys\ 

كروم

 %localappdata%\Google\Chrome\User Data\Default\Cookies %localappdata%\Google\Chrome\User Data\Default\Login Data 

دروببوإكس

 HKCU\SOFTWARE\Dropbox\ks HKCU\SOFTWARE\Dropbox\ks1 %APPDATA%\Local\Dropbox\instance1\config.dbx %APPDATA%\Local\Dropbox\instance_db\instanse.dbx 

Rsa securid

 %LOCALAPPDATA%\RSA\SecurIDStorage 

استنتاج قليل


يعد DPAPI أمرًا رائعًا - الشيء الرئيسي هو فهم كيفية استخدامه عند إجراء دراسات على pentests و RedTeam.

في هذه المقالة ، بحثنا في أمثلة قليلة فقط حيث يمكن تطبيق فك تشفير DPAPI. في الواقع ، النطاق أوسع بكثير. على سبيل المثال ، لم نعتبر RDP (* .rdg) ، Icloud (ملف pList) ، Skype (*. Xml) ، مفاتيح الاتصال بشبكة Wi-Fi. يتم تطبيق DPAPI في كل مكان ويتم تطبيق المحلل اللغوي المقابل كجزء من إطار dpapick.

تتوفر نسخة معدلة من dpapick على GitHub لدينا. نحثك على استخدام هذه الأداة لفك تشفير DPAPI وسنكون ممتنين لمزيد من التطوير لـ dpapick.

ويمكن الاطلاع على بعض المعلومات المثيرة للاهتمام في قناتنا في البرقيات . نحن نتحدث عن IB من خلال عيون RedTeam.

PS بفضل منظمي OFFZONE-2018 لحضور مؤتمر رائع!

PPS الجزء الثاني من المقال هنا

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


All Articles