DDexec / EverythingExec

AWS हैकिंग सीखें और प्रैक्टिस करें: HackTricks प्रशिक्षण AWS रेड टीम एक्सपर्ट (ARTE) GCP हैकिंग सीखें और प्रैक्टिस करें: HackTricks प्रशिक्षण GCP रेड टीम एक्सपर्ट (GRTE)

हैकट्रिक्स का समर्थन करें

संदर्भ

लिनक्स में किसी प्रोग्राम को चलाने के लिए यह एक फ़ाइल के रूप में मौजूद होना चाहिए, इसे किसी भी तरह से फ़ाइल सिस्टम हायरार्की के माध्यम से पहुंचना चाहिए (यह बस execve() कैसे काम करता है।) यह फ़ाइल डिस्क पर हो सकती है या रैम में (tmpfs, memfd) लेकिन आपको एक फ़ाइलपथ की आवश्यकता है। यह लिनक्स सिस्टम पर चलाने के लिए बहुत आसान बना दिया है, यह खतरों और हमले के उपकरणों को पहचानना आसान बनाता है या उन्हें किसी भी चीज़ को चलाने की कोशिश करने से रोकने के लिए (जैसे अनधिकृत उपयोगकर्ताओं को कहीं भी निष्पादनीय फ़ाइलें रखने की अनुमति न देना।)

लेकिन यह तकनीक इस सभी को बदलने के लिए यहाँ है। यदि आप जिस प्रक्रिया को शुरू नहीं कर सकते हैं... तो आप एक पहले से मौजूद प्रक्रिया को हाइजैक करें

यह तकनीक आपको सामान्य सुरक्षा तकनीकों जैसे कि केवल पढ़ने योग्य, noexec, फ़ाइल-नाम व्हाइटलिस्टिंग, हैश व्हाइटलिस्टिंग... को छेड़ने की अनुमति देती है।

आवश्यकताएँ

अंतिम स्क्रिप्ट निम्नलिखित उपकरणों पर निर्भर करता है काम करने के लिए, वे उपकरण आपके द्वारा हमला किए जा रहे सिस्टम में पहुंचने की आवश्यकता है (डिफ़ॉल्ट रूप से आप उन्हें हर जगह पाएंगे):

dd
bash | zsh | ash (busybox)
head
tail
cut
grep
od
readlink
wc
tr
base64

तकनीक

यदि आप किसी प्रक्रिया की मेमोरी को विचारशील रूप से संशोधित कर सकते हैं तो आप इसे अधिकार में ले सकते हैं। इसका उपयोग किसी पहले से मौजूदा प्रक्रिया को हाइजैक करने और उसे दूसरे कार्यक्रम से बदलने के लिए किया जा सकता है। हम इसे या तो ptrace() सिस्टेम कॉल का उपयोग करके (जिसके लिए आपको सिस्टम पर सिस्टम कॉल को निष्पादित करने की क्षमता होनी चाहिए या सिस्टम पर gdb उपलब्ध होना चाहिए) या, और भी दिलचस्पीपूर्ण रूप से, /proc/$pid/mem में लिखकर प्राप्त कर सकते हैं।

फ़ाइल /proc/$pid/mem एक प्रक्रिया के पूरे पता अंतरिक्ष का एक-से-एक मैपिंग है (जैसे 0x0000000000000000 से 0x7ffffffffffff000 तक x86-64 में)। इसका अर्थ है कि इस फ़ाइल से किसी ऑफसेट x पर पढ़ना या लिखना उसी तरह है जैसे कि वर्चुअल पते x पर सामग्री को पढ़ना या संशोधित करना।

अब, हमें चार मूल समस्याओं का सामना करना है:

  • सामान्य रूप से, केवल रूट और फ़ाइल के कार्यक्रम मालिक इसे संशोधित कर सकते हैं।

  • ASLR।

  • यदि हम किसी पते पर पढ़ने या लिखने की कोशिश करते हैं जो प्रोग्राम के पता अंतरिक्ष में मैप नहीं है तो हमें एक I/O त्रुटि मिलेगी।

