Docker Breakout / Privilege Escalation
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
linpeas: यह भी कंटेनरों की सूची बना सकता है
CDK: यह उपकरण कंटेनर की सूची बनाने के लिए काफी उपयोगी है जिसमें आप हैं और यहां तक कि स्वचालित रूप से भागने की कोशिश करें
amicontained: यह उपकरण कंटेनर के पास मौजूद विशेषाधिकारों को प्राप्त करने के लिए उपयोगी है ताकि इससे भागने के तरीके खोजे जा सकें
deepce: कंटेनरों से सूची बनाने और भागने के लिए उपकरण
grype: छवि में स्थापित सॉफ़्टवेयर में शामिल CVEs प्राप्त करें
यदि किसी तरह आप पाते हैं कि डॉकर सॉकेट कंटेनर के अंदर माउंट किया गया है, तो आप इससे भागने में सक्षम होंगे। यह आमतौर पर उन डॉकर कंटेनरों में होता है जिन्हें किसी कारणवश कार्य करने के लिए डॉकर डेमन से कनेक्ट करने की आवश्यकता होती है।
इस मामले में आप docker डेमन के साथ संवाद करने के लिए नियमित docker कमांड का उपयोग कर सकते हैं:
यदि docker socket एक अप्रत्याशित स्थान पर है तो आप docker
कमांड का उपयोग करके इसे -H unix:///path/to/docker.sock
पैरामीटर के साथ संचारित कर सकते हैं।
Docker डेमन भी एक पोर्ट पर सुन सकता है (डिफ़ॉल्ट रूप से 2375, 2376) या Systemd-आधारित सिस्टम पर, Docker डेमन के साथ संचार Systemd socket fd://
के माध्यम से हो सकता है।
इसके अतिरिक्त, अन्य उच्च-स्तरीय रंटाइम के रनटाइम सॉकेट पर ध्यान दें:
dockershim: unix:///var/run/dockershim.sock
containerd: unix:///run/containerd/containerd.sock
cri-o: unix:///var/run/crio/crio.sock
frakti: unix:///var/run/frakti.sock
rktlet: unix:///var/run/rktlet.sock
...
आपको कंटेनर की क्षमताओं की जांच करनी चाहिए, यदि इसमें निम्नलिखित में से कोई भी है, तो आप इससे बाहर निकलने में सक्षम हो सकते हैं: CAP_SYS_ADMIN
, CAP_SYS_PTRACE
, CAP_SYS_MODULE
, DAC_READ_SEARCH
, DAC_OVERRIDE, CAP_SYS_RAWIO
, CAP_SYSLOG
, CAP_NET_RAW
, CAP_NET_ADMIN
आप पहले उल्लेखित स्वचालित उपकरणों का उपयोग करके वर्तमान कंटेनर क्षमताओं की जांच कर सकते हैं या:
इस पृष्ठ पर आप लिनक्स क्षमताओं के बारे में अधिक जान सकते हैं और उन्हें कैसे दुरुपयोग करके विशेषाधिकारों से बचने/वृद्धि करने के लिए उपयोग कर सकते हैं:
एक विशेषाधिकार प्राप्त कंटेनर को --privileged
ध्वज के साथ या विशिष्ट सुरक्षा उपायों को निष्क्रिय करके बनाया जा सकता है:
--cap-add=ALL
--security-opt apparmor=unconfined
--security-opt seccomp=unconfined
--security-opt label:disable
--pid=host
--userns=host
--uts=host
--cgroupns=host
Mount /dev
--privileged
ध्वज कंटेनर की सुरक्षा को काफी कम कर देता है, असीमित डिवाइस पहुंच प्रदान करता है और कई सुरक्षा उपायों को बायपास करता है। इसके पूर्ण प्रभावों के लिए, --privileged
पर दस्तावेज़ देखें।
इन अनुमतियों के साथ आप बस रूट के रूप में होस्ट में चल रहे एक प्रक्रिया के नामस्थान में जा सकते हैं जैसे init (pid:1) बस चलाकर: nsenter --target 1 --mount --uts --ipc --net --pid -- bash
इसे एक कंटेनर में परीक्षण करें:
केवल प्रिविलेज्ड फ्लैग के साथ आप होस्ट के डिस्क तक पहुँचने की कोशिश कर सकते हैं या release_agent या अन्य एस्केप्स का दुरुपयोग करके भागने की कोशिश कर सकते हैं।
कंटेनर में निम्नलिखित बायपास का परीक्षण करें:
अच्छी तरह से कॉन्फ़िगर किए गए डॉकर कंटेनर fdisk -l जैसे कमांड की अनुमति नहीं देंगे। हालाँकि, गलत कॉन्फ़िगर किए गए डॉकर कमांड पर जहाँ --privileged
या --device=/dev/sda1
फ्लैग बड़े अक्षरों में निर्दिष्ट किया गया है, होस्ट ड्राइव को देखने के लिए विशेषाधिकार प्राप्त करना संभव है।
तो होस्ट मशीन पर नियंत्रण पाने के लिए, यह तुच्छ है:
And voilà ! आप अब होस्ट की फ़ाइल प्रणाली तक पहुँच सकते हैं क्योंकि यह /mnt/hola
फ़ोल्डर में माउंट किया गया है।
कंटेनर के भीतर, एक हमलावर होस्ट OS तक और अधिक पहुँच प्राप्त करने का प्रयास कर सकता है जो क्लस्टर द्वारा बनाए गए writable hostPath वॉल्यूम के माध्यम से है। नीचे कुछ सामान्य चीजें हैं जिन्हें आप कंटेनर के भीतर जांच सकते हैं कि क्या आप इस हमलावर वेक्टर का लाभ उठा सकते हैं:
एक तकनीक का विवरण खोजें:
पिछले हमलों में होस्ट के फाइल सिस्टम के अंदर कंटेनर का पूर्ण पथ प्रकट होता है। हालाँकि, यह हमेशा ऐसा नहीं होता। उन मामलों में जहाँ आप होस्ट के अंदर कंटेनर का पूर्ण पथ नहीं जानते आप इस तकनीक का उपयोग कर सकते हैं:
प्रिविलेज्ड कंटेनर के भीतर PoC को निष्पादित करने से निम्नलिखित के समान आउटपुट मिलना चाहिए:
कुछ फ़ाइलें हैं जो माउंट की जा सकती हैं जो अंडरलेइंग होस्ट के बारे में जानकारी देती हैं। इनमें से कुछ यह भी संकेत दे सकती हैं कि जब कुछ होता है तो होस्ट द्वारा कुछ निष्पादित किया जाना है (जो एक हमलावर को कंटेनर से बाहर निकलने की अनुमति देगा)। इन फ़ाइलों का दुरुपयोग करने से यह संभव हो सकता है:
release_agent (पहले ही कवर किया गया)
हालांकि, आप इस पृष्ठ पर अन्य संवेदनशील फ़ाइलें जांचने के लिए पा सकते हैं:
कई अवसरों पर आप पाएंगे कि कंटेनर में होस्ट से कुछ वॉल्यूम माउंट किया गया है। यदि यह वॉल्यूम सही तरीके से कॉन्फ़िगर नहीं किया गया है, तो आप संवेदनशील डेटा तक पहुँच/संशोधित कर सकते हैं: रहस्यों को पढ़ें, ssh authorized_keys को बदलें…
यदि आपके पास कंटेनर के अंदर रूट के रूप में पहुंच है जिसमें होस्ट से कुछ फ़ोल्डर माउंट किया गया है और आपने गैर-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में होस्ट पर भाग लिया है और माउंट किए गए फ़ोल्डर पर पढ़ने की पहुंच है। आप कंटेनर के अंदर माउंट किए गए फ़ोल्डर में एक bash suid फ़ाइल बना सकते हैं और होस्ट से इसे निष्पादित करके प्रिवेस्क कर सकते हैं।
यदि आपके पास कंटेनर के अंदर रूट के रूप में पहुंच है और आपने होस्ट पर गैर-विशिष्ट उपयोगकर्ता के रूप में भाग लिया है, तो आप होस्ट के अंदर प्रिवेस्क करने के लिए दोनों शेल का दुरुपयोग कर सकते हैं यदि आपके पास कंटेनर के अंदर MKNOD की क्षमता है (यह डिफ़ॉल्ट रूप से है) जैसा कि इस पोस्ट में समझाया गया है। इस तरह की क्षमता के साथ कंटेनर के भीतर रूट उपयोगकर्ता को ब्लॉक डिवाइस फ़ाइलें बनाने की अनुमति है। डिवाइस फ़ाइलें विशेष फ़ाइलें होती हैं जो नीचे के हार्डवेयर और कर्नेल मॉड्यूल्स तक पहुंचने के लिए उपयोग की जाती हैं। उदाहरण के लिए, /dev/sda ब्लॉक डिवाइस फ़ाइल सिस्टम के डिस्क पर कच्चे डेटा को पढ़ने की पहुंच देती है।
Docker कंटेनरों के भीतर ब्लॉक डिवाइस के दुरुपयोग के खिलाफ सुरक्षा करता है एक cgroup नीति को लागू करके जो ब्लॉक डिवाइस पढ़ने/लिखने के संचालन को रोकती है। फिर भी, यदि एक ब्लॉक डिवाइस कंटेनर के अंदर बनाया गया है, तो यह कंटेनर के बाहर /proc/PID/root/ निर्देशिका के माध्यम से सुलभ हो जाता है। इस पहुंच के लिए प्रक्रिया के मालिक का एक जैसा होना आवश्यक है कंटेनर के अंदर और बाहर दोनों।
शोषण का उदाहरण इस लेख से:
यदि आप होस्ट की प्रक्रियाओं तक पहुँच सकते हैं, तो आप उन प्रक्रियाओं में संग्रहीत बहुत सारी संवेदनशील जानकारी तक पहुँचने में सक्षम होंगे। परीक्षण प्रयोगशाला चलाएँ:
उदाहरण के लिए, आप ps auxn
जैसे कुछ का उपयोग करके प्रक्रियाओं की सूची बना सकेंगे और कमांड में संवेदनशील विवरणों की खोज कर सकेंगे।
फिर, क्योंकि आप /proc/ में मेज़बान की प्रत्येक प्रक्रिया तक पहुँच सकते हैं, आप बस उनके env secrets चुरा सकते हैं:
आप अन्य प्रक्रियाओं के फ़ाइल डिस्क्रिप्टर्स तक भी पहुँच सकते हैं और उनके खुले फ़ाइलों को पढ़ सकते हैं:
आप प्रक्रियाओं को समाप्त कर सकते हैं और DoS का कारण बन सकते हैं।
यदि आपके पास किसी तरह कंटेनर के बाहर एक प्रक्रिया पर विशेषाधिकार प्राप्त पहुंच है, तो आप कुछ ऐसा चला सकते हैं जैसे nsenter --target <pid> --all
या nsenter --target <pid> --mount --net --pid --cgroup
ताकि आप उस प्रक्रिया के समान ns प्रतिबंधों के साथ एक शेल चला सकें (उम्मीद है कि कोई नहीं)।
यदि एक कंटेनर को Docker होस्ट नेटवर्किंग ड्राइवर (--network=host
) के साथ कॉन्फ़िगर किया गया था, तो उस कंटेनर का नेटवर्क स्टैक Docker होस्ट से अलग नहीं है (कंटेनर होस्ट के नेटवर्किंग नामस्थान को साझा करता है), और कंटेनर को अपना IP-पता आवंटित नहीं किया जाता है। दूसरे शब्दों में, कंटेनर सभी सेवाओं को सीधे होस्ट के IP पर बाइंड करता है। इसके अलावा, कंटेनर सभी नेटवर्क ट्रैफ़िक को इंटरसेप्ट कर सकता है जो होस्ट साझा इंटरफेस tcpdump -i eth0
पर भेज और प्राप्त कर रहा है।
उदाहरण के लिए, आप इसका उपयोग होस्ट और मेटाडेटा इंस्टेंस के बीच ट्रैफ़िक को स्निफ़ और यहां तक कि स्पूफ करने के लिए कर सकते हैं।
जैसे कि निम्नलिखित उदाहरणों में:
आप होस्ट के अंदर लोकलहोस्ट पर बाइंड की गई नेटवर्क सेवाओं तक भी पहुंच सकते हैं या यहां तक कि नोड के मेटाडेटा अनुमतियों तक पहुंच सकते हैं (जो कि उन अनुमतियों से भिन्न हो सकते हैं जिन तक एक कंटेनर पहुंच सकता है)।
hostIPC=true
के साथ, आपको होस्ट के इंटर-प्रोसेस संचार (IPC) संसाधनों, जैसे कि शेयर की गई मेमोरी में /dev/shm
तक पहुंच मिलती है। यह पढ़ने/लिखने की अनुमति देता है जहां समान IPC संसाधनों का उपयोग अन्य होस्ट या पॉड प्रक्रियाओं द्वारा किया जाता है। इन IPC तंत्रों की और जांच करने के लिए ipcs
का उपयोग करें।
/dev/shm का निरीक्षण करें - इस साझा मेमोरी स्थान में किसी भी फ़ाइल की तलाश करें: ls -la /dev/shm
मौजूदा IPC सुविधाओं का निरीक्षण करें – आप देख सकते हैं कि क्या कोई IPC सुविधाएँ उपयोग में हैं /usr/bin/ipcs
के साथ। इसे जांचें: ipcs -a
यदि syscall unshare
निषिद्ध नहीं है, तो आप सभी क्षमताओं को पुनर्प्राप्त कर सकते हैं:
पोस्ट https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/ में समझाई गई दूसरी तकनीक बताती है कि आप उपयोगकर्ता नामस्थान के साथ बाइंड माउंट्स का दुरुपयोग कैसे कर सकते हैं, ताकि होस्ट के अंदर फ़ाइलों को प्रभावित किया जा सके (उस विशेष मामले में, फ़ाइलों को हटाना)।
Trickest का उपयोग करें ताकि आप दुनिया के सबसे उन्नत सामुदायिक उपकरणों द्वारा संचालित कार्यप्रवाहों को आसानी से बना और स्वचालित कर सकें। आज ही एक्सेस प्राप्त करें:
यदि आप docker exec
को रूट के रूप में निष्पादित कर सकते हैं (संभवतः sudo के साथ), तो आप CVE-2019-5736 का दुरुपयोग करते हुए कंटेनर से बाहर निकलकर विशेषाधिकार बढ़ाने की कोशिश करते हैं (शोषण यहां )। यह तकनीक मूल रूप से होस्ट के /bin/sh बाइनरी को कंटेनर से ओवरराइट करेगी, इसलिए कोई भी जो docker exec निष्पादित करता है, वह पेलोड को ट्रिगर कर सकता है।
पेलोड को तदनुसार बदलें और go build main.go
के साथ main.go बनाएं। परिणामी बाइनरी को निष्पादन के लिए डॉकर कंटेनर में रखा जाना चाहिए।
निष्पादन के बाद, जैसे ही यह [+] Overwritten /bin/sh successfully
प्रदर्शित करता है, आपको होस्ट मशीन से निम्नलिखित निष्पादित करना होगा:
docker exec -it <container-name> /bin/sh
यह पेलोड को ट्रिगर करेगा जो main.go फ़ाइल में मौजूद है।
अधिक जानकारी के लिए: https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html
कंटेनर अन्य CVEs के प्रति भी संवेदनशील हो सकता है, आप https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list में एक सूची पा सकते हैं।
नामस्थान: प्रक्रिया को अन्य प्रक्रियाओं से पूर्ण रूप से अलग होना चाहिए, इसलिए हम नामस्थान के कारण अन्य प्रॉक्स के साथ बातचीत करते समय बाहर नहीं निकल सकते (डिफ़ॉल्ट रूप से IPCs, यूनिक्स सॉकेट, नेटवर्क सेवाओं, D-Bus, /proc
अन्य प्रॉक्स के माध्यम से संवाद नहीं कर सकते)।
रूट उपयोगकर्ता: डिफ़ॉल्ट रूप से प्रक्रिया चलाने वाला उपयोगकर्ता रूट उपयोगकर्ता है (हालांकि इसके विशेषाधिकार सीमित हैं)।
क्षमताएँ: डॉकर निम्नलिखित क्षमताएँ छोड़ता है: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
सिस्टम कॉल: ये सिस्टम कॉल हैं जिन्हें रूट उपयोगकर्ता नहीं बुला सकेगा (क्षमताओं की कमी + Seccomp के कारण)। अन्य सिस्टम कॉल का उपयोग बाहर निकलने की कोशिश करने के लिए किया जा सकता है।
If you are in userspace (no kernel exploit involved) the way to find new escapes mainly involve the following actions (these templates usually require a container in privileged mode):
Find the path of the containers filesystem inside the host
You can do this via mount, or via brute-force PIDs as explained in the second release_agent exploit
Find some functionality where you can indicate the path of a script to be executed by a host process (helper) if something happens
You should be able to execute the trigger from inside the host
You need to know where the containers files are located inside the host to indicate a script you write inside the host
Have enough capabilities and disabled protections to be able to abuse that functionality
You might need to mount things o perform special privileged actions you cannot do in a default docker container
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)