
تسليح Rust لعمليات الفريق الأحمر.
تجاربي في تسليح Rust لتطوير الغرسات (implant) والعمليات الهجومية العامة.
mingw، رغم أن بعض المكتبات لا يمكن ترجمتها بنجاح على أنظمة تشغيل أخرى.هذا المستودع لا يوفر ملفات ثنائية، سيتوجب عليك ترجمتها بنفسك.
تثبيت Rust
ما عليك سوى تنزيل الملف الثنائي وتثبيته.
تم ترجمة هذا المستودع على نظام Windows 10 لذا أنصح بالالتزام به. كما ذكرنا، ملفات OpenSSL الثنائية ستعاني من مشاكل اعتماديات تتطلب تثبيت OpenSSL و perl.
بالنسبة لخادم/عميل TCP SSL، أنصح بالبناء الثابت بسبب الاعتماديات على المضيفين الذين ستنفذ عليهم الملفات الثنائية.
لإنشاء مشروع، قم بتنفيذ:
cargo new <name>
سيقوم هذا بإنشاء مجلدات المشروع المنظمة تلقائياً مع:```bash
project
├── Cargo.toml
└── src
└── main.rs
Cargo.toml هو الملف الذي يحتوي على التبعيات وإعدادات الترجمة.
main.rs هو الملف الرئيسي الذي سيتم ترجمته مع أي أدلة محتملة تحتوي على مكتبات.
لترجمة المشروع، انتقل إلى دليل المشروع ونفذ:
`cargo build`
سيستخدم هذا سلسلة الأدوات الافتراضية الخاصة بك.
إذا كنت تريد بناء الإصدار النهائي "release"، نفذ:
`cargo build --release`
للحصول على ملفات ثنائية ثابتة، في الطرفية قبل أمر البناء نفذ:
`"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"`
`set RUSTFLAGS=-C target-feature=+crt-static`
إذا وجدت صعوبة في قراءة الكود بالطريقة التي كُتب بها،
يمكنك أيضًا استخدام الأمر التالي داخل دليل المشروع لتنسيقه بشكل أفضل
`cargo fmt`
قد لا تترجم بعض الأمثلة وتعطيك خطأ، لأنها قد تتطلب إصدارًا ليليًا (nightly) من Rust بأحدث الميزات. لتثبيته فقط نفذ:
`rustup default nightly`
أسهل مكان للعثور على التبعيات أو [Crates](https://crates.io/) كما تُسمى.
## الترجمة المتقاطعة (Cross Compiling)
تتطلب الترجمة المتقاطعة اتباع التعليمات [هنا](https://rust-lang.github.io/rustup/cross-compilation.html)
بتثبيت سلاسل أدوات مختلفة، يمكنك الترجمة المتقاطعة باستخدام الأمر التالي
`cargo build --target <toolchain>`
لعرض سلاسل الأدوات المثبتة على نظامك نفذ:
`rustup toolchain list`
للتحقق من جميع سلاسل الأدوات المتاحة التي يمكنك تثبيتها على نظامك نفذ:
`rustup target list`
لتثبيت سلسلة أدوات جديدة نفذ:
`rustup target add <toolchain_name>`
## تحسين الملفات التنفيذية من حيث الحجم
يحتوي هذا [المستودع](https://github.com/johnthagen/min-sized-rust) على العديد من خيارات التكوين والأفكار حول تقليل حجم الملف.
عادةً ما تكون الملفات الثنائية الثابتة كبيرة جدًا.
## المزالق التي وقعت فيها بنفسي
انتبه إلى بايتات \0، لا تنساها للسلاسل في الذاكرة، قضيت الكثير من وقتي لكن windbg ساعدت دائمًا في حلها.
## مكتبات Rust المثيرة للاهتمام
- WINAPI
- [WINAPI2](https://github.com/MauriceKayser/rs-winapi2)
- Windows - هذه هي المكتبة الرسمية من Microsoft التي لم أتعامل معها كثيرًا
## OPSEC
- على الرغم من أن Rust يتمتع بمزايا جيدة، إلا أنه من الصعب جدًا التعود عليه وليس بديهيًا جدًا.
- توليد شيل كود هو مشكلة أخرى بسبب LLVM. لقد وجدت عدة طرق للتعامل مع هذا.
[Donut](https://github.com/TheWover/donut) أحيانًا يولد شيل كود يعمل ولكن اعتمادًا على كيفية بناء المشروع، قد لا يعمل.
بشكل عام، لتوليد شيل كود، يجب تصميم الأدوات بحيث تستضيف كل الكود في مقطع .text،
مما يؤدي إلى هذا [المستودع](https://github.com/b1tg/rust-windows-shellcode) الرائع.
يوجد نموذج شيل كود في هذا المشروع يمكن أن يوضح لك كيفية تنظيم الكود الخاص بك لتوليد شيل كود ناجح.
بالإضافة إلى ذلك، يحتوي هذا المشروع أيضًا على مولد شيل كود يستخرج مقطع .text من ملف ثنائي
ويقوم بإخراج الشيل كود بعد تنفيذ بعض التصحيحات.
هذا المشروع يأخذ الملف الثنائي من موقع محدد لذا قمت بعمل fork يتلقى مسار الملف الثنائي كوسيطة [هنا](https://github.com/trickster0/rust-windows-shellcode-custom).
- حتى لو قمت بإزالة جميع رموز التصحيح، لا يزال Rust يمكنه الاحتفاظ بمراجع لدليلك الرئيسي في الملف الثنائي. الطريقة الوحيدة التي وجدتها لإزالة ذلك هي تمرير العلم التالي: `--remap-path-prefix {دليلك الرئيسي}={معرف عشوائي ما}`. يمكنك استخدام متغيرات bash للحصول على دليلك الرئيسي وتوليد عنصر نائب عشوائي: `--remap-path-prefix "$HOME"="$RANDOM"`. (بواسطة [Yamakadi](https://github.com/yamakadi))
- على الرغم من وجود طريقة أخرى لإزالة معلومات حول الدليل الرئيسي عن طريق إضافة السطر التالي في أعلى Cargo.toml
`cargo-features = ["strip"]` .
نظرًا لأن Rust يترك افتراضيًا الكثير من الأشياء كسلاسل في الملف الثنائي، فأنا أستخدم في الغالب هذا [cargo.toml](../master/cargo.toml) لتجنبها وتقليل الحجم أيضًا
مع أمر البناء
`cargo build --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-pc-windows-msvc`
- [Yamakadi] ، أشار أيضًا إلى أنه اعتمادًا على المكتبات المستوردة، فإن عملية strip ليست دائمًا متسقة في إخفاء الدليل الرئيسي، لذا فإن الجمع بين حله لإعادة تعيين المسار واستخدام cargo أعلاه سيكون الأفضل. حاول أن تكون على دراية وتفقد ملفاتك الثنائية قبل تنفيذها في مهامك للبحث عن سلاسل محتملة لم يتم strip بشكل صحيح.
## مشاريع أخرى قمت بها في Rust
- [UDPlant](https://github.com/trickster0/UDPlant) - ببساطة شيل عكسي UDP
- [EDR Detector](https://github.com/trickster0/EDR_Detector) - يكتشف EDRs الخاصة بالنظام المثبت وفقًا لملفات .sys المثبتة
- [Lenum](https://github.com/trickster0/Lenum) - أداة تعداد بسيطة لـ unix
## مشاريع في Rust قد تكون مفيدة
- [houdini](https://github.com/yamakadi/houdini) - يساعد في جعل ملفك التنفيذي يحذف نفسه
| الملف | الوصف |
|---|
| Allocate_With_Syscalls | تستخدم دوال NTDLL مباشرة مع مكتبة ntapi |
| Create_DLL | إنشاء DLL وإظهار صندوق رسائل، لا تدعم Rust هذا بشكل كامل لذا قد تصبح الأمور غريبة لأن DLL في Rust لا تحتوي على دالة رئيسية |
| DeviceIoControl | فتح مؤشر للتعامل مع برنامج التشغيل وتنفيذ DeviceIoControl |
| EnableDebugPrivileges | تمكين SeDebugPrivilege في العملية الحالية |
| Shellcode_Local_inject | تنفيذ الشيلكود مباشرة في العملية المحلية عن طريق مؤشر (pointer) |
| Execute_With_CMD | تنفيذ cmd عن طريق تمرير أمر عبر Rust |
| ImportedFunctionCall | استيراد minidump من dbghelp وتنفيذه |
| Kernel_Driver_Exploit | استغلال برنامج تشغيل النواة لحالة تجاوز سعة المخزن المؤقت البسيطة |
| Named_Pipe_Client | عميل الأنبوب المسمى |
| Named_Pipe_Server | خادم الأنبوب المسمى |
| PEB_Walk | حل واستدعاء واجهات برمجة تطبيقات Windows بشكل ديناميكي |
| Process_Injection_CreateThread | حقن العملية في عملية قيد التشغيل باستخدام CreateThread |
| Process_Injection_CreateRemoteThread | حقن العملية في عملية بعيدة باستخدام CreateRemoteThread |
| Process_Injection_Self_EnumSystemGeoID | حقن ذاتي يستخدم استدعاء API EnumSystemsGeoID لتشغيل الشيلكود. |
| Unhooking | استدعاءات إلغاء الخطاف (Unhooking) |
| asm_syscall | الحصول على عنوان PEB عبر asm |
| base64_system_enum | ترميز/فك ترميز السلاسل باستخدام Base64 |
| http-https-requests | طلبات HTTP/S بتجاهل فحص الشهادة لـ GET/POST |
| patch_etw | تصحيح ETW |
| ppid_spoof | تزييف العملية الأب للعملية المنشأة |
| tcp_ssl_client | عميل TCP مع SSL يتجاهل فحص الشهادة (يتطلب تثبيت openssl و perl للترجمة) |
| tcp_ssl_server | خادم TCP مع معلمة المنفذ (يتطلب تثبيت openssl و perl للترجمة) |
| wmi_execute | تنفيذ استعلام WMI للحصول على برامج مكافحة الفيروسات/EDR في المضيف |
| Windows.h+ Bindings | يحتوي هذا الملف على هياكل Windows.h بالإضافة إلى LDR, PEB, إلخ. مخصصة كاملة غير موثقة رسمياً من مايكروسوفت، أضف في أعلى ملفك include!("../bindings.rs"); |
| UUID_Shellcode_Execution | زرع الشيلكود من مصفوفة UUID في مساحة الكومة واستخدام رد الاتصال EnumSystemLocalesA لتنفيذ الشيلكود. |
| AMSI Bypass | تجاوز AMSI على العملية المحلية |
| Injection_AES_Loader | حقن NtTestAlert مع فك تشفير AES |
| Litcrypt_String_Encryption | استخدام كريت Litcrypt لتشفير السلاسل النصية في السكون وفي الذاكرة لهزيمة برامج مكافحة الفيروسات الثابتة. |
| Api Hooking | ربط API باستخدام مكتبة detour |
| memfd_create | تنفيذ الحمولات من الذاكرة باستخدام تقنية memfd_create (لنظام Linux) |
| RC4_Encryption | شيلكود مفكوك التشفير بـ RC4 |
| Steal Token | سرقة الرمز (Token) من العملية |
| Keyboard Hooking | تسجيل ضربات المفاتيح عن طريق ربط لوحة المفاتيح بـ SetWindowsHookEx |
| memN0ps arsenal: shellcode_runner_classic-rs | مشغل/حقن شيلكود كلاسيكي باستخدام ntapi |
| memN0ps arsenal: dll_injector_classic-rs | حقن DLL كلاسيكي باستخدام windows-sys |
| memN0ps arsenal: module_stomping-rs | دوس الوحدة / تحميل الوحدة / تفريغ DLL باستخدام windows-sys |
| memN0ps arsenal: obfuscate_shellcode-rs | أداة تشويش شيلكود بسيطة بـ XOR و AES |
| memN0ps arsenal: process_hollowing-rs | تفريغ العملية (Process Hollowing) باستخدام ntapi |
| memN0ps arsenal: rdi-rs | حقن DLL الانعكاسي باستخدام windows-sys |
| memN0ps: eagle-rs | روتكيت صدئ: برنامج تشغيل نواة Windows في Rust لفريق Red Team باستخدام winapi و ntapi |
| memN0ps: psyscalls-rs | مكتبة استدعاءات النظام المتوازية الصدئة باستخدام winapi |
| memN0ps: mmapper-rs | مخطط يدوي صدئ باستخدام winapi |
| memN0ps: srdi-rs | حقن DLL الانعكاسي للشيلكود الصدئ باستخدام windows-sys |
| memN0ps: mordor-rs - freshycalls_syswhispers | مكتبة Rusty FreshyCalls / SysWhispers1 / SysWhispers2 / SysWhispers3 باستخدام windows-sys |
| memN0ps: mordor-rs - hells_halos_tartarus_gate | مكتبة Rusty Hell's Gate / Halo's Gate / Tartarus' Gate باستخدام windows-sys |
| memN0ps: pemadness-rs | مكتبة تحليل الملفات القابلة للتنفيذ المحمولة الصدئة (مكتبة تحليل PE) باستخدام windows-sys |
| memN0ps: mimiRust | Mimikatz مصنوع في Rust بواسطة @ThottySploit. قام المؤلف الأصلي بحذف حسابه على GitHub، لذا تم رفعه لاستخدام المجتمع. |
| memN0ps and trickster0: ekko-rs | Ekko صدئ - تشويش السكون في Rust باستخدام windows-sys. |