
Freeze.rs هي مجموعة أدوات حمولات (payload) لتجاوز أنظمة EDR باستخدام العمليات المعلّقة واستدعاءات النظام المباشرة، مكتوبة بلغة RUST
لعرض أحدث إصدار من Freeze.rs أو للإبلاغ عن مشكلة، راجع https://github.com/Tylous/Freeze.rs.
إذا كنت ترغب في معرفة المزيد عن التقنيات المستخدمة في هذا الإطار، يرجى إلقاء نظرة على مدونة SourceZero والأداة الأصلية.
Freeze.rs هي أداة إنشاء حمولات تستخدم لتجاوز ضوابط أمان EDR لتنفيذ شيل كود بطريقة خفية. تستخدم Freeze.rs تقنيات متعددة ليس فقط لإزالة خطافات EDR في مساحة المستخدم، بل وأيضاً لتنفيذ الشيل كود بطريقة تتجاوز ضوابط مراقبة نقاط النهاية الأخرى.
عند إنشاء عملية، يتم تحميل Ntdll.dll كأول مكتبة DLL؛ يحدث هذا قبل تحميل أي مكتبات DLL تابعة لـ EDR. وهذا يعني أن هناك تأخيراً بسيطاً قبل أن يتم تحميل EDR والبدء في ربط وتعديل تجميع مكتبات النظام. بالنظر إلى استدعاءات ويندوز في Ntdll.dll، نرى أنه لم يتم ربط أي شيء بعد. إذا قمنا بإنشاء عملية في حالة معلقة (مجمدة زمنياً)، يمكننا أن نرى أنه لا يتم تحميل أي مكتبات DLL أخرى باستثناء Ntdll.dll. يمكنك أيضاً رؤية أنه لم يتم تحميل أي مكتبات DLL لـ EDR، مما يعني أن استدعاءات النظام الموجودة في Ntdll.dll غير معدلة.
لاستخدام هذه العملية المعلقة النظيفة لإزالة الخطافات من محمل Freeze.rs، نحتاج إلى طريقة للعثور على ذاكرة العملية المعلقة النظيفة وقراءتها برمجياً. وهنا يأتي دور التوزيع العشوائي لمساحة العنوان (ASLR). ASLR هي آلية أمان لمنع الثغرات القائمة على تلف ذاكرة المكدس. يقوم ASLR بعشوائية مساحة العنوان داخل العملية، لضمان أن تكون جميع الكائنات المعينة في الذاكرة، والمكدس، والكومة، والبرنامج القابل للتنفيذ نفسه، فريدة. الآن، هذا هو الجزء المثير للاهتمام لأنه بينما يعمل ASLR، فإنه لا يعمل مع الكود المستقل عن الموضع مثل DLLs. ما يحدث مع DLLs (خاصة مكتبات النظام المعروفة) هو أن مساحة العنوان يتم عشوائيتها مرة واحدة عند الإقلاع. هذا يعني أننا لا نحتاج إلى تعداد معلومات عملية بعيدة للعثور على العنوان الأساسي لـ ntdll.dll الخاص بها لأنه هو نفسه في جميع العمليات، بما في ذلك تلك التي نتحكم فيها. بما أن عنوان كل DLL هو نفسه في كل إقلاع، يمكننا سحب هذه المعلومات من عمليتنا الخاصة ولا نحتاج أبداً إلى تعداد العملية المعلقة للعثور على العنوان.
باستخدام هذه المعلومات، يمكننا استخدام واجهة برمجة التطبيقات ReadProcessMemory لقراءة ذاكرة عملية. يرتبط هذا الاستدعاء API عادة بقراءة LSASS كجزء من أي هجوم قائم على بيانات الاعتماد؛ ومع ذلك، فهو في حد ذاته ليس خبيثاً بطبيعته، خاصة إذا كنا نقرأ مجرد قسم عشوائي من الذاكرة. المرة الوحيدة التي سيتم فيها وضع علامة على ReadProcessMemory كشيء مريب هي إذا كنت تقرأ شيئاً لا ينبغي عليك (مثل محتويات LSASS). لا ينبغي لمنتجات EDR أبداً وضع علامة على حقيقة استدعاء ReadProcessMemory، حيث أن هناك استخدامات تشغيلية مشروعة لهذه الوظيفة وقد يؤدي ذلك إلى العديد من الإيجابيات الكاذبة.
يمكننا أن نخطو خطوة أبعد من خلال قراءة قسم واحد فقط من Ntdll.dll حيث يتم تخزين جميع استدعاءات النظام - قسم .text الخاص به، بدلاً من قراءة DLL بأكمله.
بدمج هذه العناصر، يمكننا الحصول على نسخة من قسم .text الخاص بـ Ntdll.dll برمجياً لاستبدال قسم .text المربوط الموجود لدينا قبل تنفيذ الشيل كود.
يستخدم ETW استدعاءات النظام المضمنة لتوليد هذه القياسات عن بعد. نظراً لأن ETW أيضاً ميزة أصلية مدمجة في ويندوز، لا تحتاج منتجات الأمان إلى "ربط" استدعاءات نظام ETW للوصول إلى المعلومات. ونتيجة لذلك، لمنع ETW، يقوم Freeze.rs بتصحيح العديد من استدعاءات نظام ETW، وتفريغ المسجلات وإعادة تدفق التنفيذ إلى التعليمات التالية. أصبح تصحيح ETW الآن الافتراضي في جميع المحملات.
نظراً لاستعادة Ntdll.dll فقط، يجب أن تكون جميع الاستدعاءات اللاحقة لتنفيذ الشيل كود موجودة في Ntdll.dll. باستخدام حزمة NTAPI في Rust (لاحظ أنه يمكنك القيام بذلك بلغات أخرى، ولكن في Rust من السهل جداً تنفيذه) يمكننا تعريف واستدعاء استدعاءات النظام NT اللازمة لتخصيص وكتابة وحماية الشيل كود، متجاوزين بذلك الاستدعاءات القياسية الموجودة في Kernel32.dll وKernelbase.dll، حيث قد تكون هذه لا تزال مربوطة.
مع حزمة NTAPI في Rust، يمكنك أن ترى أن جميع هذه الاستدعاءات لا تظهر تحت ntdll.dll، ولكنها لا تزال موجودة داخل العملية.
ونتيجة لذلك:
بدأ هذا كمشروع ممتع لتعلم Rust وتطور ليصبح إطاراً خاصاً به.
تم تطوير Freeze.rs باستخدام Rust.
إذا لم يكن Rust و Rustup مثبتين، فيرجى تثبيتهما. إذا كنت تقوم بتجميعه من OSX أو Linux، فتأكد من إضافة الهدف "x86_64-pc-windows-gnu". للقيام بذلك، قم بتشغيل الأمر التالي:
rustup target add x86_64-pc-windows-gnu
بمجرد الانتهاء، يمكنك تجميع Freeze.rs، قم بتشغيل الأوامر التالية، أو استخدم الثنائي المجمع:
cargo build --release
من هناك سيكون الإصدار المجمع في target/release (لاحظ إذا لم تضع --release سيكون الملف في target/debug/ )
___________
\_ _____/______ ____ ____ ________ ____ _______ ______
| __) \_ __ \_/ __ \_/ __ \\___ // __ \ \_ __ \/ ___/
| \ | | \/\ ___/\ ___/ / /\ ___/ | | \/\___ \
\___ / |__| \___ >\___ >_____ \\___ > /\ |__| /____ >
\/ \/ \/ \/ \/ \/ \/
(@Tyl0us)
سيتعلمون قريباً أن الانتقام هو طبق... يقدم بارداً وصدئاً...
الاستخدام:
Freeze-rs [FLAGS] [OPTIONS]
العلم:
-c, --console فقط للحمولات الثنائية - يُنشئ معلومات مطولة لوحدة التحكم عند تنفيذ الحمولة. هذا سيعطل ميزة الإخفاء
-h, --help يطبع معلومات المساعدة
-n, --noetw يعطل تصحيح ETW الذي يمنع توليد أحداث ETW.
-s, --sandbox يفعّل التهرب من الصندوق الرملي عن طريق التحقق:
هل نقطة النهاية منضمة إلى نطاق؟
هل تحتوي نقطة النهاية على أكثر من 2 من وحدات المعالجة المركزية؟
هل تحتوي نقطة النهاية على أكثر من 4 غيغابايت من ذاكرة الوصول العشوائي؟
-V, --version يطبع معلومات الإصدار
الخيارات:
-E, --Encrypt <ENCRYPT> يقوم بتشفير الشيل كود باستخدام إما تشفير AES 256 أو ELZMA أو RC4
-I, --Input <INPUT> المسار إلى الشيل كود الخام 64-بت.
-O, --Output <OUTPUT> اسم ملف الإخراج (مثل loader.exe أو loader.dll). اعتماداً على امتداد الملف المحدد سيتم تحديد ما إذا كان Freeze سينشئ dll أم exe.
-p, --process <PROCESS> اسم العملية المراد استحضارها. يجب أن تكون هذه العملية موجودة في C:\Windows\System32\. مثال 'notepad.exe'
-e, --export <export> يحدد اسم دالة تصدير مخصصة لأي DLL.
يمكن لـ Freeze.rs إنشاء ملف .exe أو .dll. لتحديد ذلك، تأكد من أن خيار سطر الأوامر -O ينتهي إما بـ .exe للثنائيات أو .dll للمكتبات الديناميكية. لا يتم دعم أي أنواع ملفات أخرى حالياً. في حالة ملفات DLL، يمكن لـ Freeze.rs أيضاً إضافة وظائف تصدير إضافية. للقيام بذلك، استخدم -export مع اسم دالة التصدير المحددة.
تشفير الشيل كود هو تقنية مهمة تستخدم لحمايته من الاكتشاف والتحليل من قبل EDRs ومنتجات الأمان الأخرى. يأتي Freeze.rs مع طرق متعددة لتشفير الشيل كود، وتشمل هذه AES و ELZMA و RC4.
AES (معيار التشفير المتقدم) هو خوارزمية تشفير متماثل تستخدم على نطاق واسع لتشفير البيانات. يستخدم Freeze.rs حجم بت AES-256 لتشفير الشيل كود. ميزة استخدام AES لتشفير الشيل كود هي أنه يوفر تشفيراً قوياً ومدعوماً على نطاق واسع من قبل مكتبات التشفير. ومع ذلك، يمكن أن يجعل استخدام حجم كتلة ثابت عرضة لهجمات معينة، مثل هجوم padding oracle.
ELZMA هي خوارزمية ضغط وتشفير تستخدم غالباً في البرامج الضارة لإخفاء الكود. لتشفير الشيل كود باستخدام ELZMA، يتم أولاً ضغط الشيل كود باستخدام خوارزمية ELZMA. ثم يتم تشفير البيانات المضغوطة باستخدام مفتاح عشوائي. ثم يتم تضمين البيانات المشفرة والمفتاح في كود الاستغلال. ميزة استخدام ELZMA لتشفير الشيل كود هي أنه يوفر كلاً من الضغط والتشفير في خوارزمية واحدة. يمكن أن يساعد ذلك في تقليل حجم كود الاستغلال وجعله أكثر صعوبة في الاكتشاف.
RC4 هي خوارزمية تشفير متماثل تستخدم غالباً في البرامج الضارة لتشفير الشيل كود. وهي تشفير تيار يمكنه استخدام مفاتيح متغيرة الطول ومعروفة ببساطتها وسرعتها.
يستخدم Freeze.rs تقنية لإنشاء العملية أولاً ثم نقلها إلى الخلفية. هذا يفعل شيئين - أولاً، يساعد في إبقاء العملية مخفية، وثانياً، يتجنب اكتشافها من قبل أي منتج EDR. إن إنشاء عملية مباشرة في الخلفية يمكن أن يكون مريباً جداً ومؤشراً على الخبث. يقوم Freeze.rs بذلك عن طريق استدعاء دالتي ويندوز ‘GetConsoleWindow’ و ‘ShowWindow’ بعد إنشاء العملية وتحميل خطافات EDR، ثم تغيير سمات النافذة إلى مخفية.
إذا تم تحديد خيار سطر الأوامر -console، فلن يقوم Freeze.rs بإخفاء العملية في الخلفية. بدلاً من ذلك، سيضيف Freeze.rs عدة رسائل تصحيح تعرض ما يفعله المحمل.