Cobalt Strike 4.5 نسخة مكسورة/مصدّعة، إزالة بصمة checksum8، تجاوز BeaconEye، إصلاح تسريب المرحلة (stage) من مسار الأخطاء، إضافة تحقق ثنائي العوامل TOTP، إصلاح CVE-2022-39197 وغيرها
كسر إصدار cobaltstrike4.5، إزالة ميزة checksum8، تجاوز BeaconEye، إصلاح تسريب stage عبر المسار الخاطئ، إضافة التحقق ثنائي العوامل totp، إضافة تشفير اسم المستخدم للعرض، إصلاح خطأ الاشتقاق foreign في إصدار 4.5، تعديل اسم ملف إعدادات العميل، إلخ
كسر cobalt strike4.5
كسر cobaltstrike4.5
[TOC]
هذه الأداة ومحتوى المقال مخصصان للبحث الأمني فقط، ويتحمل المستخدم كافة المسؤوليات القانونية ذات الصلة الناتجة عن استخدام هذه الأداة ومحتوى المقال! المؤلف لا يتحمل أي مسؤولية قانونية! إذا قمت بأي سلوك غير قانوني أثناء استخدام هذه الأداة ومحتوى المقال، فستتحمل العواقب بنفسك، ولن نتحمل أي مسؤولية قانونية أو مسؤولية تضامنية. خلاف ذلك، يرجى عدم تثبيت هذه الأداة أو استخدامها. إن سلوكك في الاستخدام أو إشارتك بأي طريقة أخرى صريحة أو ضمنية إلى قبولك لهذا الاتفاق، يُعتبر بمثابة قراءتك وموافقتك على الالتزام بهذا الاتفاق. عند استخدام هذه الأداة للبحث الأمني، يجب عليك التأكد من أن هذا السلوك يتوافق مع القوانين واللوائح، وأنك حصلت على تفويض كافٍ. يرجى عدم استخدامها ضد أهداف غير مصرح بها.
نعم، لقد عدت مرة أخرى، متابعًا مشروع cobaltstrike4.4_cdf الأصلي: https://github.com/lovechoudoufu/about_cobaltstrike4.4_cdf هذه المرة هو إصدار 4.5. تم حذف الإصدار 4.4 السابق من GitHub، وأتوقع أنه لن يمر وقت طويل قبل حذف هذا المشروع أيضًا ~.
يُنصح بالانضمام إلى مجموعة تيليجرام، حيث يمكن تنزيل التحديثات الأخرى لاحقًا أو المشروع بعد حذفه من داخل المجموعة:

قبل الاستخدام، يرجى التحقق بدقة من تجزئة (hash) ملف jar للإصدار المقابل.
عملية التحقق من الشهادة (مثال 4.3): في إصدار 4.5 كانت هناك تغييرات طفيفة في النهاية.
مفاتيح فك التشفير الرسمية لكل إصدار:
4.0 1be5be52c6255c33558e8a1cb667cb06
4.1 80e32a742060b884419ba0c171c9aa76
4.2 b20d487addd4713418f2d5a3ae02a7a0
4.3 3a4425490f389aeec312bdd758ad2b99
4.4 5e98194a01c6b48fa582a6a9fcbb92d6
cobaltstrike.auth ملف مفتاح المصادقة، مشفر بـ RSA، محتوى فك التشفير:
4.3
-54, -2, -64, -45, //文件头
0, 77, //后续长度
1, -55, -61, 127, //证书时间限制29999999(永久)
0, 0, 0, 1, //watermark(水印)
43, //版本
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103
مع كل تحديث للإصدار، يزداد الطول المقابل بمقدار 17، ويزداد المفتاح بمقدار 17 بايت.
في aggressor/Agressor.class، يبدأ التحقق من الترخيص من License.checkLicenseGUI(new Authorization());:

تقوم isValid وisPerpetual وisExpired وisAlmostExpired في License.checkLicenseGUI بالحكم على ما إذا كان الترخيص صالحًا وما إذا كان منتهيًا:

في فئة Authorization تتم معالجة ملف cobaltstrike.auth، حيث يتم قراءة محتوى الملف واستدعاء AuthCrypto().decrypt لمعالجة المحتوى:

في مُنشئ AuthCrypto() يتم استدعاء load()، وتقوم دالة load() بإجراء فحص MD5 على resources/authkey.pub، ثم تحصل على المفتاح العام RSA:

