# Az - Container Registry

{{#include ../../../banners/hacktricks-training.md}}

## Osnovne informacije

Azure Container Registry (ACR) je sigurna, privatna registracija koja vam omogućava da **čuvate, upravljate i pristupate slikama kontejnera u Azure oblaku**. Besprekorno se integriše sa nekoliko Azure usluga, pružajući automatizovane tokove izgradnje i implementacije na velikoj skali. Sa funkcijama kao što su geo-replikacija i skeniranje ranjivosti, ACR pomaže da se obezbedi sigurnost i usklađenost na nivou preduzeća za aplikacije u kontejnerima.

### Dozvole

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 se mogu dodeliti nad Container Registry:

- Pristup Resource Manager-u
- Kreiranje/brisanje registracije
- Push slike
- Pull slike
- Brisanje podataka o slici
- Promena politika
- Potpisivanje slika

Takođe postoje neke **ugrađene uloge** koje se mogu dodeliti, a moguće je i kreirati **prilagođene uloge**.

![](/images/registry_roles.png)

### Autentifikacija

> [!WARNING]
> Veoma je važno da, čak i ako ime registracije sadrži neka velika slova, uvek koristite **mala slova** za prijavu, push i pull slika.

Postoje 4 načina za autentifikaciju na ACR:

- **Sa Entra ID**: Ovo je **podrazumevani** način autentifikacije na ACR. Koristi **`az acr login`** komandu za autentifikaciju na ACR. Ova komanda će **sačuvati akreditive** u **`~/.docker/config.json`** datoteci. Štaviše, ako pokrećete ovu komandu iz okruženja bez pristupa docker socket-u, kao u **cloud shell**, moguće je koristiti **`--expose-token`** flag za dobijanje **tokena** za autentifikaciju na ACR. Zatim, da biste se autentifikovali, treba da koristite kao korisničko ime `00000000-0000-0000-0000-000000000000` kao: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **Sa administratorskim nalogom**: Administratorski korisnik je podrazumevano onemogućen, ali može biti omogućen i tada će biti moguće pristupiti registru sa **korisničkim imenom** i **lozinkom** administratorskog naloga sa punim dozvolama za registraciju. Ovo je još uvek podržano jer neke Azure usluge to koriste. Imajte na umu da su za ovog korisnika kreirane **2 lozinke** i obe su važeće. Možete ga omogućiti sa `az acr update -n <acrName> --admin-enabled true`. Imajte na umu da je korisničko ime obično ime registracije (a ne `admin`).
- **Sa tokenom**: Moguće je kreirati **token** sa **specifičnom `scope map`** (dozvole) za pristup registru. Zatim, moguće je koristiti ovo ime tokena kao korisničko ime i neku od generisanih lozinki za autentifikaciju na registru sa `docker login -u <registry-name> -p <password> aregistry-url>`
- **Sa Service Principal**: Moguće je kreirati **service principal** i dodeliti ulogu kao **`AcrPull`** za povlačenje slika. Zatim, biće moguće **prijaviti se na registraciju** koristeći SP appId kao korisničko ime i generisanu tajnu kao lozinku.

Primer skripte iz [dokumentacije](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) za generisanje SP sa pristupom nad registracijom:
```bash
#!/bin/bash
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)

PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"
```
### Enkripcija

Samo **Premium SKU** podržava **enkripciju u mirovanju** za slike i druge artefakte.

### Mrežno povezivanje

Samo **Premium SKU** podržava **privatne krajnje tačke**. Ostali samo podržavaju **javne pristupe**. Javna krajnja tačka ima format `<registry-name>.azurecr.io`, a privatna krajnja tačka ima format `<registry-name>.privatelink.azurecr.io`. Iz tog razloga, ime registra mora biti jedinstveno u celoj Azure.

### Microsoft Defender za Cloud

Ovo vam omogućava da **skenirate slike** u registru na **ranjivosti**.

### Soft-deletion

Funkcija **soft-delete** vam omogućava da **opravite obrisani registar** unutar naznačenog broja dana. Ova funkcija je **onemogućena po defaultu**.

### Webhook-ovi

Moguće je **kreirati webhook-ove** unutar registara. U ovom webhook-u potrebno je navesti URL gde će **zahtev biti poslat svaki put kada se izvrši push ili delete akcija**. Štaviše, Webhook-ovi mogu označiti opseg kako bi ukazali na repozitorijume (slike) koji će biti pogođeni. Na primer, 'foo:\*' znači događaje pod repozitorijumom 'foo'.

Iz perspektive napadača, zanimljivo je proveriti ovo **pre nego što se izvrši bilo kakva akcija** u registru, i privremeno ga ukloniti ako je potrebno, kako bi se izbeglo otkrivanje.

### Povezani registri

Ovo u suštini omogućava **ogledanje slika** iz jednog registra u drugi, obično smešten u lokalnom okruženju.

Ima 2 moda: **ReadOnly** i **ReadWrite**. U prvom, slike se samo **preuzimaju** iz izvornog registra, a u drugom, slike se takođe mogu **gurnuti** u izvorni registar.

Da bi klijenti pristupili registru iz Azure, generiše se **token** kada se koristi povezani registar.

### Izvršenja i zadaci

Izvršenja i zadaci omogućavaju izvršavanje akcija vezanih za kontejnere u Azure koje ste obično morali raditi lokalno ili u CI/CD pipeline-u. Na primer, možete **izgraditi, gurnuti i pokrenuti slike u registru**.

Najlakši način za izgradnju i pokretanje kontejnera je korišćenje redovnog izvršenja:
```bash
# Build
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --file Dockerfile .

# Run
az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null
```
Međutim, to će pokrenuti izvršenja koja nisu previše zanimljiva iz perspektive napadača jer nemaju nijednu upravljanu identitet.

Međutim, **tasks** mogu imati **system and user managed identity** pridružene njima. Ovi zadaci su korisni za **escalate privileges** u kontejneru. U odeljku o eskalaciji privilegija moguće je videti kako koristiti zadatke za eskalaciju privilegija.

### Cache

Funkcija keširanja omogućava **download images from an external repository** i čuvanje novih verzija u registru. Zahteva da se konfigurišu neki **credentials** odabirom kredencijala iz Azure Vault-a.

Ovo je veoma zanimljivo iz perspektive napadača jer omogućava **pivot to an external platform** ako napadač ima dovoljno dozvola za pristup kredencijalima, **download images from an external repository** i konfigurisanje keša može se takođe koristiti kao **persistence mechanism**.

## Enumeration

> [!WARNING]
> Veoma je važno da, čak i ako naziv registra sadrži neka velika slova, treba koristiti samo mala slova u URL-u za pristup.
```bash
# List of all the registries
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
az acr list

# Get the details of a registry
az acr show --name <registry-name>

# List tokens of a registry
az acr token list --registry <registry-name> --resource-group <res-group>

# List repositories in a registry
az acr repository list --name <registry-name> --resource-group <res-group>

# List the tags of a repository
az acr repository show-tags --repository <repository-name> --name <registry-name> --resource-group <res-group>

# List deleted repository tags
## At the time of this writing there isn't yet any command to restore it
az acr repository list-deleted --name <registry-name>

# List tasks
## Check the git URL or the command
az acr task list --registry <registry-name>

# List tasks runs
az acr task list-runs --registry <registry-name>

# List connected registries
az acr connected-registry list --registry <registry-name>

# List cache
az acr cache list --registry <registry-name>

# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>
```
## Eskalacija privilegija i post eksploatacija

{{#ref}}
../az-privilege-escalation/az-automation-accounts-privesc.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)
- [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager)

{{#include ../../../banners/hacktricks-training.md}}