इन समस्याओं के हल हैं जो, यद्यपि वे पूर्ण नहीं हैं, अच्छे हैं:

  • अधिकांश शैल अनुवादकों को फ़ाइल डिस्क्रिप्टर्स का निर्माण करने की अनुमति देते हैं जो फिर बच्चा प्रक्रियाओं द्वारा विरासत में लिया जाएगा। हम एक फ़ाइल डिस्क्रिप्टर बना सकते हैं जो लिखने की अनुमति वाली शैल की mem फ़ाइल की ओर पॉइंट करता है... तो उन बच्चा प्रक्रियाएँ जो उस फ़ाइल डिस्क्रिप्टर का उपयोग करती हैं वे शैल की मेमोरी को संशोधित कर सकेंगी।

  • ASLR एक समस्या भी नहीं है, हम शैल के maps फ़ाइल या प्रोसेस के पता अंतरिक्ष के बारे में जानकारी प्राप्त करने के लिए procfs से किसी भी अन्य को जांच सकते हैं।

  • इसलिए हमें फ़ाइल पर lseek() करने की आवश्यकता है। शैल से यह नहीं किया जा सकता अगर केवल दुर्भाग्यपूर्ण dd का उपयोग किया जाए।

अधिक विस्तार में

चरण साधारण हैं और इन्हें समझने के लिए किसी भी प्रकार की विशेषज्ञता की आवश्यकता नहीं है:

  • हमें वह बाइनरी जिसे हम चलाना चाहते हैं और लोडर को पार्स करना होगा ताकि हम जान सकें कि वे कौन-कौन सी मैपिंग चाहते हैं। फिर एक "शैल"कोड बनाएं जो, व्यापक रूप से, execve() को हर कॉल पर करने वाले कर्नेल के उसी कदमों को करेगा:

  • उक्त मैपिंग बनाएं।

  • उन्हें मेमोरी में पढ़ें।

  • अनुमतियाँ सेट करें।

  • अंत में प्रोग्राम के लिए ताकत देने के लिए स्टैक को आरंभ करें और सहायक वेक्टर (लोडर द्वारा आवश्यक) को रखें।

  • लोडर में जाएं और उसे बाकी का काम करने दें (प्रोग्राम द्वारा आवश्यक पुस्तकालयों को लोड करना)।

  • syscall फ़ाइल से प्राप्त करें कि प्रक्रिया जिस प्रक्रिया को वह सिस्टम कॉल निष्पादित कर रही है उसके बाद वापस लौटने का पता।

  • उस स्थान को ओवरराइट करें, जो कार्यात्मक होगा, हमारे शैलकोड के साथ (द्वारा mem हम अनलिखनीय पृष्ठों को संशोधित कर सकते हैं)।

  • प्रोसेस के stdin में चलाने के लिए हमारे पास जो प्रोग्राम है उसे पास करें (उस "शैल"कोड द्वारा read() किया जाएगा)।

  • इस बिंदु पर लोडर को हमारे प्रोग्राम के लिए आवश्यक पुस्तकालयों को लोड करने और उसमें जाने के लिए है।

टूल की जाँच करें https://github.com/arget13/DDexec

EverythingExec

dd के लिए कई विकल्प हैं, जिनमें से एक, tail, वर्तमान मेम फ़ाइल के माध्यम से lseek() के लिए डिफ़ॉल्ट कार्यक्रम है (जिसका उपयोग करने के लिए dd का उपयोग किया जाता था)। उक्त विकल्प हैं:

tail
hexdump
cmp
xxd

चर SEEKER सेट करके आप उपयोग किए जाने वाले सीकर को बदल सकते हैं, उदा.:

SEEKER=cmp bash ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)

यदि आप स्क्रिप्ट में अन्य एक मान्य सीकर निर्मित नहीं करते हैं, तो आप इसे अभी भी उपयोग कर सकते हैं SEEKER_ARGS चर को सेट करके:

SEEKER=xxd SEEKER_ARGS='-s $offset' zsh ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)

संदर्भ

हैकट्रिक्स का समर्थन करें

Last updated