# Az - Key Vault

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

## Informazioni di base

**Azure Key Vault** è un servizio cloud fornito da Microsoft Azure per memorizzare e gestire in modo sicuro informazioni sensibili come **segreti, chiavi, certificati e password**. Funziona come un repository centralizzato, offrendo accesso sicuro e controllo dettagliato utilizzando Azure Active Directory (Azure AD). Dal punto di vista della sicurezza, Key Vault fornisce **protezione tramite modulo di sicurezza hardware (HSM)** per le chiavi crittografiche, garantisce che i segreti siano crittografati sia a riposo che in transito e offre una gestione degli accessi robusta tramite **controllo degli accessi basato sui ruoli (RBAC)** e politiche. Presenta anche **registrazione delle audit**, integrazione con Azure Monitor per il tracciamento degli accessi e rotazione automatizzata delle chiavi per ridurre il rischio di esposizione prolungata delle chiavi.

Vedi [Azure Key Vault REST API overview](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates) per dettagli completi.

Secondo la [**documentazione**](https://learn.microsoft.com/en-us/azure/key-vault/general/basic-concepts), i Vault supportano la memorizzazione di chiavi software e chiavi supportate da HSM, segreti e certificati. I pool HSM gestiti supportano solo chiavi supportate da HSM.

Il **formato URL** per i **vault** è `https://{vault-name}.vault.azure.net/{object-type}/{object-name}/{object-version}` e per i pool HSM gestiti è: `https://{hsm-name}.managedhsm.azure.net/{object-type}/{object-name}/{object-version}`

Dove:

- `vault-name` è il nome **unico** globale del key vault
- `object-type` può essere "keys", "secrets" o "certificates"
- `object-name` è il nome **unico** dell'oggetto all'interno del key vault
- `object-version` è generato dal sistema e utilizzato facoltativamente per indirizzare una **versione unica di un oggetto**.

Per accedere ai segreti memorizzati nel vault è possibile scegliere tra 2 modelli di autorizzazione durante la creazione del vault:

- **Politica di accesso al vault**
- **Azure RBAC** (il più comune e raccomandato)
- Puoi trovare tutte le autorizzazioni granulari supportate in [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)

### Controllo degli accessi <a href="#access-control" id="access-control"></a>

L'accesso a una risorsa Key Vault è controllato da due piani:

- Il **piano di gestione**, il cui obiettivo è [management.azure.com](http://management.azure.com/).
- Viene utilizzato per gestire il key vault e le **politiche di accesso**. Solo il controllo degli accessi basato sui ruoli di Azure (**RBAC**) è supportato.
- Il **piano dati**, il cui obiettivo è **`<vault-name>.vault.azure.com`**.
- Viene utilizzato per gestire e accedere ai **dati** (chiavi, segreti e certificati) **nel key vault**. Questo supporta le **politiche di accesso al vault** o Azure **RBAC**.

Un ruolo come **Contributor** che ha autorizzazioni nel piano di gestione per gestire le politiche di accesso può accedere ai segreti modificando le politiche di accesso.

### Ruoli integrati RBAC di 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>

### Accesso alla rete

In Azure Key Vault, le regole del **firewall** possono essere impostate per **consentire operazioni del piano dati solo da reti virtuali specificate o intervalli di indirizzi IPv4**. Questa restrizione influisce anche sull'accesso tramite il portale di amministrazione di Azure; gli utenti non saranno in grado di elencare chiavi, segreti o certificati in un key vault se il loro indirizzo IP di accesso non è all'interno dell'intervallo autorizzato.

Per analizzare e gestire queste impostazioni, puoi utilizzare l'**Azure CLI**:
```bash
az keyvault show --name name-vault --query networkAcls
```
Il comando precedente mostrerà le impostazioni del f**irewall di `name-vault`**, inclusi gli intervalli IP abilitati e le politiche per il traffico negato.

Inoltre, è possibile creare un **endpoint privato** per consentire una connessione privata a un vault.

### Protezione dalla Cancellazione

Quando viene creato un key vault, il numero minimo di giorni per consentire la cancellazione è 7. Ciò significa che ogni volta che si tenta di eliminare quel key vault, saranno necessari **almeno 7 giorni per essere eliminato**.

Tuttavia, è possibile creare un vault con **protezione dalla cancellazione disabilitata**, che consente al key vault e agli oggetti di essere eliminati durante il periodo di retention. Anche se, una volta che questa protezione è abilitata per un vault, non può essere disabilitata.

## Enumerazione

{{#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>
az keyvault list --query '[].{name:name}' -o tsv # Get just the names
# 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>

# List deleted key vaults
az keyvault secret list-deleted --vault-name <vault-name>
```
{{#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 }}

## Escalation dei privilegi

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

## Post Sfruttamento

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

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