في decrypt() يتم استدعاء _decrypt لفك تشفير محتوى ملف cobaltstrike.auth باستخدام المفتاح العام RSA وتعيين النتيجة للمصفوفة var2، ثم يتم استخدام DataParser للتحويل وتعيينها لـ var3. يتم استخدام طريقة readInt() للحصول على أول أربعة بايتات من var3 للحكم على رأس الملف (-889274181 لإصدارات 3.x؛ -889274157 لإصدارات 4.x). ثم من var3 يتم استخدام readShort() للحصول على بايتين كطول وتعيينهما لـ var5، ثم var6 = var3.readBytes(var5) للحصول على محتوى بهذا الطول وتعيينه لـ var6 وإرجاعه:

المصفوفة arrayOfByte2 التي تم الحصول عليها في فئة Authorization هي المحتوى بعد إزالة أول ستة بايتات. يستمر معالجة مصفوفة arrayOfByte2، حيث يتم أولاً الحصول على أربعة أرقام وتعيينها لـ i، ثم الحصول على 4 أرقام وتعيينها لـ watermark، ثم الحصول على رقم واحد وتعيينه لـ b1، والتحقق من أن b1 أقل من 43، والتحقق من أن i يساوي 29999999. في common/ListenerConfig، عندما يتم الحكم على أن watermark يساوي 0، يتم إضافة علامة كشف مكافحة الفيروسات:


بعد إزالة أول 6 بايتات، ثم إزالة الـ 9 بايتات المكونة من i وwatermark وb1، فإن ما تبقى هو المفاتيح منذ 4.0 حتى 4.3، ببنية: 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20:
byte b2 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte3 = dataParser.readBytes(b2); //获取16位,为4.0的key
byte b3 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte4 = dataParser.readBytes(b3); //获取16位,为4.1的key
byte b4 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte5 = dataParser.readBytes(b4); //获取16位,为4.2的key
byte b5 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte6 = dataParser.readBytes(b5); //获取16位,为4.3的key赋值给arrayOfByte6
في فئة Authorization يتم استدعاء طريقة SleevedResource.Setup لمعالجة arrayOfByte6. في SleevedResource يتم تعيين المفتاح كمفتاح فك تشفير AES وHmacSHA256، ويتم استدعاء فك التشفير في _readResource عبر this.data.decrypt(arrayOfByte1);، والمحتوى الذي يتم فك تشفيره هو ملفات dll الموجودة في /sleeve/:

في SleeveSecurity يتم تعيين مفاتيح فك تشفير AES وHmacSHA256، ويتم استخدام القيمة المُمررة لحساب ملخص (Digest) بطول 256، ثم يتم أخذ البايتات 0-16 كمفتاح AES، والبايتات 16-32 كمفتاح HmacSHA256:

إذا لم يتم الحصول على المفتاح المقابل، فلن يكون من الممكن فك تشفير ملفات dll في مجلد sleeve، وعند الاتصال بالخادم ستظهر رسالة الخطأ [Sleeve] Bad HMAC:

يمكن الرجوع إلى جزء فك تشفير hmac: Cobaltstrike 4 كسر: أصدر لنفسي ترخيصًا (license)
لذا فإن مفتاح إكمال الكسر هو مفتاح إصدار cs المقابل.
وفقًا للوصف الرسمي، أضاف إصدار 4.5 أمانًا جديدًا للترخيص، وهذا صحيح بالفعل،

لذا نحتاج إلى فك تشفير ملف auth المسرّب لنرى ما الذي أُضيف:

بعد موضع key الخاص بإصدار 4.5 توجد سلسلة إضافية، وهذه الإضافات هي watermarkHash الجديد في هذا الإصدار:

يرتبط watermarkHash بتوليد الـ beacon ويرتبط بملفات dll في مجلد sleeve، وبدونه أو إذا كان خاطئًا لن يتمكن الـ beacon من الاتصال عبر الإنترنت. ربما يمكن للجهة الرسمية تتبع مصدر التسريب من خلال هذا watermarkHash.

قم بتعليق الكود الآخر، واكتب المعلمة المُعينة بعد فك تشفير RSA في AuthCrypto().decrypt بشكل ثابت:

byte[] var4 = {1, -55, -61, 127, 0, 1, -122, -96, 45, 16, 27, -27, -66, 82, -58, 37, 92, 51, 85, -114, -118, 28, -74, 103, -53, 6, 16, -128, -29, 42, 116, 32, 96, -72, -124, 65, -101, -96, -63, 113, -55, -86, 118, 16, -78, 13, 72, 122, -35, -44, 113, 52, 24, -14, -43, -93, -82, 2, -89, -96, 16, 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103, 16, 94, -104, 25, 74, 1, -58, -76, -113, -91, -126, -90, -87, -4, -69, -110, -42, 16, -13, -114, -77, -47, -93, 53, -78, 82, -75, -117, -62, -84, -34, -127, -75, 66, 0, 0, 0, 24, 66, 101, 117, 100, 116, 75, 103, 113, 110, 108, 109, 48, 82, 117, 118, 102, 43, 86, 89, 120, 117, 119, 61, 61};
مبدأ Javaagent: https://www.cnblogs.com/rickiyang/p/11368932.html
أداة الكسر يمكن الرجوع إليها: https://github.com/Twi1ight/CSAgent
جوهر الكسر لا يزال يتطلب مفتاح إصدار cs المقابل
في beacon/BeaconData يتم تثبيت قيمة طريقة shouldPad على false:

