# Az - Key Vault

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

## Informations de base

**Azure Key Vault** est un service cloud fourni par Microsoft Azure pour stocker et gérer en toute sécurité des informations sensibles telles que **secrets, clés, certificats et mots de passe**. Il agit comme un référentiel centralisé, offrant un accès sécurisé et un contrôle granulaire à l'aide d'Azure Active Directory (Azure AD). D'un point de vue sécurité, Key Vault fournit une **protection par module de sécurité matériel (HSM)** pour les clés cryptographiques, garantit que les secrets sont chiffrés à la fois au repos et en transit, et offre une gestion d'accès robuste grâce à **l'accès basé sur les rôles (RBAC)** et aux politiques. Il dispose également de **journalisation des audits**, d'une intégration avec Azure Monitor pour le suivi des accès, et d'une rotation automatique des clés pour réduire le risque d'exposition prolongée des clés.

Voir [Azure Key Vault REST API overview](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates) pour des détails complets.

Selon les [**docs**](https://learn.microsoft.com/en-us/azure/key-vault/general/basic-concepts), les coffres prennent en charge le stockage de clés logicielles et de clés soutenues par HSM, de secrets et de certificats. Les pools HSM gérés ne prennent en charge que les clés soutenues par HSM.

Le **format d'URL** pour les **coffres** est `https://{vault-name}.vault.azure.net/{object-type}/{object-name}/{object-version}` et pour les pools HSM gérés c'est : `https://{hsm-name}.managedhsm.azure.net/{object-type}/{object-name}/{object-version}`

Où :

- `vault-name` est le nom **unique** au niveau mondial du coffre de clés
- `object-type` peut être "keys", "secrets" ou "certificates"
- `object-name` est le nom **unique** de l'objet dans le coffre de clés
- `object-version` est généré par le système et utilisé en option pour adresser une **version unique d'un objet**.

Pour accéder aux secrets stockés dans le coffre, il est possible de choisir entre 2 modèles de permissions lors de la création du coffre :

- **Politique d'accès au coffre**
- **Azure RBAC** (le plus courant et recommandé)
- Vous pouvez trouver toutes les permissions granulaires prises en charge sur [https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/security#microsoftkeyvault](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/security#microsoftkeyvault)

### Contrôle d'accès <a href="#access-control" id="access-control"></a>

L'accès à une ressource Key Vault est contrôlé par deux plans :

- Le **plan de gestion**, dont la cible est [management.azure.com](http://management.azure.com/).
- Il est utilisé pour gérer le coffre de clés et les **politiques d'accès**. Seul l'accès basé sur les rôles Azure (**RBAC**) est pris en charge.
- Le **plan de données**, dont la cible est **`<vault-name>.vault.azure.com`**.
- Il est utilisé pour gérer et accéder aux **données** (clés, secrets et certificats) **dans le coffre de clés**. Cela prend en charge les **politiques d'accès au coffre** ou Azure **RBAC**.

Un rôle comme **Contributor** qui a des permissions dans le plan de gestion pour gérer les politiques d'accès peut accéder aux secrets en modifiant les politiques d'accès.

### Rôles intégrés RBAC de Key Vault <a href="#rbac-built-in-roles" id="rbac-built-in-roles"></a>

<figure><img src="../../../images/image (27).png" alt=""><figcaption></figcaption></figure>

### Accès réseau

Dans Azure Key Vault, des règles de **pare-feu** peuvent être configurées pour **permettre les opérations du plan de données uniquement à partir de réseaux virtuels spécifiés ou de plages d'adresses IPv4**. Cette restriction affecte également l'accès via le portail d'administration Azure ; les utilisateurs ne pourront pas lister les clés, secrets ou certificats dans un coffre de clés si leur adresse IP de connexion n'est pas dans la plage autorisée.

Pour analyser et gérer ces paramètres, vous pouvez utiliser l'**Azure CLI** :
```bash
az keyvault show --name name-vault --query networkAcls
```
La commande précédente affichera les **paramètres de pare-feu de `name-vault`**, y compris les plages IP activées et les politiques pour le trafic refusé.

De plus, il est possible de créer un **point de terminaison privé** pour permettre une connexion privée à un coffre.

### Protection contre la suppression

Lorsqu'un coffre de clés est créé, le nombre minimum de jours autorisés pour la suppression est de 7. Ce qui signifie que chaque fois que vous essayez de supprimer ce coffre de clés, il faudra **au moins 7 jours pour être supprimé**.

Cependant, il est possible de créer un coffre avec **la protection contre la purge désactivée**, ce qui permet de purger le coffre de clés et les objets pendant la période de conservation. Cependant, une fois cette protection activée pour un coffre, elle ne peut pas être désactivée.

## Énumération

{{#tabs }}
{{#tab name="az" }}
```bash
# List all Key Vaults in the subscription
az keyvault list
# List Key Vaults in a specific Resource Group
az keyvault list --resource-group <ResourceGroupName>
# Show details of a specific Key Vault
az keyvault show --name <KeyVaultName> # If accessPolicies, you can see them here
# List all keys in a Key Vault
az keyvault key list --vault-name <KeyVaultName>
# List all secrets in a Key Vault
az keyvault secret list --vault-name <KeyVaultName>
# Get versions of a secret
az keyvault secret list-versions --vault-name <KeyVaultName> --name <SecretName>
# List all certificates in a Key Vault
az keyvault certificate list --vault-name <KeyVaultName>
# List all deleted Key Vaults in the subscription
az keyvault list-deleted
# Get properties of a deleted Key Vault
az keyvault show-deleted --name <KeyVaultName>
# Get assigned roles
az role assignment list --include-inherited --scope "/subscriptions/<subscription-uuid>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>"

# Get secret value
az keyvault secret show --vault-name <KeyVaultName> --name <SecretName>
# Get old versions secret value
az keyvault secret show --id https://<KeyVaultName>.vault.azure.net/secrets/<KeyVaultName>/<idOldVersion>
```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
# Get keyvault token
curl "$IDENTITY_ENDPOINT?resource=https://vault.azure.net&api-version=2017-09-01" -H secret:$IDENTITY_HEADER

# Connect with PS AzureAD
## $token from management API
Connect-AzAccount -AccessToken $token -AccountId 1937ea5938eb-10eb-a365-10abede52387 -KeyVaultAccessToken $keyvaulttoken

# Get details of a specific Key Vault
Get-AzKeyVault -VaultName <KeyVaultName>
# List all keys in a Key Vault
Get-AzKeyVaultKey -VaultName <KeyVaultName>
# List all secrets in a Key Vault
Get-AzKeyVaultSecret -VaultName <KeyVaultName>
# List all certificates in a Key Vault
Get-AzKeyVaultCertificate -VaultName <KeyVaultName>
# List all deleted Key Vaults in the subscription
Get-AzKeyVault -InRemovedState
# Get properties of a deleted Key Vault
Get-AzKeyVault -VaultName <KeyVaultName> -InRemovedState
# Get secret values
Get-AzKeyVaultSecret -VaultName <vault_name> -Name <secret_name> -AsPlainText
```
{{#endtab }}

{{#tab name="az script" }}
```bash
#!/bin/bash

# Dump all keyvaults from the subscription

# Define Azure subscription ID
AZ_SUBSCRIPTION_ID="your-subscription-id"

# Specify the filename for output
CSV_OUTPUT="vault-names-list.csv"

# Login to Azure account
az login

# Select the desired subscription
az account set --subscription $AZ_SUBSCRIPTION_ID

# Retrieve all resource groups within the subscription
AZ_RESOURCE_GROUPS=$(az group list --query "[].name" -o tsv)

# Initialize the CSV file with headers
echo "Vault Name,Associated Resource Group" > $CSV_OUTPUT

# Iterate over each resource group
for GROUP in $AZ_RESOURCE_GROUPS
do
# Fetch key vaults within the current resource group
VAULT_LIST=$(az keyvault list --resource-group $GROUP --query "[].name" -o tsv)

# Process each key vault
for VAULT in $VAULT_LIST
do
# Extract the key vault's name
VAULT_NAME=$(az keyvault show --name $VAULT --resource-group $GROUP --query "name" -o tsv)

# Append the key vault name and its resource group to the file
echo "$VAULT_NAME,$GROUP" >> $CSV_OUTPUT
done
done
```
{{#endtab }}
{{#endtabs }}

## Escalade de privilèges

{{#ref}}
../az-privilege-escalation/az-key-vault-privesc.md
{{#endref}}

## Post-exploitation

{{#ref}}
../az-post-exploitation/az-key-vault-post-exploitation.md
{{#endref}}

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