
Aggrokatz هو إضافة وكيل عدواني لـ Cobalt Strike تمكن pypykatz من التفاعل مع الـ beacons عن بُعد وتتيح له تحليل ملفات تفريغ LSASS وملفات السجل (registry hive) لاستخراج بيانات الاعتماد والأسرار الأخرى المخزنة دون تحميل الملف ودون رفع أي كود مشبوه إلى الـ beacon.

aggrokatz هو امتداد مكون إضافي Aggressor لـ CobaltStrike يتيح لـ pypykatz التفاعل مع الـ Beacons عن بُعد.
النسخة الحالية من aggrokatz تسمح لـ pypykatz بتحليل ملفات تفريغ LSASS وملفات سجل Registry لاستخراج بيانات الاعتماد والأسرار الأخرى المخزنة دون تحميل الملف ودون تحميل أي كود مشبوه إلى الـ beacon (Cobalt Strike موجود على أي حال).
في المستقبل، يهدف هذا المشروع إلى توفير ميزات إضافية للعمليات السرية مثل البحث وفك تشفير جميع أسرار DPAPI/kerberoasting وغيرها.
لقد نشرنا منشور مدونة قصيرًا لهذا الإصدار من الأداة، والذي يتضمن أيضًا بعض لقطات الشاشة.
تفريغ LSASS/Registry ليس الهدف من هذا المشروع، بل التحليل فقط. الأسباب:
CredBandit التي تفرغ البايتات الخام إلى القرص بدلاً من base64. أداة رائعة، جربها.في عميل CS، لا تستخدم "reload" ولا تحاول تفريغ البرنامج النصي يدويًا ثم إعادة تحميله إذا قمت بتعديله. يجب عليك تفريغه، إغلاق العميل، ثم فتحه من جديد، ثم تحميل البرنامج النصي المعدل. وإلا سيكون لديك عدة نسخ تعمل في وقت واحد وستظهر أخطاء كثيرة وسلوكيات غريبة!
أثناء تحليل ملفات LSASS/registry على الجهاز البعيد، يُرجى عدم التفاعل مع الـ beacon المحدد الذي بدأت البرنامج النصي عليه. عادةً لن يسبب ذلك أي مشاكل، لكن لا يمكنني تقديم أي ضمانات.
pycobalt. يوجد ملف readme على صفحة GitHub الخاصة بهم.pypykatz ويجب أن يكون الإصدار >=0.4.8aggressor.cna الخاص بـ pycobalt وأنه يعرف موقع مترجم Python الخاص بك.aggrokatz.cna ليشير إلى pycobalt.cnaView > Script Console و Cobalt Strike > Script Manager. باستخدام Script Manager قم بتحميل البرنامج النصي aggkatz.cna.aggkatz.cna بنجاح، سيكون لديك عنصر قائمة جديد pypykatz عند النقر بزر الماوس الأيمن على الـ beacon.Script Console.Script Console ونافذة الـ Beacon نفسها.LSASS file: موقع ملف lsass.dmp على الكمبيوتر البعيد. يمكنك أيضًا استخدام مسارات UNC للوصول إلى ملفات lsass.dmp المشتركة عبر SMBchunksize : الحد الأقصى للكمية التي ستُقرأ في المرة الواحدةBOF file : ملف BOF (Beacon Object File) الذي يسمح بقراءة مقسمة. سيتم تحميل هذا الملف وتنفيذه (في الذاكرة) في كل مرة يتم فيها قراءة جزء جديد.(module) : يحدد الوحدات التي سيتم تحليلها. الافتراضي: allOutput : يحدد تنسيق (تنسيقات) الإخراجPopulate Credential tab : بعد التحليل الناجح، ستكون جميع بيانات الاعتماد التي تم الحصول عليها متاحة في علامة تبويب Credential في Cobalt Strike. هذه الميزة في مرحلة تجريبيةDelete remote file after parsing : بعد التحليل الناجح، سيتم إزالة ملف تفريغ LSASS من الهدفSYSTEM file: موقع ملف SYSTEM.reg على الكمبيوتر البعيد. يمكنك أيضًا استخدام مسارات UNC للوصول إلى الملفات المشتركة عبر SMBSAM file (optional): موقع ملف SAM.reg على الكمبيوتر البعيد. يمكنك أيضًا استخدام مسارات UNC للوصول إلى الملفات المشتركة عبر SMBSECURITY file (optional): موقع ملف SECURITY.reg على الكمبيوتر البعيد. يمكنك أيضًا استخدام مسارات UNC للوصول إلى الملفات المشتركة عبر SMBSOFTWARE file (optional): موقع ملف SOFTWARE.reg على الكمبيوتر البعيد. يمكنك أيضًا استخدام مسارات UNC للوصول إلى الملفات المشتركة عبر SMBchunksize : الحد الأقصى للكمية التي ستُقرأ في المرة الواحدةBOF file : ملف BOF (Beacon Object File) الذي يسمح بقراءة مقسمة. سيتم تحميل هذا الملف وتنفيذه (في الذاكرة) في كل مرة يتم فيها قراءة جزء جديد.Output : يحدد تنسيق (تنسيقات) الإخراجيدعم BOF لقراءة الملفات حاليًا قراءة ملفات يصل حجمها إلى 4 جيجابايت. يمكن توسيع هذا النطاق مع بعض التعديلات، ولكن لم يتم ملاحظة مثل هذه الملفات الكبيرة حتى الآن.
عادةً، يقوم محلل pypykatz بتنفيذ سلسلة من عمليات قراءة الملفات على القرص، ولكن بمساعدة aggrokatz، يتم توجيه عمليات القراءة هذه إلى الـ beacon باستخدام BOF (Beacon Object File) مصمم خصيصًا يسمح بقراءة محتويات الملف البعيد على شكل أجزاء. وهذا يسمح لـ pypykatz باستخراج جميع الأسرار من الملفات البعيدة دون قراءة الملف بأكمله، بل فقط اقتطاف الأجزاء الضرورية التي توجد بها الأسرار.
للحصول على الصورة الكاملة للعملية بأكملها، هناك جزئان نحتاج إلى تسليط الضوء عليهما:
pypykatz مع CobaltStrikepypykatz باستخراج بيانات الاعتماد دون قراءة الملف بأكملهCobaltStrike (الوكيل) مكتوب بلغة Java، بينما pypykatz مكتوب بلغة Python. هذه مشكلة. لحسن الحظ، قام شخص مجهول بإنشاء pycobalt الذي يوفر واجهة أنيقة بين العالمين مع واجهات برمجية مفيدة يمكن استدعاؤها مباشرة من Python. على الرغم من أن pycobalt قطعة رائعة من الهندسة، إلا أن هناك بعض المشكلات/العيوب التي نحتاج إلى توضيحها:
pycobalt:pycobalt في المستقبل.pycobalt.pycobalt و CobaltStrike. يؤدي ذلك إلى بعض استدعاءات واجهات البرمجة التي تعيد بايتات لا يمكن استخدامها لأن بعض البايتات تتعطل بواسطة المُشفر. من خلال فحص الكود، نستنتج أن معظم مشكلات الترميز/فك الترميز ترجع إلى أن pycobalt يستخدم STDOUT/STDIN للتواصل مع عملية Java.bof_pack الذي يعتبر حاسمًا لهذا المشروع، كان يجب تنفيذه كبرنامج نصي Aggressor نقي واستدعاؤه فقط من Python باستخدام هياكل بيانات أساسية (string و int) وليس باستخدام بايتات.pycobalt بدون دعم خيوط المعالجة (threading). حسنًا، على الأقل لاحظنا أن الخيوط تنفصل عشوائيًا، لكننا توقعنا هذا إلى حد ما.كان لا بد من تعديل pypykatz ووحدته المصاحبة minidump للسماح بتحليل مجزأ أكثر كفاءة مما كان مطبقًا سابقًا، لكن هذا موضوع ليوم آخر.
بعد أن أصبح pypykatz قادرًا على التفاعل مع CobaltStrike عبر pycobalt، كانت الخطوة التالية هي السماح بقراءة الملفات المجزأة. لسوء الحظ، هذه الميزة غير متوفرة بشكل افتراضي في أي من حلول C2 التي رأيناها، لذا كان علينا تنفيذها. الطريقة التي تعاملنا بها مع هذه المشكلة هي تنفيذ القراءة المجزأة باستخدام واجهة Beacon Object Files الخاصة بـ CobaltStrike، والمختصرة بـ BOF. BOFs هي برامج C تعمل على الـ beacon ليس كملف تنفيذي منفصل ولكن كجزء من الـ beacon الجاري بالفعل. هذه الواجهة مفيدة للغاية لأنها تجعل BOFs أكثر سرية حيث يتم تنفيذ كل الكود في الذاكرة دون كتابة أي شيء على القرص.
حلنا لـ BOF هو دالة بسيطة تأخذ 4 معاملات:
fileName : المسار الكامل لملف تفريغ LSASS أو سجل Registry (على الجهاز البعيد)buffsize : الكمية (بالبايت) التي سيتم قراءتها من الملفseekSize : الموضع الذي يجب أن تبدأ منه عملية قراءة الملف (من بداية الملف)rplyid : رقم تعريف يتم تضمينه في الرد لتجنب التصادمات المحتملةباستخدام هذه المعاملات، يمكن لـ pypykatz (الذي يعمل على الوكيل) إصدار عمليات قراءة ملفات على الـ beacon (الكمبيوتر الهدف) تستهدف أجزاء معينة من الملف.
على الجانب الآخر (في CobaltStrike)، يقوم aggrokatz بتسجيل استدعاء راجعة (callback) لمراقبة كل رسالة يتم إرجاعها بواسطة الـ beacon الهدف. إذا تطابق رأس الرسالة مع رأس عملية قراءة ملف، فسيتم معالجتها كجزء من ملف minidump وسيتم إرسالها إلى محلل minidump الذي سيرسل النتيجة إلى pypykatz. في حالة الحاجة إلى مزيد من القراءة، سيصدر pypykatz عملية قراءة باستخدام قارئ minidump الذي سيرسل أمر قراءة جديد إلى الـ beacon عبر واجهة BOF. تتكرر هذه العملية حتى يتم تحليل الملف.
بعد تحليل حوالي 100 تفريغ LSASS باستخدام هذه الطريقة، يمكننا ذكر ما يلي (حجم الجزء المستخدم كان 20 كيلوبايت):
dcsync - مؤلف pycobalt
@anthemtotheego تويتر - منشئ CredBandit
Nicol Jos @shinepaw - تصميم الشعار