ألغام خفية جديدة في 4.4
(سابقًا تم تحليل التحقق من الترخيص باستخدام 4.3 كمثال، وبعد التبديل إلى 4.4 اكتشفت أن البرنامج يخرج من التشغيل عند الجري، حيث توجد ألغام خفية جديدة)
بالمقارنة مع exit الخاص بـ this.shouldPad السابق، تمت أيضًا إضافة فحص .class في common/Helper، فقط قم بتعليقه:

تمت إضافة فحص .class في common/Starter، فقط قم بتعليقه:

تمت إضافة فحص .class في common/Starter2، فقط قم بتعليقه:

تمت إضافة فحص .class في beacon/CommandBuilder: (هذا اللغم الخفي حقير فعلاً، فبعد اتصال متواصل لمدة 4 ساعات بين العميل والخادم لا يمكن تنفيذ الأوامر، ولم أكتشفه أبدًا لأنني لم أتصل بهذه المدة من قبل، ggg)

ألغام خفية جديدة في 4.5
أضاف إصدار 4.5 مجموعة من الألغام الخفية ضد javaagent، ويمكن لمن يقوم بفك تجميع حزمة jar للكسر تجاهلها، فقط ابحث عن javaagent وعدّلها واحدًا تلو الآخر:

بعد إزالة هذه المواضع يمكننا العودة إلى العمل الجماعي مرة أخرى.
لن أشرح ميزة checksum8 بالتفصيل، ولكن من الضروري تعديلها لتجنب اكتشافها بواسطة nmap ومحركات البحث الفضائية.
في BeaconPayload قم بتعديل قيمة XOR إلى قيمة جديدة:
أي رقم عشري عشوائي يكفي، ثم قم بتغييره لاحقًا في ملف dll إلى الرقم السداسي العشري المقابل.

استخدم CrackSleeve لفك تشفير ملف dll: https://github.com/ca3tie1/CrackSleeve/
javac -encoding UTF-8 -classpath cobaltstrike.jar CrackSleeve.java)java -classpath cobaltstrike.jar;./ CrackSleeve decode) # تنفيذ عبر سطر أوامر Windowsاستخدم Alt+T للبحث عن الكلمة المفتاحية: 2Eh


قم بتعديل قيمة xor مباشرة، أولاً استخدم Change byte للعثور على 2E وتعديله، ثم Apply patches to input file للحفظ. (لا تنسَ الحفظ)

ملفات dll التي تحتاج إلى تعديل: beacon.dll وbeacon.x64.dll وdnsb.dll وdnsb.x64.dll وpivot.dll وpivot.x64.dll وextc2.dll وextc2.x64.dll (الإصدار 4.5 أضاف بعض ملفات rl100k.dll التي تحتاج أيضًا إلى تعديل)
ثم استخدم CrackSleeve لتشفير ملفات dll، وأخيرًا ضع ملفات dll الموجودة في مجلد encode في مجلد مشروع IDEA وأعد الترجمة والحزم.
عند الاختبار، على الرغم من أنه لا يزال يمكن طلب عنوان uri، إلا أن المحتوى لم يعد ممكنًا فك تشفيره بواسطة سكربتات nmap، وبالمثل يمكن تجنب التعرف من محركات البحث الفضائية:

