# Az - Container Registry

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

## Basiese Inligting

Azure Container Registry (ACR) is 'n veilige, private registrasie wat jou toelaat om **hou, bestuur en toegang te verkry tot houerbeelde in die Azure wolk**. Dit integreer naatloos met verskeie Azure dienste, wat geoutomatiseerde bou- en ontplooiing werkvloei op skaal bied. Met funksies soos geo-replikaasies en kwesbaarheidsskandering, help ACR om ondernemingsgraad sekuriteit en nakoming vir gecontaineriseerde toepassings te verseker.

### Toestemmings

Dit is die **verskillende toestemmings** [volgens die dokumentasie](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:

- Toegang tot Hulpbronbestuurder
- Skep/verwyder registrasie
- Stoot beeld
- Trek beeld
- Verwyder beelddata
- Verander beleide
- Teken beelde

Daar is ook 'n paar **ingeboude rolle** wat toegeken kan word, en dit is ook moontlik om **pasgemaakte rolle** te skep.

![](/images/registry_roles.png)

### Verifikasie

> [!WARNING]
> Dit is baie belangrik dat selfs al bevat die registrasienaam 'n paar hoofletters, jy altyd **kleinletters** moet gebruik om in te log, beelde te stoot en te trek.

Daar is 4 maniere om aan 'n ACR te verifieer:

- **Met Entra ID**: Dit is die **standaard** manier om aan 'n ACR te verifieer. Dit gebruik die **`az acr login`** opdrag om aan die ACR te verifieer. Hierdie opdrag sal **die geloofsbriewe** in die **`~/.docker/config.json`** lêer stoor. Boonop, as jy hierdie opdrag vanaf 'n omgewing sonder toegang tot 'n docker socket soos in 'n **cloud shell** uitvoer, is dit moontlik om die **`--expose-token`** vlag te gebruik om die **token** te verkry om aan die ACR te verifieer. Dan, om te verifieer, moet jy die gebruikersnaam `00000000-0000-0000-0000-000000000000` gebruik soos: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **Met 'n administrateurrekening**: Die administrateur gebruiker is standaard gedeaktiveer, maar dit kan geaktiveer word en dan sal dit moontlik wees om toegang tot die registrasie te verkry met die **gebruikersnaam** en **wagwoord** van die administrateurrekening met volle toestemmings tot die registrasie. Dit word steeds ondersteun omdat sommige Azure dienste dit gebruik. Let daarop dat **2 wagwoorde** vir hierdie gebruiker geskep word en albei geldig is. Jy kan dit aktiveer met `az acr update -n <acrName> --admin-enabled true`. Let daarop dat die gebruikersnaam gewoonlik die registrasienaam is (en nie `admin` nie).
- **Met 'n token**: Dit is moontlik om 'n **token** met 'n **spesifieke `scope map`** (toestemmings) te skep om toegang tot die registrasie te verkry. Dan, is dit moontlik om die naam van die token as gebruikersnaam en enige van die gegenereerde wagwoorde te gebruik om aan die registrasie te verifieer met `docker login -u <registry-name> -p <password> <registry-url>`
- **Met 'n Dienshoof**: Dit is moontlik om 'n **dienshoof** te skep en 'n rol soos **`AcrPull`** toe te ken om beelde te trek. Dan sal dit moontlik wees om **in te log op die registrasie** met die SP appId as gebruikersnaam en 'n gegenereerde geheim as wagwoord.

Voorbeeldskrip van die [dokumentasie](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) om 'n SP te genereer met toegang oor 'n registrasie:
```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"
```
### Enkripsie

Slegs die **Premium SKU** ondersteun **enkripsie in rus** vir die beelde en ander artefakte.

### Netwerk

Slegs die **Premium SKU** ondersteun **private eindpunte**. Die ander ondersteun slegs **publieke toegang**. 'n Publieke eindpunt het die formaat `<registry-name>.azurecr.io` en 'n private eindpunt het die formaat `<registry-name>.privatelink.azurecr.io`. Om hierdie rede moet die naam van die registrasie uniek wees oor alle Azure.

### Microsoft Defender vir Cloud

Dit stel jou in staat om die **beelde** in die registrasie vir **kwesbaarhede** te **skandeer**.

### Sagte-verwydering

Die **sagte-verwydering** kenmerk stel jou in staat om 'n **verwyderde registrasie** binne die aangeduide aantal dae te **herstel**. Hierdie kenmerk is **standaard gedeaktiveer**.

### Webhooks

Dit is moontlik om **webhooks** binne registrasies te **skep**. In hierdie webhook is dit nodig om die URL te spesifiseer waar 'n **versoek gestuur sal word wanneer 'n druk of verwyder aksie uitgevoer word**. Boonop kan Webhooks 'n omvang aandui om die repositories (beelde) aan te dui wat geraak sal word. Byvoorbeeld, 'foo:\*' beteken gebeurtenisse onder die repository 'foo'.

Van 'n aanvaller se perspektief is dit interessant om dit te kontroleer **voor enige aksie** in die registrasie uitgevoer word, en dit tydelik te verwyder indien nodig, om te voorkom dat jy opgespoor word.

### Gekonnekteerde registrasies

Dit stel basies in staat om die **beelde** van een registrasie na 'n ander te **spieël**, gewoonlik geleë op die perseel.

Dit het 2 modi: **LeesSlegs** en **LeesSkryf**. In die eerste een, word die beelde slegs **getrek** van die bronregistrasie, en in die tweede een, kan beelde ook **gestoot** word na die bronregistrasie.

Om kliënte toe te laat om toegang tot die registrasie vanaf Azure te verkry, word 'n **token** gegenereer wanneer die gekonnekteerde registrasie gebruik word.

### Lopies & Take

Lopies & Take stel jou in staat om aksies rakende Azure houers uit te voer wat jy tipies lokaal of in 'n CI/CD-pyplyn nodig gehad het om te doen. Byvoorbeeld, jy kan **bou, druk, en loop beelde in die registrasie**.

Die maklikste manier om 'n houer te bou en te loop, is om 'n gewone Loop te gebruik:
```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
```
However, dit sal lopies aktiveer wat nie baie interessant is vanuit 'n aanvaller se perspektief nie, want hulle het geen bestuurde identiteit aan hulle geheg nie.

However, **tasks** kan 'n **stelsel en gebruiker bestuurde identiteit** aan hulle hê. Hierdie take is diegene wat nuttig is om **privileges te verhoog** in die houer. In die afdeling oor die verhoging van privileges is dit moontlik om te sien hoe om take te gebruik om privileges te verhoog.

### Cache

Die cache-funksie laat toe om **beelde van 'n eksterne repository af te laai** en die nuwe weergawes in die registrasie te stoor. Dit vereis dat daar 'n paar **bewyse geconfigureer** moet word deur die bewese uit 'n Azure Vault te kies.

Dit is baie interessant vanuit 'n aanvaller se perspektief omdat dit toelaat om te **pivot na 'n eksterne platform** as die aanvaller genoeg regte het om toegang tot die bewese te verkry, **beelde van 'n eksterne repository af te laai** en die konfigurasie van 'n cache kan ook as 'n **volhardingsmeganisme** gebruik word.

## Enumeration

> [!WARNING]
> Dit is baie belangrik dat selfs al bevat die registrasienaam 'n paar hoofletters, jy moet slegs kleinletters in die url gebruik om toegang daartoe te verkry.
```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>
```
## Ongeauthentiseerde Toegang

{{#ref}}
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
{{#endref}}

## Privilege Escalation & Post Exploitation

{{#ref}}
../az-privilege-escalation/az-container-registry-privesc.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)
- [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}}
