
Linux प्रक्रिया पहचान छिपाने वाला उपकरण जो किसी अन्य प्रक्रिया का रूप धारण करने के लिए 11-चरणीय prctl पाइपलाइन के माध्यम से comm, argv, cmdline, environ, exe पथ और VMA को स्पूफ करता है।
Linux प्रक्रिया पहचान छिपाना
DARKCLOAK सभी userspace-दृश्यमान पहचान स्रोतों के हेरफेर को एक 11-चरणीय अनुक्रमिक पाइपलाइन में श्रृंखलाबद्ध करता है जो एक प्रक्रिया को उत्तरोत्तर रूपांतरित करता है जब तक कि यह userspace निगरानी उपकरणों के लिए नकल की गई प्रक्रिया से अप्रभेद्य न हो जाए। हमारी जानकारी के अनुसार, कोई भी प्रकाशित उपकरण सभी userspace-दृश्यमान पहचान स्रोतों के एक साथ हेरफेर को संयोजित नहीं करता है।
पूरा तकनीकी लेख RAZOR ब्लॉग पर उपलब्ध है।
task_struct->comm: PR_SET_NAME के माध्यम सेargv[0]: सीधे स्टैक ओवरराइट के माध्यम से/proc/$PID/cmdline): PR_SET_MM_ARG_START/END के माध्यम से/proc/$PID/environ): PR_SET_MM_ENV_START/END के माध्यम से/proc/$PID/exe): PR_SET_MM_EXE_FILE के माध्यम से/proc/$PID/maps): अनाम मेमोरी से प्रतिस्थापितunshare के माध्यम सेपाइपलाइन उन कर्नेल सबसिस्टम के बीच निर्भरताओं द्वारा परिभाषित एक सख्त क्रम में चलती है जिनमें हेरफेर किया जा रहा है:
PT_LOAD सेगमेंट की वर्चुअल एड्रेस रेंज प्राप्त करने के लिए _start पर सहायक वेक्टर को पार्स करता हैgetresuid / getresgidsetresuid(0,0,0)capget/capset के माध्यम से अनुमत सेट को प्रभावी और विरासत में मिलने वाले सेट में कॉपी करता हैprctl(PR_SET_NAME) → task_struct->comm को ओवरराइट करता है[rsp+8] पर सीधा स्टैक राइट → argv[0] को ओवरराइट करता हैprctl(PR_SET_DUMPABLE, 0) → गैर-विशेषाधिकार प्राप्त प्रक्रियाओं से एक्सेस और को ब्लॉक करता हैPR_SET_MM_EXE_FILE EBUSY के साथ विफल हो जाता है जबकि कोई भी VMA अभी भी मूल बाइनरी द्वारा समर्थित है। चूंकि .text सेगमेंट को अनमैप नहीं किया जा सकता जबकि RIP उसके अंदर है, अनामीकरण एक अस्थायी अनाम पृष्ठ से चलता है:
mmap)mm_start→mm_end) और सेगमेंट मेटाडेटा को उसमें कॉपी करेंmprotect).text छोड़ देता हैPT_LOAD सेगमेंट में से प्रत्येक के लिए: एक नया अनाम क्षेत्र mmap करें → सेगमेंट सामग्री memcpy करें → मूल को munmap करें → अनाम कॉपी को मूल पते पर वापस mremap करें → मूल अनुमतियों को बहाल करने के लिए mprotect करें.text पर लौटें, ट्रैम्पोलिन पृष्ठ को अनमैप करेंबाइनरी एक स्थिर ELF है जिसमें कोई इंटरप्रेटर नहीं है, इसलिए रनटाइम VMA लेआउट पूरी तरह से नियतात्मक है: तीन PT_LOAD सेगमेंट, स्टैक, और कर्नेल vDSO।
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
स्पूफिंग लक्ष्य कंपाइल समय पर .data सेक्शन में परिभाषित किए जाते हैं। डिफ़ॉल्ट sshd की नकल करते हैं:
mimic_name db 'sshd', 0
mimic_argv db './sshd', 0
mimic_exe db '/usr/sbin/sshd', 0
mimic_cmdline db '/usr/sbin/sshd', 0, '-D', 0, '[email protected]', 0, ...
mimic_environ db 'LANG=en_US.UTF-8', 0, 'NOTIFY_SOCKET=/run/systemd/notify', 0, ...
किसी भिन्न प्रक्रिया की नकल करने के लिए, बिल्ड करने से पहले इन मानों को अपडेट करें।
./darkcloak
अनुमत सेट में CAP_SYS_RESOURCE, CAP_SETUID, CAP_SETGID, और CAP_SETPCAP की आवश्यकता होती है। यदि CAP_SYS_RESOURCE अनुपस्थित है, तो MM स्पूफिंग ब्लॉक (VMA अनामीकरण + EXE_FILE स्वैप) पूरी तरह से छोड़ दिया जाता है। यदि CAP_SETPCAP अनुपस्थित है, तो उपकरण PR_SET_SECUREBITS से PR_SET_KEEPCAPS पर वापस आ जाता है।
./darkcloak &
PID=$!
cat /proc/$PID/comm
readlink /proc/$PID/exe
cat /proc/$PID/cmdline | tr '\0' ' '
cat /proc/$PID/environ | tr '\0' '\n' | head -3
cat /proc/$PID/maps | head -5
cat /proc/$PID/status | grep -E 'Uid|Gid|Cap'
ps aux | grep $PID
विशेष रूप से शैक्षिक और अनुसंधान उद्देश्यों के लिए प्रकाशित। केवल उन सिस्टम पर उपयोग करें जिनका आप स्वामी हैं या जिनका परीक्षण करने के लिए आपके पास स्पष्ट लिखित प्राधिकरण है।
/proc/$PID/memptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → /proc/$PID/cmdline को रीडायरेक्ट करता हैprctl(PR_SET_MM_ENV_START/END) → /proc/$PID/environ को रीडायरेक्ट करता हैprctl(PR_SET_MM_EXE_FILE) → mm_struct->exe_file को प्रतिस्थापित करता हैPR_SET_SECUREBITS (यदि CAP_SETPCAP) या PR_SET_KEEPCAPS (फ़ॉलबैक)setresuid(1000,1000,1000) या मूल को बहाल करेंsetresgid(1000,1000,1000) या मूल को बहाल करेंunshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s) फिर exit