GCP - Network Docker Escape

Support HackTricks

Initial State

इन दोनों लेखों में जहां इस तकनीक का उल्लेख किया गया है, हमलावरों ने GCP द्वारा प्रबंधित Docker कंटेनर के अंदर root पहुंच प्राप्त करने में सफलता पाई है, जिसमें होस्ट नेटवर्क (और क्षमताएं CAP_NET_ADMIN और CAP_NET_RAW) तक पहुंच है।

Attack Explanation

Google Compute Engine इंस्टेंस पर, नेटवर्क ट्रैफ़िक की नियमित जांच metadata instance पर 169.254.169.254 के लिए कई plain HTTP requests का खुलासा करती है। Google Guest Agent, एक ओपन-सोर्स सेवा, अक्सर ऐसे अनुरोध करती है।

यह एजेंट metadata में परिवर्तनों की निगरानी करने के लिए डिज़ाइन किया गया है। विशेष रूप से, मेटाडेटा में SSH सार्वजनिक कुंजी के लिए एक फ़ील्ड शामिल है। जब मेटाडेटा में एक नई सार्वजनिक SSH कुंजी जोड़ी जाती है, तो एजेंट स्वचालित रूप से इसे .authorized_key फ़ाइल में अधिकृत करता है। यदि आवश्यक हो, तो यह एक नया उपयोगकर्ता भी बना सकता है और उन्हें sudoers में जोड़ सकता है।

एजेंट परिवर्तनों की निगरानी करने के लिए सभी मेटाडेटा मानों को पुनरावृत्त करने के लिए एक अनुरोध भेजता है (GET /computeMetadata/v1/?recursive=true)। यह अनुरोध मेटाडेटा सर्वर को केवल तब प्रतिक्रिया भेजने के लिए प्रेरित करने के लिए डिज़ाइन किया गया है जब पिछले पुनर्प्राप्ति के बाद मेटाडेटा में कोई परिवर्तन हुआ हो, जिसे एक Etag द्वारा पहचाना जाता है (wait_for_change=true&last_etag=)। इसके अतिरिक्त, एक timeout पैरामीटर (timeout_sec=) शामिल है। यदि निर्दिष्ट समय सीमा के भीतर कोई परिवर्तन नहीं होता है, तो सर्वर अपरिवर्तित मानों के साथ प्रतिक्रिया करता है।

यह प्रक्रिया IMDS (Instance Metadata Service) को 60 सेकंड के बाद प्रतिक्रिया देने की अनुमति देती है यदि कोई कॉन्फ़िगरेशन परिवर्तन नहीं हुआ है, जिससे फर्जी कॉन्फ़िगरेशन प्रतिक्रिया को गेस्ट एजेंट में इंजेक्ट करने के लिए एक संभावित विंडो बनती है।

एक हमलावर इस पर Man-in-the-Middle (MitM) attack करके लाभ उठा सकता है, IMDS सर्वर से प्रतिक्रिया को स्पूफ करके और एक नई सार्वजनिक कुंजी डालकर। इससे होस्ट पर अनधिकृत SSH पहुंच सक्षम हो सकती है।

Escape Technique

हालांकि ARP स्पूफिंग Google Compute Engine नेटवर्क पर अप्रभावी है, rshijack का एक संशोधित संस्करण जो Ezequiel द्वारा विकसित किया गया है, पैकेट इंजेक्शन के लिए संचार में SSH उपयोगकर्ता को इंजेक्ट करने के लिए उपयोग किया जा सकता है।

rshijack का यह संस्करण ACK और SEQ नंबरों को कमांड-लाइन तर्क के रूप में इनपुट करने की अनुमति देता है, जिससे वास्तविक मेटाडेटा सर्वर प्रतिक्रिया से पहले प्रतिक्रिया को स्पूफ करना आसान हो जाता है। इसके अतिरिक्त, एक छोटी शेल स्क्रिप्ट का उपयोग विशेष रूप से तैयार किए गए पेलोड को लौटाने के लिए किया जाता है। यह पेलोड Google Guest Agent को wouter उपयोगकर्ता बनाने के लिए ट्रिगर करता है जिसमें .authorized_keys फ़ाइल में एक निर्दिष्ट सार्वजनिक कुंजी होती है।

स्क्रिप्ट मेटाडेटा सर्वर को Google Guest Agent को विभिन्न मेटाडेटा मानों के बारे में तुरंत सूचित करने से रोकने के लिए वही ETag का उपयोग करती है, इस प्रकार प्रतिक्रिया में देरी होती है।

स्पूफिंग को निष्पादित करने के लिए, निम्नलिखित चरण आवश्यक हैं:

  1. Metadata सर्वर के लिए अनुरोधों की निगरानी करें tcpdump का उपयोग करते हुए:

tcpdump -S -i eth0 'host 169.254.169.254 and port 80' &

एक पंक्ति की तलाश करें जो इस तरह की हो:

<TIME> IP <LOCAL_IP>.<PORT> > 169.254.169.254.80: Flags [P.], seq <NUM>:<TARGET_ACK>, ack <TARGET_SEQ>, win <NUM>, length <NUM>: HTTP: GET /computeMetadata/v1/?timeout_sec=<SECONDS>&last_etag=<ETAG>&alt=json&recursive=True&wait_for_change=True HTTP/1.1
  1. सही ETAG के साथ नकली मेटाडेटा डेटा rshijack को भेजें:

fakeData.sh <ETAG> | rshijack -q eth0 169.254.169.254:80 <LOCAL_IP>:<PORT> <TARGET_SEQ> <TARGET_ACK>; ssh -i id_rsa -o StrictHostKeyChecking=no wouter@localhost

यह कदम सार्वजनिक कुंजी को अधिकृत करता है, संबंधित निजी कुंजी के साथ SSH कनेक्शन सक्षम करता है।

संदर्भ

Support HackTricks

Last updated