بالإضافة إلى طريقة تعديل قيمة XOR، يمكن أيضًا https://mp.weixin.qq.com/s?__biz=MzA3MDY2NjMxMA==&mid=2247484641&idx=1&sn=014f6c4ad5343e3f5034c33dffa66f26&chksm=9f3815c8a84f9cde1c7493ff29cfc89c0474fec48ede52be618727e7b9a5ab321c4743e1a44c&mpshare=1&scene=23&srcid=1202NA46yt71CvD3BMGKS10c&sharer_sharetime=1606892728447&sharer_shareid=ff83fe2fe7db7fcd8a1fcbc183d841c4#rd تغيير خوارزمية checksum8، ولكن عندها سيكون الوصول عبر uri ثابت فقط، وستحتاج إلى استخدامه مع profile، وفي كل مرة تغيّر فيها uri ستحتاج إلى إعادة الحزم. لكل طريقة مزاياها وعيوبها.
فكرة تعديل إزالة ميزات beaconeye مصدرها الرابط، والبايتات التي تحتاج إلى تعديل باستخدام 4.3 و4.4 كمثال هي كما يلي.
استخدم CrackSleeve لفك تشفير ملف dll: https://github.com/ca3tie1/CrackSleeve/
ضع cobaltstrike.jar و CrackSleeve.java معًا
الترجمة (javac -encoding UTF-8 -classpath cobaltstrike.jar CrackSleeve.java)
فك تشفير الملف (java -classpath cobaltstrike.jar;./ CrackSleeve decode) # تنفيذ عبر سطر أوامر Windows
4.3 key 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103 4.4 key 94, -104, 25, 74, 1, -58, -76, -113, -91, -126, -90, -87, -4, -69, -110, -42
العنوان: 10009FBB
6A 00 يُعدَّل إلى 6A 09 (عدّل 00 إلى أي قيمة)

العنوان: 000000001800186C3
التعليمة داخل beacon.x64.dll هي xor edx, edx، عدّلها إلى mov edx, esi

العنوان: 1000A0B9
6A 00 يُعدَّل إلى 6A 09 (عدّل 00 إلى أي قيمة)

العنوان: 000000018001879B
التعليمة داخل beacon.x64.dll هي xor edx, edx، عدّلها إلى mov edx, esi

أعد التشفير باستخدام: java -classpath cobaltstrike.jar;./ CrackSleeve encode


العنوان: 1000A65D

العنوان: 000000018000CA3F

(الإصدار 4.5 أضاف بعض ملفات rl100k.dll التي تحتاج أيضًا إلى تعديل)

الطريقة هي ببساطة إضافة فحص / إلى uri، وإذا لم يبدأ بـ / فسيتم الرد بـ 404:
تعديل 4.4

تعديل 4.3

لتجنب تسريب كلمة مرور totp أو اسم الدخول إلى cs في سجل الأحداث (Event Log)، يتم عرض حقل name باستخدام MD5 مع إضافة ملح (salt)، وبعد التعديل يكون كما يلي:

تمت إضافة التحقق ثنائي العوامل TOTP لتعزيز تسجيل الدخول ومنع سرقة كلمات المرور عبر التخمين (Brute Force).
في جانب teamserver، تمت إضافة رابط رمز QR خاص بـ totp في مخرجات teamserver:

(قبل حذف nohup.out تذكر نسخ رمز QR، فكل تشغيل لـ teamserver يولّد رمز QR جديدًا، لذا تحتاج في كل مرة تشغيل لـ teamserver إلى إعادة مسح الرمز)
افتحه في المتصفح (يتطلب VPN/وكيل) واستخدم Google Authenticator أو تطبيق TOTP لمسح رمز QR، أو انسخ المفتاح بعد secret%3D وقم بتكوينه في تطبيق المصادقة أيضًا:

في جانب connect، تبقى host وport وpassword كما كانت سابقًا، وفي user، آخر ستة أرقام هي الأرقام الديناميكية لـ totp ويمكن الاتصال:

سيظهر تنبيه إذا لم يتم إدخال الأرقام الديناميكية لـ totp أو تم إدخالها بشكل خاطئ:

ملاحظة: في بعض الأحيان لا يتوفر هاتف محمول، يمكنك استخدام إضافة متصفح بوظيفة totp أو كتابة سكربت totp بسيط بلغة بايثون.
عند استخدام windows/foreign/reverse_http(s) لعملية spawn تظهر رسالة خطأ كما يلي:

هذا الإصدار أضاف عمليات getScalar الخاصة بـ Custom في ScListener، لكنه لم يراعِ حالة foreign، مما يؤدي إلى خطأ لأن var1.customDLL وcustomFileName فارغان:

طريقة الإصلاح المؤقتة هي إرجاع الـ shellcode مباشرة عند الحكم على أن الـ payload هو foreign، وإذا كانت هناك أخطاء أخرى في هذه الطريقة يمكنك تقديم ملاحظات عبر issues:

بعد الإصلاح يمكن استخدامه بشكل طبيعي:

لمنع قراءة الإعدادات بواسطة قاعدة بيانات MySQL الخادعة (Honeypot)، لم يعد اسم ملف إعدادات عميل cs هو الاسم الافتراضي، بل يتم إنشاء اسم ملف مكوّن من 11 حرفًا (11 حرفًا من MD5 لعنوان MAC).
