# Az - Storage Privesc

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

## Storage Privesc

Per ulteriori informazioni sullo storage, controlla:

{{#ref}}
../az-services/az-storage.md
{{#endref}}

### `Microsoft.Storage/storageAccounts/listkeys/action`

Un principale con questo permesso sarà in grado di elencare (e i valori segreti) delle **chiavi di accesso** degli account di storage. Consentendo al principale di elevare i propri privilegi sugli account di storage.
```bash
az storage account keys list --account-name <acc-name>
```
### `Microsoft.Storage/storageAccounts/regenerateKey/action`

Un principale con questo permesso sarà in grado di rinnovare e ottenere il nuovo valore segreto delle **chiavi di accesso** degli account di archiviazione. Consentendo al principale di aumentare i propri privilegi sugli account di archiviazione.

Inoltre, nella risposta, l'utente riceverà il valore della chiave rinnovata e anche di quella non rinnovata:
```bash
az storage account keys renew --account-name <acc-name> --key key2
```
### `Microsoft.Storage/storageAccounts/write`

Un principale con questo permesso sarà in grado di creare o aggiornare un account di archiviazione esistente aggiornando qualsiasi impostazione come regole di rete o politiche.
```bash
# e.g. set default action to allow so network restrictions are avoided
az storage account update --name <acc-name> --default-action Allow

# e.g. allow an IP address
az storage account update --name <acc-name> --add networkRuleSet.ipRules value=<ip-address>
```
## Blobs Specific privesc

### `Microsoft.Storage/storageAccounts/blobServices/containers/immutabilityPolicies/write` | `Microsoft.Storage/storageAccounts/blobServices/containers/immutabilityPolicies/delete`

Il primo permesso consente di **modificare le politiche di immutabilità** nei contenitori e il secondo di eliminarle.

> [!NOTE]
> Nota che se una politica di immutabilità è in stato di blocco, non puoi fare nessuna delle due cose.
```bash
az storage container immutability-policy delete \
--account-name <STORAGE_ACCOUNT_NAME> \
--container-name <CONTAINER_NAME> \
--resource-group <RESOURCE_GROUP>

az storage container immutability-policy update \
--account-name <STORAGE_ACCOUNT_NAME> \
--container-name <CONTAINER_NAME> \
--resource-group <RESOURCE_GROUP> \
--period <NEW_RETENTION_PERIOD_IN_DAYS>
```
## File shares specific privesc

### `Microsoft.Storage/storageAccounts/fileServices/takeOwnership/action`

Questo dovrebbe consentire a un utente con questo permesso di poter prendere possesso dei file all'interno del filesystem condiviso.

### `Microsoft.Storage/storageAccounts/fileServices/fileshares/files/modifypermissions/action`

Questo dovrebbe consentire a un utente con questo permesso di poter modificare i permessi dei file all'interno del filesystem condiviso.

### `Microsoft.Storage/storageAccounts/fileServices/fileshares/files/actassuperuser/action`

Questo dovrebbe consentire a un utente con questo permesso di poter eseguire azioni all'interno di un filesystem come superutente.

### `Microsoft.Storage/storageAccounts/localusers/write (Microsoft.Storage/storageAccounts/localusers/read)`

Con questo permesso, un attaccante può creare e aggiornare (se ha il permesso `Microsoft.Storage/storageAccounts/localusers/read`) un nuovo utente locale per un account Azure Storage (configurato con namespace gerarchico), inclusa la specifica dei permessi e della directory home dell'utente. Questo permesso è significativo perché consente all'attaccante di concedere a se stesso l'accesso a un account di archiviazione con permessi specifici come lettura (r), scrittura (w), eliminazione (d) e elenco (l) e altro ancora. Inoltre, i metodi di autenticazione che utilizza possono essere password generate da Azure e coppie di chiavi SSH. Non c'è alcun controllo se un utente esiste già, quindi è possibile sovrascrivere altri utenti già presenti. L'attaccante potrebbe elevare i propri privilegi e ottenere accesso SSH all'account di archiviazione, esponendo o compromettendo potenzialmente dati sensibili.
```bash
az storage account local-user create \
--account-name <STORAGE_ACCOUNT_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--name <LOCAL_USER_NAME> \
--permission-scope permissions=rwdl service=blob resource-name=<CONTAINER_NAME> \
--home-directory <HOME_DIRECTORY> \
--has-ssh-key false/true # Depends on the auth method to use
```
### `Microsoft.Storage/storageAccounts/localusers/regeneratePassword/action`

Con questo permesso, un attaccante può rigenerare la password per un utente locale in un account Azure Storage. Questo concede all'attaccante la possibilità di ottenere nuove credenziali di autenticazione (come una password SSH o SFTP) per l'utente. Sfruttando queste credenziali, l'attaccante potrebbe ottenere accesso non autorizzato all'account di archiviazione, eseguire trasferimenti di file o manipolare i dati all'interno dei contenitori di archiviazione. Ciò potrebbe comportare perdite di dati, corruzione o modifica malevola del contenuto dell'account di archiviazione.
```bash
az storage account local-user regenerate-password \
--account-name <STORAGE_ACCOUNT_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--name <LOCAL_USER_NAME>
```
Per accedere ad Azure Blob Storage tramite SFTP (is_hns_enabled dovrebbe essere true) utilizzando un utente locale tramite SFTP puoi (puoi anche utilizzare una chiave ssh per connetterti):
```bash
sftp <storage-account-name>.<local-user-name>@<storage-account-name>.blob.core.windows.net
#regenerated-password
```
### `Microsoft.Storage/storageAccounts/restoreBlobRanges/action`, `Microsoft.Storage/storageAccounts/blobServices/containers/read`, `Microsoft.Storage/storageAccounts/read` && `Microsoft.Storage/storageAccounts/listKeys/action`

Con queste autorizzazioni, un attaccante può ripristinare un contenitore eliminato specificando il suo ID di versione eliminata o annullare l'eliminazione di specifici blob all'interno di un contenitore, se erano stati precedentemente eliminati in modo soft. Questa escalation di privilegi potrebbe consentire a un attaccante di recuperare dati sensibili che dovevano essere eliminati permanentemente, portando potenzialmente a accessi non autorizzati.
```bash
#Restore the soft deleted container
az storage container restore \
--account-name <STORAGE_ACCOUNT_NAME> \
--name <CONTAINER_NAME> \
--deleted-version <VERSION>

#Restore the soft deleted blob
az storage blob undelete \
--account-name <STORAGE_ACCOUNT_NAME> \
--container-name <CONTAINER_NAME> \
--name "fileName.txt"
```
### `Microsoft.Storage/storageAccounts/fileServices/shares/restore/action` && `Microsoft.Storage/storageAccounts/read`

Con questi permessi, un attaccante può ripristinare una condivisione file di Azure eliminata specificando il suo ID versione eliminata. Questa escalation di privilegi potrebbe consentire a un attaccante di recuperare dati sensibili che dovevano essere eliminati permanentemente, portando potenzialmente a un accesso non autorizzato.
```bash
az storage share-rm restore \
--storage-account <STORAGE_ACCOUNT_NAME> \
--name <FILE_SHARE_NAME> \
--deleted-version <VERSION>
```
## Altre autorizzazioni interessanti (TODO)

- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/manageOwnership/action: Cambia la proprietà del blob
- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/modifyPermissions/action: Modifica le autorizzazioni del blob
- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action: Restituisce il risultato del comando blob
- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/immutableStorage/runAsSuperUser/action

## Riferimenti

- [https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/storage#microsoftstorage](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/storage#microsoftstorage)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support)

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