
إضافة Burp Suite لإجراء مصادقة Kerberos
تم إصداره كمصدر مفتوح بواسطة NCC Group Plc - http://www.nccgroup.trust/
تم تطويره بواسطة Richard Turnbull، richard [dot] turnbull [at] nccgroup [dot] com
http://www.github.com/nccgroup/Berserko
تم إصداره بموجب رخصة AGPL، راجع ملف LICENSE لمزيد من المعلومات
سيستمر التطوير الإضافي لـ Berserko في https://github.com/rteatea/Berserko
Berserko هو امتداد لـ Burp يضيف دعمًا لإجراء مصادقة Kerberos. وهذا مفيد للاختبار داخل نطاق ويندوز عندما لا تكون مصادقة NTLM مدعومة (يتعامل Burp بالفعل مع NTLM). لا يتطلب Berserko أن يكون الجهاز الذي يعمل عليه Burp منضمًا إلى النطاق (أو حتى أن يكون يعمل بنظام ويندوز).
الحل الوحيد الموجود حاليًا الذي نعرفه لاختبار تطبيقات Kerberos باستخدام Burp هو المرور عبر Fiddler في سلسلة بروكسي، مع إعداد المصادقة وفقًا لهذه التعليمات. لكن Fiddler يعمل على ويندوز فقط، كما أن ربط البروكسيات في سلسلة يضيف تعقيدًا ويُضعف الأداء، لذا من الجيد توفر إمكانية Kerberos داخل Burp نفسه.
احصل على أحدث ملف jar لـ Berserko من تبويب Releases، أو من مجلد berserko\releases
انتقل إلى تبويب Extender في Burp، واختر Add، وتأكد من تحديد Java كـ Extension type (نوع الامتداد)، ثم وجّهه إلى ملف jar. إذا سارت الأمور على ما يرام، فسيتم إضافة تبويب Berserko إلى واجهة Burp.
توجد عناصر تحكم متعددة في تبويب Berserko داخل Burp.
خانة الاختيار Do Kerberos authentication هي مفتاح رئيسي. وطالما لم يتم تفعيلها، لن يقوم Berserko بأي شيء على الإطلاق.
زر Restore defaults يعيد Berserko إلى الإعداد الافتراضي (الذي لا يحتوي على أي تفاصيل نطاق أو بيانات اعتماد مستخدم).
زر Clear Kerberos state يمسح جميع تذاكر Kerberos وغيرها من الحالة على العميل. السبب الوحيد الذي قد تحتاج فيه لاستخدام هذا هو إذا كانت قد أُجريت تغييرات على إعداد Kerberos في جانب الخادم وأردت البدء من حالة نظيفة.
زر Write tickets to log يكتب معلومات حول تذاكر Kerberos الحالية إلى دفق سجل Berserko - وهذا قد يكون مفيدًا للتصحيح واستكشاف الأخطاء. لعرض السجلات انتقل إلى تبويب Extender في Burp، وحدد Berserko، ثم انظر إلى تبويب Output بالأسفل. قد يكون من المنطقي استخدام خيار Save to file هنا، لأن بيانات التذاكر يمكنها بسهولة ملء المخزن المؤقت للسجل في الواجهة الرسومية.
تحتوي بعض عناصر التحكم على زر مساعدة يعرض مزيدًا من المعلومات.
حدد Domain DNS Name (اسم DNS للنطاق) وKDC Host (مضيف KDC) باستخدام عناصر التحكم في هذا القسم. لا يمكن تحرير مربعات النص مباشرة؛ يجب استخدام زر 'Change' لتعديلها.
يجب أن يكون Domain DNS Name هو اسم DNS للنطاق الذي ترغب في المصادقة ضده (بدقة أكبر، هذا هو في الواقع عالم Kerberos (Realm)). يجب أن يكون شيئًا مثل mydomain.acme.local. ويجب ألا يكون اسم NETBIOS للنطاق (والذي سيكون شيئًا مثل MYDOMAIN).
يجب أن يكون KDC Host هو اسم المضيف (أو عنوان IP) لخادم KDC الخاص بـ Kerberos (مركز توزيع المفاتيح). في نطاق ويندوز، يكون KDC ببساطة وحدة تحكم النطاق.
بعد توفير Domain DNS Name، يمكنك استخدام زر Auto لمحاولة تحديد موقع KDC تلقائيًا. يقوم بذلك عن طريق إرسال استعلام DNS SRV لخدمة Kerberos. إذا كان أحد خوادم DNS لديك هو وحدة تحكم نطاق للنطاق الصحيح، فيجب أن يعمل هذا. وإلا فلن يعمل. ❗لن تعمل هذه الوظيفة في الإصدارات الحديثة من Burp، لأن مكتبات DNS المطلوبة لا تُشحن كجزء من JRE المرفقة. يمكنك تجاوز ذلك بالتشغيل باستخدام JRE كاملة كما هو موضح في أعلى هذا README.❗
عند إدخال Domain DNS Name وKDC Host، استخدم زر Test domain settings لاختبار الاتصال. إذا سارت الأمور على ما يرام، فستحصل على استجابة Successfully contacted Kerberos service.
راجع هذا الملف لمزيد من المعلومات حول الحصول على القيم الصحيحة لإعدادات النطاق هذه.
حدد Username (اسم المستخدم) وPassword (كلمة المرور) لحساب في النطاق باستخدام عناصر التحكم في هذا القسم. لا يمكن تحرير مربعات النص مباشرة؛ يجب استخدام زر 'Change' لتعديلها.
يجب أن يكون Username هو اسم المستخدم العادي فقط. يجب أن يكون شيئًا مثل bob. ويجب ألا يكون MYDOMAIN\bob أو [email protected] أو ما شابه.
بعد توفير بيانات الاعتماد، يمكنك استخدام زر Test credentials. سيحاول هذا الحصول على تذكرة منح التذاكر (Ticket-Granting Ticket) الخاصة بـ Kerberos للمستخدم المحدد. إذا نجح الأمر، ستحصل على استجابة TGT successfully acquired. إذا لم ينجح، فاعلم أن هذه محاولة مصادقة على النطاق، لذا كن حريصًا على عدم قفل حسابك.
لن يتم حفظ كلمة المرور في إعدادات Berserko للمرة القادمة ما لم تكن خانة الاختيار Save password in Burp config? محددة. ومع ذلك، سيتم حفظ جميع الإعدادات الأخرى.
تستخدم بعض التطبيقات تفويض Kerberos في جانب الخادم لإعادة توجيه هوية العميل إلى خوادم أخرى (لكن لا توجد طريقة سهلة لتحديد ما إذا كان هذا قيد الاستخدام من جانب العميل).
يدعم Berserko هذا، لكن هناك عقبة. التفويض يعمل فقط إذا كان المستخدم لديه TGT قابل للتحويل (forwardable) (تذكرة منح التذاكر). وللأسف، لا يوفر تنفيذ Java لـ Kerberos طريقة لتحديد برمجيًا أنه يجب الحصول على تذكرة قابلة للتحويل. لا يمكن فعل ذلك إلا بإضافة إدخال مناسب إلى ملف الإعداد krb5.conf.
لذا، لكي يعمل التفويض، يجب توجيه Berserko إلى ملف krb5.conf مناسب، وهناك طريقتان محتملتان هنا.
أسهل ما يمكن فعله، وهو النهج الموصى به، هو استخدام زر Create krb5.conf file. سينشئ لك ملفًا مناسبًا في الموقع الذي تختاره. يمكنك وضعه في مجلد مؤقت، أو في مجلد مشروعك، أو في أي مكان. لكن يمكن إعادة استخدام الملف نفسه إلى أجل غير مسمى، لذا قد يكون من المنطقي وضعه في مكان أكثر ديمومة. يتيح لك زر Change تحديد ملف مختلف لاستخدامه.
إذا كنت مهتمًا، فإن ملف krb5.conf الذي يتم إنشاؤه بسيط جدًا وسيحتوي على المحتوى التالي:
[libdefaults]
forwardable = true
بدلاً من ذلك، يمكنك استخدام زر Change للإشارة إلى ملف krb5.conf موجود على النظام. السبب الوحيد الذي قد يجعلك ترغب في فعل ذلك هو إذا كانت هناك إعدادات Kerberos مهمة أخرى في هذا الملف تريد أن يلتقطها Berserko (وهو ما يجب أن يعمل جيدًا من الناحية النظرية، لكن لم يتم اختباره عمليًا). لاحظ أن الموقع الافتراضي لهذا الملف على لينكس هو /etc/krb5.conf - أما أنظمة التشغيل الأخرى فمن غير المرجح أن تحتوي على واحد. إذا كنت تشير إلى ملف krb5.conf موجود، فتأكد من تحريره لتفعيل التحويل (Forwarding) - أضف forwardable = true إلى قسم [libdefaults] (أو لكل عالم Realm على حدة). لكن كن حذرًا. مطالبة Berserko بإنشاء الملف لك ستكون الخيار الأفضل في 99% من الحالات.
إذا كنت تريد معرفة ما إذا كان إعداد التفويض ناجحًا، استخدم زر Check current config. سيخبرك ما إذا تم العثور على ملف krb5.conf، وما إذا كان إعداد forwardable صحيحًا. لاحظ أيضًا أن Berserko سيخبرك ما إذا نجح في الحصول على TGT قابل للتحويل عند استخدام زر Test credentials.
من الجيد التأكد من حصولك على تذكرة قابلة للتحويل قبل أن تبدأ في استخدام أحد التطبيقات. يبدو أن IIS يمكنه تخزين حالة مصادقة المستخدم في جانب الخادم مؤقتًا بطريقة تجعل الانتقال من تذكرة غير قابلة للتحويل إلى تذكرة قابلة للتحويل لا يعمل.
تتحكم الإعدادات في هذا القسم في ما إذا كان Berserko يحاول مصادقة Kerberos 'بشكل تفاعلي' (أي انتظار الحصول على استجابة 401 من الخادم ثم إعادة إرسال الطلب مع إضافة ترويسة مصادقة Kerberos إليه) أم 'بشكل استباقي' (أي إضافة ترويسة مصادقة Kerberos إلى الطلب الصادر).
ميزة المصادقة الاستباقية هي أنها تتطلب جولة اتصال HTTP واحدة فقط، بينما تتطلب المصادقة التفاعلية جولتين. عيب المصادقة الاستباقية هو أنه من الممكن إرسال ترويسات مصادقة Kerberos إلى مضيفات لا تتوقعها. كما أن Berserko أكثر قدرة على تشخيص أخطاء المصادقة عند استخدام الاستراتيجية التفاعلية.
خيار Proactive Kerberos authentication, only after initial 401 received هو نهج هجين يجمع بين هاتين الطريقتين، حيث سيقوم Berserko بالمصادقة بشكل تفاعلي عند أول طلب إلى مضيف، لكنه سيكون استباقيًا بعد ذلك.
في هذا القسم، يمكنك تحديد المضيفات التي تعتبر ضمن نطاق مصادقة Kerberos.
بشكل افتراضي، ستكون خانة All hosts in this Kerberos domain in scope for Kerberos محددة. هذا يعني أن Berserko سيحاول مصادقة Kerberos فقط مع خوادم الويب التي ينتهي اسم مضيفها باسم DNS للنطاق. في كثير من الحالات سيكون هذا كافيًا. ومع ذلك، من الممكن وجود تطبيقات ويب مفعّل لها Kerberos باسم مضيف لا يأخذ هذا الشكل (بافتراض أن المسؤول قد أعد اسم خدمة رئيسي مناسب (Service Principal Name)). لمراعاة ذلك، يمكنك إضافة مضيفات إضافية لتعتبر ضمن النطاق باستخدام قائمة الخانات على اليمين. لاحظ أنه يمكن استخدام أحرف البدل (Wildcards) ( * يطابق صفرًا أو أكثر من الأحرف، ? يطابق أي حرف باستثناء النقطة).
بدلاً من ذلك، يمكنك تحديد خانة All hosts in scope for Kerberos authentication. من الواضح أن لهذا ميزة عدم الحاجة إلى عناء تحديد النطاق يدويًا. العيب المحتمل لهذا الإعداد هو أنه قد يؤدي إلى قيام Berserko بإرسال طلبات Kerberos إلى KDC للحصول على تذاكر خدمة لمضيفات ليست في النطاق. قد يتسبب هذا في مشاكل في الأداء، وقد يسبب مشاكل في الخصوصية (إذا كنت لا تريد تسريب هذه المعلومات إلى KDC). من المرجح أن تكون هذه مشكلة خاصة مع استراتيجية Proactive Kerberos authentication، وفي هذه الحالة سيحاول Berserko إضافة ترويسة مصادقة Kerberos إلى كل طلب يمر عبر Burp. هذا المزيج من الخيارات غير موصى به، وسيحذرك Berserko إذا تم تحديده (لكنه لن يمنعه فعليًا).
إذا لم يتم تحديد أي من All hosts in this Kerberos domain in scope for Kerberos ولا All hosts in scope for Kerberos authentication، فإن المضيفات الوحيدة ضمن النطاق ستكون تلك المضافة إلى قائمة الخانات.
خيار Plain hostnames considered part of domain، إذا تم تحديده، يعني أن 'أسماء المضيفات البسيطة' (أي أسماء المضيفات التي تتكون من مكوّن واحد فقط) ستعتبر جزءًا من النطاق (وبالتالي ستكون تلقائيًا ضمن النطاق إذا تم تحديد All hosts in this Kerberos domain in scope for Kerberos). السبب الرئيسي الذي قد يجعلك ترغب في تعطيل هذا هو إذا كان جهازك منضمًا إلى نطاق مختلف عن النطاق الذي تتم المصادقة ضده باستخدام Berserko (وفي هذه الحالة، تشير أسماء المضيفات البسيطة على الأرجح إلى مضيفات في النطاق الذي أنت منضم إليه).
إذا تم تحديده، فإن خيار Do not perform Kerberos authentication to servers which support NTLM سيوجه Berserko إلى عدم محاولة مصادقة Kerberos ضد المضيفات التي تدعم NTLM بالإضافة إلى Kerberos (أي المضيفات التي تُرجع ترويستي WWW-Authenticate: NTLM وWWW-Authenticate: Negotiate معًا).
يمكن ضبط Alert Level (مستوى التنبيهات) وLogging Level (مستوى التسجيل) هنا، إما NONE أو NORMAL أو VERBOSE.
Alert Level يتحكم في كمية المعلومات المرسلة إلى تبويب Alerts في Burp.
Logging Level يتحكم في كمية المعلومات المرسلة إلى المخرجات القياسية لـ Berserko (يمكن عرضها في تبويب Extender). لاحظ أن رفع Logging Level إلى VERBOSE سيؤدي إلى توفير مزيد من المعلومات حول أي أخطاء أو استثناءات قد تحدث.
إذا كانت علاقات الثقة بين نطاقات Kerberos مستخدمة في بيئتك، يمكنك العثور على بعض الإرشادات هنا.
بشكل افتراضي، يقوم Berserko بجميع تفاعلات Kerberos مع KDC عبر UDP (المنفذ 88). إذا كنت تريد استخدام TCP بدلاً من ذلك، فهذا ممكن. السبب الأكثر شيوعًا للقيام بذلك هو على الأرجح عند استخدام إعادة توجيه منفذ SSH لمنفذ TCP 88. فقط أضف udp_preference_limit = 1 إلى ملف krb5.conf الخاص بك، بحيث يبدو هكذا:
[libdefaults]
forwardable = true
udp_preference_limit = 1
من الممكن ضبط SPN الذي سيُستخدم لمضيف معين، عبر تضمين قسم [berserko_spn_hints] في ملف krb5.conf (انظر أعلاه). الصيغة موضحة أدناه.
[berserko_spn_hints]
[email protected]
server2.bar.org=app.domain2.local
الخادم الهدف على الجانب الأيسر من علامة التساوي، وSPN المطلوب استخدامه على اليمين. يمكن اختياريًا تحديد عالم (Realm) للـ SPN (إذا لم يتم تحديده، سيحاول Berserko تحديد العالم الصحيح كالمعتاد). لا تُدرج جزء HTTP/ من الـ SPN هنا.
Berserko غير متوافق مع Burp v2 قبل الإصدار v2020.5.1. لا توجد مشاكل مع Burp v1.
سبب ذلك هو أن إصدار OpenJDK الذي يتم شحنه مع إصدارات Burp 2 الأقدم لا يتضمن بعض وظائف Kerberos التي يستخدمها Berserko. سيؤدي هذا إلى ظهور خطأ java.lang.ClassNotFoundException: com.sun.security.jgss.ExtendedGSSContext عند محاولة استخدام Berserko.
الحل البديل الواضح هو الترقية إلى v2020.5.1 أو أحدث. بدلاً من ذلك، يجب أن يعمل Berserko مع أي إصدار من Burp v2 إذا قمت بالتشغيل باستخدام نسخة كاملة من بيئة تشغيل Java (أي وليس النسخة المرفقة مع Burp).
بافتراض أن لديك java في مسار الأوامر (PATH):
java -jar burpsuite_pro.jar