
تجاربي في تسليح Nim (https://nim-lang.org/)
تجاربي في تسليح Nim لتطوير البرامج الضارة والعمليات الهجومية العامة.
DllMain
mingw وتمرير علامة واحدة لمترجم Nim.| الملف | الوصف |
|---|---|
| amsi_patch_2_bin.nim | تصحيح AMSI خارج العملية الحالية باستخدام طريقة مختلفة (قيد التطوير، المساعدة مرحب بها) |
| excel_4_com_bin.nim | حقن شيل كود باستخدام كائن COM لـ Excel ووحدات ماكرو Excel 4 () |
هذا المستودع لا يوفر ملفات ثنائية، سيتعين عليك تجميعها بنفسك. تم إعداد هذا المستودع لتجميع ملفات مصدر Nim مثال إلى Windows من Linux أو MacOS بشكل متقاطع.
استخدام حاويات التطوير VSCode لإعداد بيئة تطوير لك تلقائيًا (انظر قسم إعداد بيئة تطوير). بعد ذلك، قم ببساطة بتشغيل make.
تثبيت Nim باستخدام مدير حزم نظامك (لنظام Windows استخدم المثبت على الموقع الرسمي)
brew install nimapt install nimchoco install nim(يوفر Nim أيضًا صورة Docker على Dockerhub)
يجب أن يكون لديك الآن أوامر nim و nimble متاحة، الأول هو مترجم Nim والثاني هو مدير حزم Nim.
تثبيت مجموعة أدوات Mingw اللازمة للتجميع المتقاطع إلى Windows (غير مطلوب إذا كنت تجمع على Windows):
apt-get install mingw-w64brew install mingw-w64أخيرًا، قم بتثبيت مكتبة Winim الرائعة، بالإضافة إلى zippy و nimcrypto
nimble install winim zippy nimcryptoثم انتقل إلى جذر هذا المستودع وقم بتشغيل make.
يجب أن تجد الملفات الثنائية و DLLs في دليل bin/
انظر قسم التجميع المتقاطع في دليل استخدام مترجم Nim، لمزيد من التفاصيل.
التجميع المتقاطع إلى Windows من MacOs/*nix يتطلب مجموعة أدوات mingw، عادةً ما يكون مجرد brew install mingw-w64 أو apt install mingw-w64.
ثم عليك فقط تمرير العلامة -d=mingw إلى مترجم Nim.
مثال: nim c -d=mingw --app=console --cpu=amd64 source.nim
انظر قسم FFI الرائع في دليل Nim.
إذا كنت معتادًا على P/Invoke في C#، فهو نفس المفهوم تقريبًا ولكنه يبدو قبيحًا بعض الشيء:
مثال على استدعاء `MessageBox````nim type HANDLE* = int HWND* = HANDLE UINT* = int32 LPCSTR* = cstring
proc MessageBox*(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT): int32 {.discardable, stdcall, dynlib: "user32", importc: "MessageBoxA".}
MessageBox(0, "Hello, world !", "Nim is Powerful", 0)
لأي استدعاءات معقدة لواجهة برمجة تطبيقات Windows، استخدم مكتبة [Winim](https://github.com/khchen/winim)، فهي توفر وقتًا هائلًا ولا تزيد حجم الملف التنفيذي كثيرًا (انظر أدناه) اعتمادًا على كيفية استيرادها.
حتى أنها تدعم COM!!!
## إنشاء مكتبات DLL لنظام Windows مع دالة `DllMain` مصدّرة
شكر كبير للشخص الذي نشر [هذا](https://forum.nim-lang.org/t/1973) في منتدى Nim.
يحاول مترجم Nim إنشاء دالة `DllMain` تلقائيًا لك في وقت الترجمة عندما تطلب منه إنشاء مكتبة DLL لنظام Windows، لكنه مع ذلك لا يقوم بتصديرها لسبب ما. لكي تحصل على دالة `DllMain` مصدّرة، تحتاج إلى تمرير `--nomain` وتعريف دالة `DllMain` بنفسك مع التوجيهات المناسبة (`stdcall, exportc, dynlib`).
تحتاج أيضًا إلى استدعاء `NimMain` من داخل `DllMain` الخاصة بك لتهيئة جامع القمامة في Nim. (مهم جدًا، وإلا سينفجر جهاز الكمبيوتر الخاص بك حرفيًا).
مثال:```nim
import winim/lean
proc NimMain() {.cdecl, importc.}
proc DllMain(hinstDLL: HINSTANCE, fdwReason: DWORD, lpvReserved: LPVOID) : BOOL {.stdcall, exportc, dynlib.} =
NimMain()
if fdwReason == DLL_PROCESS_ATTACH:
MessageBox(0, "Hello, world !", "Nim is Powerful", 0)
return true
لتجميع:``` nim c -d=mingw --app=lib --nomain --cpu=amd64 mynim.dll
### إنشاء ملفات XLL
يمكنك إنشاء ملف XLL (ملف Excel DLL، تخيل ذلك) مع auto open function يمكن استخدامها لتوصيل الـ payload. ينشئ الكود التالي ملف XLL بسيطًا يحتوي على auto open function وجميع الكود الأساسي اللازم لتجميعه كمكتبة link library. يتم تجميع POC كـ DLL، ثم يمكنك تغيير الامتداد إلى .xll وسيفتح في Excel ويشغل الـ payload عند النقر المزدوج:```nim
#[
Compile:
nim c -d=mingw --app=lib --nomain --cpu=amd64 nim_xll.nim
Will compile as a DLL, you can then just change the extension to .xll
]#
import winim/lean
proc xlAutoOpen() {.stdcall, exportc, dynlib.} =
MessageBox(0, "Hello, world !", "Nim is Powerful", 0)
proc NimMain() {.cdecl, importc.}
proc DllMain(hinstDLL: HINSTANCE, fdwReason: DWORD, lpvReserved: LPVOID) : BOOL {.stdcall, exportc, dynlib.} =
NimMain()
return true
هناك العديد من الأشياء الخادعة الأخرى التي يمكن القيام بها باستخدام XLLs. انظر المزيد من الأمثلة على حرف XLL هنا.
مأخوذ من صفحة الأسئلة الشائعة لـ Nim
للحصول على أكبر تقليل في الحجم، استخدم الأعلام التالية -d:danger -d:strip --opt:size
بالإضافة إلى ذلك، وجدت أنه يمكنك ضغط بضعة بايتات إضافية عن طريق تمرير --passc=-flto --passl=-flto إلى المترجم. ألقِ نظرة أيضًا على Makefile في هذا المستودع.
تعمل هذه الأعلام على تقليل الأحجام بشكل كبير: مثال حقن الشيل كود ينخفض من 484.3 كيلوبايت إلى 46.5 كيلوبايت عند التحويل البرمجي المتقاطع من MacOSX!
شكر كبير لـ @Shitsecure على اكتشاف هذا!
بشكل افتراضي، لا يقوم Nim بإنشاء ملفات PE بجدول إعادة توطين (relocation table) وهو ضروري لمعظم الأدوات التي تقوم بتحميل الـ EXEs بشكل عاكس.
لتوليد ملف Nim قابل للتنفيذ مع قسم إعادة توطين، تحتاج إلى تمرير بعض الأعلام الإضافية إلى الرابط.
تحديدًا: --passL:-Wl,--dynamicbase
مثال الأمر الكامل:``` nim c --passL:-Wl,--dynamicbase my_awesome_malwarez.nim
## الفرق في حجم الملف التنفيذي عند استخدام مكتبة Winim مقارنة بعدم استخدامها
من المدهش أن الفرق في الحجم ضئيل جدًا، خاصةً عند تطبيق تحسينات الحجم المذكورة أعلاه.
تم إنشاء المثالين `pop_bin.nim` و `pop_winim_bin.nim` لهذا الغرض.
الأول يعرّف استدعاء WinAPI الخاص بـ `MessageBox` يدويًا، بينما يستخدم الثاني مكتبة Winim (تحديدًا `winim/lean` وهي فقط جوهر SDK، انظر [هنا](https://github.com/khchen/winim#usage))، النتائج:```
byt3bl33d3r@ecl1ps3 OffensiveNim % ls -lah bin
-rwxr-xr-x 1 byt3bl33d3r 25K Nov 20 18:32 pop_bin_32.exe
-rwxr-xr-x 1 byt3bl33d3r 32K Nov 20 18:32 pop_bin_64.exe
-rwxr-xr-x 1 byt3bl33d3r 26K Nov 20 18:33 pop_winim_bin_32.exe
-rwxr-xr-x 1 byt3bl33d3r 34K Nov 20 18:32 pop_winim_bin_64.exe
إذا قمت باستيراد مكتبة Winim بأكملها باستخدام import winim/com فإنها تضيف حوالي 20 كيلوبايت فقط، وهو ما يعتبر، بالنظر إلى مقدار الوظائف التي تلخصها، يستحق 100% هذا الحجم الإضافي:```
byt3bl33d3r@ecl1ps3 OffensiveNim % ls -lah bin
-rwxr-xr-x 1 byt3bl33d3r 42K Nov 20 19:20 pop_winim_bin_32.exe
-rwxr-xr-x 1 byt3bl33d3r 53K Nov 20 19:20 pop_winim_bin_64.exe
## اعتبارات Opsec
نظرًا لكيفية قيام Nim بحل DLLs ديناميكيًا باستخدام `LoadLibrary` باستخدام FFI الخاصة بها، لن تظهر أي من وظائفك المستوردة خارجيًا في الاستيرادات الثابتة للملف التنفيذي (انظر [منشور المدونة هذا](https://web.archive.org/web/20210117002945/https://secbytes.net/implant-roulette-part-1:-nimplant/) لمزيد من التفاصيل):

إذا قمت بتجميع كود Nim المصدر إلى DLL، يبدو أنه سيكون لديك دائمًا `NimMain` مصدرة، بغض النظر عن تحديد `DllMain` الخاص بك أم لا (؟؟). قد يُستخدم هذا كتوقيع، لا أعرف كم عدد الشركات التي تستخدم Nim فعليًا في مجموعة تطويرها. بالتأكيد يبرز.

## كتابة Nim بدون بيئة تشغيل Nim
نظرًا لأن Nim مُشار إليه بشدة من قبل حلول مكافحة الفيروسات، فإن إحدى الطرق لتجاوز ذلك هي كتابة برامج Nim بدون بيئة تشغيل Nim. [كتابة Nim بدون Nim](https://www.youtube.com/watch?v=EXX3HmCG3pw) هي محاضرة تشرح الخطوات حول كيفية كتابة كود Nim بدون بيئة تشغيل Nim و C، الكود المصدري من هذه المحاضرة متاح [هنا](https://github.com/m4ul3r/writing_nimless). تتبع المحاضرة وتوسع في عمل [zimawhit3](https://github.com/zimawhit3) مع [Bitmancer](https://github.com/zimawhit3/Bitmancer/tree/main).
الفكرة هي الاعتماد على تعريفات الأنواع من `winim` والاستفادة من كتابة الكود الذي لا يؤدي إلى استخدام بيئة تشغيل Nim.
## تحويل كود C إلى Nim
https://github.com/nim-lang/c2nim
استخدمته لترجمة مجموعة من مقاطع C الصغيرة، لم أجرب أي شيء كبير.
## جسور لغوية
- تكامل بايثون https://github.com/yglukhov/nimpy
* هذا مثير للاهتمام حقًا، [خاصة هذا الجزء](https://github.com/yglukhov/nimpy/blob/master/nimpy/py_lib.nim#L330). مع بعض التعديل، هل يمكن تحميل PythonxXX.dll من الذاكرة؟
- تكامل Jave VM: https://github.com/yglukhov/jnim
## تصحيح الأخطاء
استخدم دالة `repr()` مع `echo`، تدعم جميع أنواع البيانات تقريبًا (؟؟)، حتى الهياكل!
انظر [منشور المدونة هذا للمزيد](https://nim-lang.org/blog/2017/10/02/documenting-profiling-and-debugging-nim-code.html)
## إعداد بيئة تطوير
يدعم هذا المستودع [حاويات تطوير VSCode] (https://code.visualstudio.com/docs/remote/create-dev-container) والتي تتيح لك التطوير داخل حاوية Docker. هذا يؤتمتة إعداد بيئة تطوير لك.
1. قم بتثبيت VSCode و Docker desktop
2. استنساخ هذا المستودع وفتحه في VSCode
3. قم بتثبيت إضافة `Visual Studio Code Remote - Containers`
4. افتح لوحة الأوامر واختر الأمر `Remote-Containers: Reopen in Container`
سيقوم VScode الآن ببناء صورة Docker (سيستغرق بعض الوقت) ويضعك مباشرة في بيئة تطوير Nim المعدة مسبقًا!
## المزالق التي وجدت نفسي أقع فيها
- عند استدعاء winapi باستخدام Winim ومحاولة تمرير قيمة فارغة، تأكد من تمرير القيمة `NULL` (المعرفة داخل مكتبة Winim) بدلاً من قيمة `nil` المدمجة في Nim. (آه)
- للحصول على مقبض نظام التشغيل للملف الذي تم إنشاؤه بعد استدعاء `open()` على Windows، تحتاج إلى استدعاء `f.getOsFileHandle()` **وليس** `f.getFileHandle()` لأسباب ما.
- يقبل مترجم Nim الوسائط بصيغة `-a=value` أو `--arg=value` على الرغم من أنه إذا نظرت إلى الاستخدام، فإنه يمرر الوسائط فقط كـ `-a:value` أو `--arg:value`. (مهم لملفات Makefiles)
- عند تعريف مصفوفة بايت، تحتاج أيضًا إلى الإشارة على الأقل في القيمة الأولى إلى أنها مصفوفة بايت، غريب بعض الشيء لكن لا بأس (https://forum.nim-lang.org/t/4322)
مصفوفة بايت في C#:```csharp
byte[] buf = new byte[5] {0xfc,0x48,0x81,0xe4,0xf0,0xff}
مصفوفة البايت في Nim:```nim var buf: array[5, byte] = [byte 0xfc,0x48,0x81,0xe4,0xf0,0xff]
## مكتبات Nim مثيرة للاهتمام
- https://github.com/dom96/jester
- https://github.com/pragmagic/karax
- https://github.com/Niminem/Neel
- https://github.com/status-im/nim-libp2p
- https://github.com/PMunch/libkeepass
- https://github.com/def-/nim-syscall
- https://github.com/tulayang/asyncdocker
- https://github.com/treeform/ws
- https://github.com/guzba/zippy
- https://github.com/rockcavera/nim-iputils
- https://github.com/FedericoCeratto/nim-socks5
- https://github.com/CORDEA/backoff
- https://github.com/treeform/steganography
- https://github.com/miere43/nim-registry
- https://github.com/status-im/nim-daemon
## روابط Nim لتطوير البرامج الضارة
- https://web.archive.org/web/20210117002945/https://secbytes.net/implant-roulette-part-1:-nimplant/
- https://securelist.com/zebrocys-multilanguage-malware-salad/90680/
- https://github.com/MythicAgents/Nimplant
- https://github.com/elddy/Nim-SMBExec
- https://github.com/elddy/NimScan
## المساهمون
عناق افتراضي لكل من ساهم ❤️
<a href="https://github.com/byt3bl33d3r/OffensiveNim/graphs/contributors">
<img src="https://contrib.rocks/image?repo=byt3bl33d3r/OffensiveNim" />
</a>
| الملف | الوصف |
|---|
| pop_bin.nim | استدعاء WinApi MessageBox بدون استخدام مكتبة Winim |
| pop_winim_bin.nim | استدعاء MessageBox مع مكتبة Winim |
| pop_winim_lib.nim | مثال على إنشاء DLL لنظام Windows مع تصدير DllMain |
| execute_assembly_bin.nim | استضافة CLR، تنفيذ تجميعات .NET بشكل عاكس من الذاكرة |
| clr_host_cpp_embed_bin.nim | استضافة CLR عن طريق تضمين كود C++ مباشرة، تنفيذ تجميع .NET من القرص |
| scshell_c_embed_bin.nim | يوضح كيفية تسليح كود C موجود بسرعة عن طريق تضمين SCShell (C) مباشرة داخل Nim |
| fltmc_bin.nim | تعداد جميع برامج تشغيل Minifilter |
| blockdlls_acg_ppid_spoof_bin.nim | إنشاء عملية معلقة تقوم بتزوير PPID الخاص بها إلى explorer.exe، كما تقوم بتمكين BlockDLLs و ACG |
| named_pipe_client_bin.nim | عميل Named Pipe |
| named_pipe_server_bin.nim | خادم Named Pipe |
| embed_rsrc_bin.nim | تضمين مورد (ملف مضغوط) في وقت الترجمة واستخراج المحتويات في وقت التشغيل |
| self_delete_bin.nim | طريقة لحذف ملف قابل للتنفيذ مقفل أو قيد التشغيل على القرص. الطريقة اكتشفها @jonasLyk |
| encrypt_decrypt_bin.nim | تشفير/فك تشفير باستخدام AES256 (وضع CTR) باستخدام مكتبة Nimcrypto |
| amsi_patch_bin.nim | تصحيح AMSI خارج العملية الحالية |
| amsi_providerpatch_bin.nim | تصحيح DLL موفر AMSI (في هذه الحالة MpOav.dll) لتجاوز AMSI. نُشر هنا |
| etw_patch_bin.nim | تصحيح ETW خارج العملية الحالية (مساهم من ) |
| wmiquery_bin.nim | الاستعلام عن العمليات الجارية وبرامج مكافحة الفيروسات المثبتة باستخدام WMI |
| out_compressed_dll_bin.nim | ضغط، تشفير Base-64 وإخراج كود PowerShell لتحميل dll مُدار في الذاكرة. نسخة من سكريبت PowerSploit الأصلي إلى Nim. |
| dynamic_shellcode_local_inject_bin.nim | إثبات مفهوم لحقن شيل كود محليًا يتم استرداده ديناميكيًا بدلاً من ترميزه في مصفوفة. |
| shellcode_callback_bin.nim | تنفيذ شيل كود باستخدام دوال رد الاتصال (Callback) |
| shellcode_bin.nim | إنشاء عملية معلقة وحقن شيل كود باستخدام VirtualAllocEx/CreateRemoteThread. كما يوضح استخدام تعريفات وقت التجميع للكشف عن العمارة ونظام التشغيل إلخ.. |
| shellcode_fiber.nim | تنفيذ شيل كود عبر الألياف (Fibers) |
| shellcode_inline_asm_bin.nim | تنفيذ شيل كود باستخدام تعليمات التجميع المضمنة |
| ssdt_dump.nim | استرجاع SSDT بسيط باستخدام جدول دوال وقت التشغيل من دليل الاستثناءات. التقنية مستوحاة من مقال MDSEC |
| syscalls_bin.nim | يوضح كيفية إجراء استدعاءات نظام مباشرة |
| execute_powershell_bin.nim | استضافة CLR وتنفيذ PowerShell من خلال مساحة تشغيل غير مُدارة |
| passfilter_lib.nim | تسجيل تغييرات كلمة المرور إلى ملف عن طريق (إساءة) استخدام عامل تصفية تعقيد كلمة المرور |
| minidump_bin.nim | إنشاء تفريغ ذاكرة لـ lsass باستخدام MiniDumpWriteDump |
| http_request_bin.nim | يوضح عدة طرق لإجراء طلبات HTTP |
| execute_sct_bin.nim | تنفيذ ملف .sct عبر GetObject() |
| scriptcontrol_bin.nim | تنفيذ VBScript و JScript ديناميكيًا باستخدام كائن COM MSScriptControl |
| excel_com_bin.nim | حقن شيل كود باستخدام كائن COM لـ Excel ووحدات ماكرو |
| keylogger_bin.nim | مسجل ضغطات المفاتيح باستخدام SetWindowsHookEx |
| memfd_python_interpreter_bin.nim | استخدام استدعاء النظام memfd_create لتحميل ملف ثنائي في ملف مجهول وتنفيذه باستخدام استدعاء النظام execve. |
| uuid_exec_bin.nim | زرع شيل كود من مصفوفة UUID في مساحة الكومة واستخدام رد الاتصال EnumSystemLocalesA لتنفيذ الشيل كود. |
| unhookc.nim | إلغاء ربط ntdll.dll لتجنب ربط EDR/AV (يضم قالب كود C من ired.team) |
| unhook.nim | إلغاء ربط ntdll.dll لتجنب ربط EDR/AV (تطبيق Nim نقي) |
| taskbar_ewmi_bin.nim | استخدام حقن الذاكرة الإضافية للنافذة عبر خاصية التطبيق الجاري لشريط المهام لتنفيذ الشيل كود. |
| fork_dump_bin.nim | (إساءة) استخدام تنفيذ Windows لـ fork() والحصول على مقبض لعملية عن بعد باستخدام حق الوصول PROCESS_CREATE_PROCESS. ثم محاولة تفريغ ذاكرة العملية المنسوخة باستخدام MiniDumpWriteDump() |
| ldap_query_bin.nim | إجراء استعلامات LDAP عبر COM باستخدام موفر ADSI الخاص بـ ADO |
| sandbox_process_bin.nim | يعزل هذا عملية عن طريق تعيين مستوى الثقة إلى "غير موثوق" ويجرد الرموز الهامة. يمكن استخدامه لـ "تعطيل صامت" لعملية PPL (مثل AV/EDR) |
| list_remote_shares.nim | استخدام NetShareEnum لسرد المشاركات التي يمكن للمستخدم الحالي الوصول إليها |
| chrome_dump_bin.nim | قراءة وفك تشفير ملفات تعريف الارتباط من قاعدة بيانات sqlite الخاصة بـ Chrome |
| suspended_thread_injection.nim | تنفيذ شيل كود عبر حقن خيط معلق |
| dns_exfiltrate.nim | تسريب DNS بسيط عبر استعلامات سجلات TXT |
| rsrc_section_shellcode.nim | تنفيذ شيل كود مضمن في قسم .rsrc من الملف الثنائي |
| token_steal_cmd.nim | سرقة رمز/انتحال هوية ثم تشغيل أمر |
| anti_analysis_isdebuggerpresent.nim | تحليل مضاد بسيط يتحقق من وجود مصحح |
| sandbox_domain_check.nim | تقنية هروب من الصندوق الرملي بسيطة، تتحقق مما إذا كان الكمبيوتر متصلاً بالمجال أم لا |
| Hook.nim | مثال على ربط هجومي لـ MessageBoxA |
| anti_debug.nim | عرض تقنيتين لمكافحة التصحيح |
| anti_debug_via_tls.nim | مكافحة التصحيح عبر TLS |
| local_pe_execution.nim | تنفيذ ملفات exe و dll في الذاكرة |
| stack_string_allocation.nim | تخصيص سلاسل c و عريضة على المكدس باستخدام المصفوفات |
| hardware_breakpoints.nim | ربط الدوال باستخدام نقاط توقف الأجهزة |