GCP - Network Docker Escape
प्रारंभिक स्थिति
इस तकनीक के जहां भी वर्णन किया गया है, हमलावरों ने GCP द्वारा प्रबंधित एक डॉकर कंटेनर के अंदर रूट एक्सेस प्राप्त कर लिया था जिसमें होस्ट नेटवर्क तक पहुंच थी (और क्षमताएं CAP_NET_ADMIN
और CAP_NET_RAW
).
हमला
जब आप एक सामान्य Google Compute Engine इंस्टेंस पर नेटवर्क ट्रैफिक की जांच करते हैं, तो आप देखेंगे कि बहुत सारे सादे HTTP अनुरोध मेटाडेटा इंस्टेंस की ओर निर्देशित होते हैं 169.254.169.254
पर। ऐसे अनुरोध करने वाली एक सेवा खुले स्रोत Google Guest Agent है। अनुरोध का उदाहरण:
यह एजेंट मेटाडेटा में परिवर्तनों की निगरानी करता है। मेटाडेटा के अंदर एक फील्ड होती है जिसमें अधिकृत SSH पब्लिक कीज़ होती हैं।
इसलिए, जब मेटाडेटा में एक नई पब्लिक SSH की दिखाई देती है, तो एजेंट उसे उपयोगकर्ता की .authorized_key
फाइल में अधिकृत करेगा और यदि आवश्यक हो तो एक नया उपयोगकर्ता बनाएगा और उसे sudoers में जोड़ देगा।
Google Guest Agent द्वारा परिवर्तनों की निगरानी करने का तरीका एक कॉल के माध्यम से होता है जो सभी मेटाडेटा मानों को पुनरावृत्ति से प्राप्त करता है (GET /computeMetadata/v1/?recursive=true
), यह संकेत देते हुए कि मेटाडेटा सर्वर को केवल तब प्रतिक्रिया भेजनी चाहिए जब पिछले प्राप्त किए गए मेटाडेटा मानों के संबंध में कोई परिवर्तन हो, जिसे उसके Etag द्वारा पहचाना जाता है (wait_for_change=true&last_etag=
)।
इस अनुरोध में एक समय सीमा भी शामिल होती है (timeout_sec=
), इसलिए यदि निर्दिष्ट समय के भीतर कोई परिवर्तन नहीं होता है, तो मेटाडेटा सर्वर अपरिवर्तित मानों के साथ प्रतिक्रिया देता है।
इससे IMDS को प्रतिक्रिया देने के लिए 60 सेकंड के बाद अगर उस अंतराल में कोई कॉन्फ़िगरेशन परिवर्तन नहीं हुआ था, जिससे आईएमडीएस से गेस्ट एजेंट को एक नकली कॉन्फ़िगरेशन प्रतिक्रिया इंजेक्ट करने का अवसर मिलता है।
इसलिए, यदि कोई हमलावर MitM हमला करने में सफल होता है, तो वह IMDS सर्वर से प्रतिक्रिया को स्पूफ कर सकता है, एक नई पब्लिक की डालकर जिससे एक नया उपयोगकर्ता होस्ट पर SSH के माध्यम से पहुंच सकता है।
एस्केप
ARP स्पूफिंग Google Compute Engine नेटवर्क पर काम नहीं करती है, हालांकि, Ezequiel ने इस संशोधित संस्करण को उत्पन्न किया rshijack **** जिसका उपयोग SSH उपयोगकर्ता को इंजेक्ट करने के लिए संचार में एक पैकेट इंजेक्ट करने के लिए किया जा सकता है।
इस संशोधित संस्करण का rshijack आपको कमांड-लाइन तर्कों के रूप में ACK और SEQ नंबर पास करने की अनुमति देता है, समय बचाता है और हमें असली Metadata प्रतिक्रिया आने से पहले एक प्रतिक्रिया को स्पूफ करने की अनुमति देता है।
इसके अलावा, यह छोटी शेल स्क्रिप्ट **** जो एक विशेष रूप से तैयार किए गए पेलोड को वापस करेगी जो Google Guest Agent को उपयोगकर्ता wouter
, को बनाने के लिए प्रेरित करेगी, हमारी अपनी पब्लिक की के साथ उसकी .authorized_keys
फाइल में।
यह स्क्रिप्ट ETag को एक पैरामीटर के रूप में प्राप्त करती है, क्योंकि एक ही ETag रखकर, Metadata सर्वर तुरंत Google Guest Agent को यह नहीं बताएगा कि अगली प्रतिक्रिया पर मेटाडेटा मान अलग थे, इसके बजाय timeout_sec में निर्दिष्ट सेकंडों की प्रतीक्षा करेगा।
स्पूफिंग प्राप्त करने के लिए, आपको tcpdump के साथ Metadata सर्वर के लिए अनुरोधों को देखना चाहिए: tcpdump -S -i eth0 'host 169.254.169.254 and port 80' &
एक लाइन की प्रतीक्षा करते हुए जो इस तरह दिखती थी:
जब आपको वह मान मिले तो नकली मेटाडेटा डेटा सही 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 के माध्यम से निजी की के साथ जुड़ने की अनुमति देगा।
संदर्भ
Last updated