Az - Container Registry
Reading time: 8 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
Azure Container Registry (ACR) é um registro privado e seguro que permite armazenar, gerenciar e acessar imagens de contêiner na nuvem Azure. Ele se integra perfeitamente com vários serviços Azure, fornecendo fluxos de trabalho automatizados de construção e implantação em grande escala. Com recursos como geo-replicação e verificação de vulnerabilidades, o ACR ajuda a garantir segurança e conformidade de nível empresarial para aplicativos conteinerizados.
Permissões
Estas são as diferentes permissões de acordo com a documentação que podem ser concedidas sobre um Container Registry:
- Acesso ao Resource Manager
- Criar/excluir registro
- Enviar imagem
- Puxar imagem
- Excluir dados da imagem
- Alterar políticas
- Assinar imagens
Existem também alguns papéis integrados que podem ser atribuídos, e também é possível criar papéis personalizados.
Autenticação
warning
É muito importante que, mesmo que o nome do registro contenha algumas letras maiúsculas, você sempre deve usar letras minúsculas para fazer login, enviar e puxar imagens.
Existem 4 maneiras de autenticar-se em um ACR:
- Com Entra ID: Esta é a maneira padrão de autenticar-se em um ACR. Ele usa o comando
az acr login
para autenticar-se no ACR. Este comando irá armazenar as credenciais no arquivo~/.docker/config.json
. Além disso, se você estiver executando este comando de um ambiente sem acesso a um socket docker, como em um cloud shell, é possível usar a flag--expose-token
para obter o token para autenticar-se no ACR. Então, para autenticar, você precisa usar como nome de usuário00000000-0000-0000-0000-000000000000
, como:docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN
- Com uma conta de administrador: O usuário administrador está desativado por padrão, mas pode ser ativado e então será possível acessar o registro com o nome de usuário e senha da conta de administrador com permissões totais para o registro. Isso ainda é suportado porque alguns serviços Azure o utilizam. Note que 2 senhas são criadas para este usuário e ambas são válidas. Você pode ativá-lo com
az acr update -n <acrName> --admin-enabled true
. Note que o nome de usuário geralmente é o nome do registro (e nãoadmin
). - Com um token: É possível criar um token com um
scope map
específico (permissões) para acessar o registro. Então, é possível usar este nome de token como nome de usuário e algumas das senhas geradas para autenticar-se no registro comdocker login -u <registry-name> -p <password> aregistry-url>
- Com um Service Principal: É possível criar um service principal e atribuir um papel como
AcrPull
para puxar imagens. Então, será possível fazer login no registro usando o appId do SP como nome de usuário e um segredo gerado como senha.
Exemplo de script da documentação para gerar um SP com acesso a um registro:
#!/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"
Criptografia
Apenas o Premium SKU suporta criptografia em repouso para as imagens e outros artefatos.
Rede
Apenas o Premium SKU suporta pontos de extremidade privados. Os outros suportam apenas acesso público. Um ponto de extremidade público tem o formato <registry-name>.azurecr.io
e um ponto de extremidade privado tem o formato <registry-name>.privatelink.azurecr.io
. Por essa razão, o nome do registro deve ser único em toda a Azure.
Microsoft Defender for Cloud
Isso permite que você escaneie as imagens no registro em busca de vulnerabilidades.
Soft-delete
O recurso de soft-delete permite que você recupere um registro excluído dentro do número de dias indicado. Este recurso está desativado por padrão.
Webhooks
É possível criar webhooks dentro dos registros. Neste webhook, é necessário especificar a URL onde uma solicitação será enviada sempre que uma ação de push ou delete for realizada. Além disso, os Webhooks podem indicar um escopo para indicar os repositórios (imagens) que serão afetados. Por exemplo, 'foo:*' significa eventos sob o repositório 'foo'.
Do ponto de vista de um atacante, é interessante verificar isso antes de realizar qualquer ação no registro e removê-lo temporariamente, se necessário, para evitar ser detectado.
Registros conectados
Isso basicamente permite espelhar as imagens de um registro para outro, geralmente localizado no local.
Possui 2 modos: ReadOnly e ReadWrite. No primeiro, as imagens são apenas baixadas do registro de origem, e no segundo, as imagens também podem ser enviadas para o registro de origem.
Para que os clientes acessem o registro a partir da Azure, um token é gerado quando o registro conectado é utilizado.
Execuções e Tarefas
Execuções e Tarefas permitem executar ações relacionadas a contêineres no Azure que você normalmente precisaria fazer localmente ou em um pipeline de CI/CD. Por exemplo, você pode construir, enviar e executar imagens no registro.
A maneira mais fácil de construir e executar um contêiner é usando uma Execução regular:
# 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
No entanto, isso irá acionar execuções que não são muito interessantes do ponto de vista de um atacante, pois não têm nenhuma identidade gerenciada anexada a elas.
No entanto, tasks podem ter uma identidade gerenciada pelo sistema e pelo usuário anexada a elas. Essas tasks são as úteis para escalar privilégios no contêiner. Na seção de escalonamento de privilégios, é possível ver como usar tasks para escalar privilégios.
Cache
O recurso de cache permite baixar imagens de um repositório externo e armazenar as novas versões no registro. É necessário ter algumas credenciais configuradas selecionando as credenciais de um Azure Vault.
Isso é muito interessante do ponto de vista de um atacante, pois permite pivotar para uma plataforma externa se o atacante tiver permissões suficientes para acessar as credenciais, baixar imagens de um repositório externo e configurar um cache também pode ser usado como um mecanismo de persistência.
Enumeração
warning
É muito importante que, mesmo que o nome do registro contenha algumas letras maiúsculas, você deve usar apenas letras minúsculas na URL para acessá-lo.
# 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 <registry-name>
# List tokens of a registry
az acr token list --registry <registry-name> --resource-group <res-group>
# List repositories in a registry
az acr repository list --name <registry-name> --resource-group <res-group>
# List the tags of a repository
az acr repository show-tags --repository <repository-name> --name <registry-name> --resource-group <res-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 <registry-name>
# List tasks
## Check the git URL or the command
az acr task list --registry <registry-name>
# List tasks runs
az acr task list-runs --registry <registry-name>
# List connected registries
az acr connected-registry list --registry <registry-name>
# List cache
az acr cache list --registry <registry-name>
# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>
Escalação de Privilégios & Pós-Exploração
Az - Automation Accounts Privesc
Referências
- 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
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.