Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor

This commit is contained in:
Translator
2026-01-18 15:04:10 +00:00
parent 2e44681b6a
commit 0e3eae5935

View File

@@ -4,27 +4,27 @@
## Informazioni di base
Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che forniscono storage cloud scalabile, sicuro e altamente disponibile per vari tipi di dati, inclusi blobs (oggetti binari di grandi dimensioni), file, queue e table. Servono come contenitori che raggruppano questi diversi servizi di storage sotto un unico namespace per una gestione semplice.
Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che forniscono storage cloud scalabile, sicuro e altamente disponibile per vari tipi di dati, inclusi blobs (binary large objects), file, queue e table. Funzionano come contenitori che raggruppano questi diversi servizi di storage sotto un unico namespace per una gestione più semplice.
**Principali opzioni di configurazione**:
- Ogni storage account deve avere un **nome univoco in tutto Azure**.
- Ogni storage account è distribuito in una **regione** o in una zona estesa di Azure.
- È possibile selezionare la versione **premium** dello storage account per migliori prestazioni.
- È possibile scegliere tra **4 tipi di ridondanza per proteggere** da guasti a livello di rack, disco e datacenter.
- Ogni storage account deve avere un **nome univoco su tutto Azure**.
- Ogni storage account è distribuito in una **regione** o in una zona estesa di Azure
- È possibile selezionare la versione **premium** dello storage account per prestazioni superiori
- È possibile selezionare tra **4 tipi di ridondanza per proteggere** da guasti a livello di rack, drive e datacenter.
**Opzioni di configurazione della sicurezza**:
- **Require secure transfer for REST API operations**: Richiede TLS in qualsiasi comunicazione con lo storage.
- **Allows enabling anonymous access on individual containers**: Se disabilitato, non sarà possibile abilitare l'accesso anonimo in futuro.
- **Enable storage account key access**: Se disabilitato, l'accesso con Shared Keys sarà proibito.
- **Require secure transfer for REST API operations**: Richiede TLS in ogni comunicazione con lo storage
- **Allows enabling anonymous access on individual containers**: Se disabilitato, non sarà possibile abilitare l'accesso anonimo in futuro
- **Enable storage account key access**: Se disabilitato, l'accesso con Shared Keys sarà vietato
- **Minimum TLS version**
- **Permitted scope for copy operations**: Permette da qualsiasi storage account, da qualsiasi storage account dello stesso Entra tenant o da storage account con private endpoints nella stessa virtual network.
- **Permitted scope for copy operations**: Consente da qualsiasi storage account, da qualsiasi storage account nello stesso Entra tenant o da storage account con private endpoints nella stessa virtual network.
**Opzioni Blob Storage**:
**Opzioni per Blob Storage**:
- **Allow cross-tenant replication**
- **Access tier**: Hot (dati accessati frequentemente), Cool e Cold (dati raramente accessati)
- **Access tier**: Hot (dati ad accesso frequente), Cool e Cold (dati raramente accessati)
**Opzioni di networking**:
@@ -32,54 +32,69 @@ Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che fornisco
- Allow from all networks
- Allow from selected virtual networks and IP addresses
- Disable public access and use private access
- **Private endpoints**: Permette una connessione privata allo storage account da una virtual network
- **Private endpoints**: Consente una connessione privata allo storage account da una virtual network
**Opzioni di protezione dei dati**:
- **Point-in-time restore for containers**: Consente di ripristinare i container a uno stato precedente.
- Richiede l'abilitazione di versioning, change feed e blob soft delete.
- **Enable soft delete for blobs**: Abilita un periodo di retention (in giorni) per i blob eliminati (anche sovrascritti).
- **Enable soft delete for containers**: Abilita un periodo di retention (in giorni) per i container eliminati.
- **Enable soft delete for file shares**: Abilita un periodo di retention (in giorni) per i file share eliminati.
- **Enable versioning for blobs**: Mantiene versioni precedenti dei tuoi blob.
- **Enable blob change feed**: Conserva log di create, modification e delete dei blob.
- **Enable version-level immutability support**: Consente di impostare una policy di retention basata sul tempo a livello di account che si applicherà a tutte le versioni dei blob.
- Version-level immutability support e point-in-time restore for containers non possono essere abilitati simultaneamente.
- **Point-in-time restore for containers**: Permette di ripristinare i container a uno stato precedente
- Richiede che versioning, change feed e blob soft delete siano abilitati.
- **Enable soft delete for blobs**: Abilita un periodo di retention (in giorni) per i blob eliminati (anche sovrascritti)
- **Enable soft delete for containers**: Abilita un periodo di retention (in giorni) per i container eliminati
- **Enable soft delete for file shares**: Abilita un periodo di retention (in giorni) per i file share eliminati
- **Enable versioning for blobs**: Mantiene versioni precedenti dei tuoi blob
- **Enable blob change feed**: Mantiene log di creazione, modifica ed eliminazione dei blob
- **Enable version-level immutability support**: Permette di impostare una policy di retention basata sul tempo a livello di account che si applicherà a tutte le versioni dei blob.
- Version-level immutability support e point-in-time restore for containers non possono essere abilitati contemporaneamente.
**Opzioni di crittografia**:
- **Encryption type**: È possibile usare Microsoft-managed keys (MMK) o Customer-managed keys (CMK).
- **Enable infrastructure encryption**: Permette di cifrare i dati due volte "per maggiore sicurezza".
- **Encryption type**: È possibile usare Microsoft-managed keys (MMK) o Customer-managed keys (CMK)
- **Enable infrastructure encryption**: Consente una doppia crittografia dei dati "per maggiore sicurezza"
### Storage endpoints
<table data-header-hidden><thead><tr><th width="197">Storage Service</th><th>Endpoint</th></tr></thead><tbody><tr><td><strong>Blob storage</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>Data Lake Storage</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Queue storage</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Table storage</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="197">Servizio di storage</th><th>Endpoint</th></tr></thead><tbody><tr><td><strong>Blob storage</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>Data Lake Storage</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Queue storage</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Table storage</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>
### Esposizione pubblica
Se "Allow Blob public access" è **enabled** (disabled by default), quando si crea un container è possibile:
Se "Allow Blob public access" è **enabled** (disabilitato per default), quando si crea un container è possibile:
- Dare **accesso pubblico in lettura ai blob** (è necessario conoscere il nome).
- Dare **accesso pubblico in sola lettura ai blob** (è necessario conoscere il nome).
- **Listare i blob del container** e **leggerli**.
- Rendersi completamente **privato**.
- Renderlo completamente **privato**
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>
#### Auditing anonymous blob exposure
### Static website (`$web`) exposure & leaked secrets
- **Individuare gli storage accounts** che possono esporre dati: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Se `allowBlobPublicAccess` è `false` non puoi rendere i container pubblici.
- **Ispezionare gli account a rischio** per confermare il flag e altre impostazioni deboli: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Enumerare l'esposizione a livello di container** dove il flag è abilitato:
- **Static websites** sono serviti dal contenitore speciale `$web` tramite un endpoint region-specific come `https://<account>.z13.web.core.windows.net/`.
- Il contenitore `$web` può riportare `publicAccess: null` via l'API blob, ma i file sono comunque raggiungibili tramite l'endpoint del sito statico, quindi lasciare artifact di config/IaC lì può leaked secrets.
- Flusso di audit rapido:
```bash
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
# Enumerate containers (including $web) and their public flags
az storage container list --account-name <acc-name> --auth-mode login
# List files served by the static site even when publicAccess is null
az storage blob list --container-name '$web' --account-name <acc-name> --auth-mode login
# Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS)
az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name <acc-name> --auth-mode login
```
### Verifica dell'esposizione anonima dei blob
- **Individua storage accounts** che possono esporre dati: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Se `allowBlobPublicAccess` è `false` non puoi rendere pubblici i containers.
- **Ispeziona gli account a rischio** per confermare il flag e altre impostazioni deboli: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Enumera l'esposizione a livello di container** dove il flag è abilitato:
```bash
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
```
- `"Blob"`: letture anonime consentite **solo quando il nome del blob è noto** (nessuna enumerazione).
- `"Container"`: anonimo **elenco + lettura** di ogni blob.
- `"Container"`: elenco anonimo **+ lettura** di ogni blob.
- `null`: privato; autenticazione richiesta.
- **Dimostrare l'accesso** senza credenziali:
- Se `publicAccess` è `Container`, l'elenco anonimo funziona: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- Per entrambi `Blob` e `Container`, il download anonimo del blob funziona quando il nome è noto:
- Per `Blob` e `Container`, il download anonimo del blob funziona quando il nome è noto:
```bash
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
@@ -93,23 +108,23 @@ Se trovi uno **storage** a cui puoi connetterti, puoi usare lo strumento [**Micr
### RBAC
È possibile usare i principal di Entra ID con i **ruoli RBAC** per accedere agli storage accounts ed è il metodo raccomandato.
È possibile utilizzare i principal Entra ID con **RBAC roles** per accedere agli storage account ed è il metodo raccomandato.
### Chiavi di accesso
### Access Keys
Gli account di storage dispongono di chiavi di accesso che possono essere usate per accederci. Questo fornisce l'**accesso completo all'account di storage.**
Gli storage account dispongono di access keys che possono essere utilizzate per accedervi. Questo fornisce **accesso completo all'account di storage.**
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
### **Shared Keys & Lite Shared Keys**
È possibile [**generare Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmate con le chiavi di accesso per autorizzare l'accesso a risorse specifiche tramite una URL firmata.
È possibile [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmati con le access keys per autorizzare l'accesso a determinate risorse tramite una URL firmata.
> [!NOTE]
> Nota che la parte `CanonicalizedResource` rappresenta la risorsa del servizio di storage (URI). E se qualsiasi parte dell'URL è encoded, dovrebbe essere codificata anche dentro il `CanonicalizedResource`.
> Nota che la parte `CanonicalizedResource` rappresenta la risorsa del servizio di storage (URI). E se qualsiasi parte dell'URL è codificata, dovrebbe essere codificata anche all'interno di `CanonicalizedResource`.
> [!NOTE]
> Questo è **usato di default dalla `az` cli** per autenticare le richieste. Per farla usare le credenziali del principal Entra ID indica il parametro `--auth-mode login`.
> Questo comportamento è **usato di default da `az` cli** per autenticare le richieste. Per far sì che utilizzi le credenziali del principal Entra ID, indica il parametro `--auth-mode login`.
- È possibile generare una **shared key per i servizi blob, queue e file** firmando le seguenti informazioni:
```bash
@@ -150,7 +165,7 @@ CanonicalizedResource;
StringToSign = Date + "\n"
CanonicalizedResource
```
Quindi, per usare la chiave, si può inserirla nell'header Authorization seguendo la sintassi:
Poi, per usare la chiave, può essere inserita nell'Authorization header seguendo la sintassi:
```bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
@@ -164,14 +179,14 @@ Content-Length: 0
```
### **Shared Access Signature** (SAS)
Shared Access Signatures (SAS) sono URL sicuri e limitati nel tempo che **concedono permessi specifici per accedere alle risorse** in un Azure Storage account senza esporre le access keys dell'account. Mentre le access keys forniscono accesso amministrativo completo a tutte le risorse, SAS permette un controllo granulare specificando i permessi (come read o write) e definendo un tempo di scadenza.
Le Shared Access Signatures (SAS) sono URL sicuri e a tempo limitato che **concedono permessi specifici per accedere a risorse** in un account Azure Storage senza esporre le chiavi di accesso dell'account. Mentre le chiavi di accesso forniscono accesso amministrativo completo a tutte le risorse, le SAS permettono un controllo granulare specificando permessi (come read o write) e definendo un tempo di scadenza.
#### SAS Types
- **User delegation SAS**: Viene creato da un **Entra ID principal** che firmerà la SAS e delegherà i permessi dall'utente alla SAS. Può essere utilizzato solo con **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). È possibile **revocare** tutte le user delegated SAS generate.
- È possibile generare una delegation SAS con permessi "maggiori" rispetto a quelli dell'utente. Tuttavia, se il principal non li possiede, non funzionerà (no privesc).
- **Service SAS**: È firmata usando una delle storage account **access keys**. Può essere usata per concedere accesso a risorse specifiche in un singolo servizio di storage. Se la key viene rinnovata, la SAS smetterà di funzionare.
- **Account SAS**: Anch'essa è firmata con una delle storage account **access keys**. Concede accesso a risorse attraverso i servizi dell'account di storage (Blob, Queue, Table, File) e può includere operazioni a livello di servizio.
- **User delegation SAS**: Questo viene creato da un **Entra ID principal** che firmerà la SAS e delegherà i permessi dall'utente alla SAS. Può essere usato solo con **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). È possibile **revocare** tutte le SAS delegate utente generate.
- Anche se è possibile generare una delegation SAS con permessi "maggiori" rispetto a quelli che l'utente possiede, se il principal non li ha, non funzionerà (no privesc).
- **Service SAS**: Questa è firmata usando una delle storage account **access keys**. Può essere usata per concedere accesso a risorse specifiche in un singolo servizio di storage. Se la key viene rinnovata, la SAS smetterà di funzionare.
- **Account SAS**: È anch'essa firmata con una delle storage account **access keys**. Concede accesso a risorse attraverso i servizi di un account di storage (Blob, Queue, Table, File) e può includere operazioni a livello di servizio.
A SAS URL signed by an **access key** looks like this:
@@ -185,55 +200,55 @@ Note some **http params**:
- Il parametro **`se`** indica la **data di scadenza** della SAS
- Il parametro **`sp`** indica i **permessi** della SAS
- Il **`sig`** è la **signature** che valida la SAS
- Il parametro **`sig`** è la **firma** che valida la SAS
#### SAS permissions
Quando si genera una SAS è necessario indicare i permessi che deve concedere. A seconda dell'oggetto su cui la SAS viene generata, possono essere inclusi permessi differenti. Per esempio:
Quando si genera una SAS è necessario indicare i permessi che deve concedere. A seconda dell'oggetto su cui la SAS viene generata possono essere inclusi permessi diversi. Per esempio:
- (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete
## SFTP Support for Azure Blob Storage
Azure Blob Storage ora supporta lo SSH File Transfer Protocol (SFTP), permettendo il trasferimento e la gestione sicuri dei file direttamente su Blob Storage senza richiedere soluzioni custom o prodotti di terze parti.
Azure Blob Storage ora supporta lo SSH File Transfer Protocol (SFTP), permettendo trasferimenti di file sicuri e la gestione direttamente su Blob Storage senza richiedere soluzioni personalizzate o prodotti di terze parti.
### Key Features
- Protocol Support: SFTP funziona con account Blob Storage configurati con hierarchical namespace (HNS). Questo organizza i blob in directory e sottodirectory per una navigazione più semplice.
- Security: SFTP usa identità utente locali per l'autenticazione e non si integra con RBAC o ABAC. Ogni utente locale può autenticarsi tramite:
- Azure-generated passwords
- Public-private SSH key pairs
- Granular Permissions: Permessi come Read, Write, Delete e List possono essere assegnati agli utenti locali per fino a 100 container.
- Networking Considerations: Le connessioni SFTP avvengono tramite la porta 22. Azure supporta configurazioni di rete come firewall, private endpoints o virtual networks per proteggere il traffico SFTP.
- coppie di chiavi SSH pubblico/privata
- Granular Permissions: permessi come Read, Write, Delete e List possono essere assegnati agli utenti locali per un massimo di 100 container.
- Networking Considerations: le connessioni SFTP avvengono tramite la porta 22. Azure supporta configurazioni di rete come firewall, private endpoints o virtual networks per mettere in sicurezza il traffico SFTP.
### Setup Requirements
- Hierarchical Namespace: HNS deve essere abilitato durante la creazione dell'account di storage.
- Supported Encryption: Richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (es. rsa-sha2-256, ecdsa-sha2-nistp256).
- Hierarchical Namespace: l'HNS deve essere abilitato durante la creazione dell'account di storage.
- Supported Encryption: richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (es. rsa-sha2-256, ecdsa-sha2-nistp256).
- SFTP Configuration:
- Abilitare SFTP sull'account di storage.
- Creare identità utente locali con permessi appropriati.
- Configurare le home directory per gli utenti per definire la loro posizione iniziale all'interno del container.
- Configurare le home directory per gli utenti per definire la loro posizione di partenza all'interno del container.
### Permissions
| Permesso | Simbolo | Descrizione |
| ---------------------- | ------ | ------------------------------------ |
| **Read** | `r` | Legge il contenuto del file. |
| **Write** | `w` | Carica file e crea directory. |
| **List** | `l` | Elenca il contenuto delle directory. |
| **Delete** | `d` | Elimina file o directory. |
| **Create** | `c` | Crea file o directory. |
| **Modify Ownership** | `o` | Modifica l'utente o il gruppo proprietario. |
| **Modify Permissions** | `p` | Modifica le ACL su file o directory. |
| **Lettura** | `r` | Legge il contenuto del file. |
| **Scrittura** | `w` | Carica file e crea directory. |
| **Elenco** | `l` | Elenca il contenuto delle directory. |
| **Eliminazione** | `d` | Elimina file o directory. |
| **Creazione** | `c` | Crea file o directory. |
| **Modifica Proprietà** | `o` | Cambia l'utente o il gruppo proprietario. |
| **Modifica Permessi** | `p` | Modifica le ACL su file o directory. |
## Enumerazione
## Enumeration
{{#tabs }}
{{#tab name="az cli" }}
<details>
<summary>az cli enumerazione</summary>
<summary>az cli enumeration</summary>
```bash
# Get storage accounts
az storage account list #Get the account name from here
@@ -420,25 +435,25 @@ New-AzStorageBlobSASToken `
{{#endtab }}
{{#endtabs }}
### Condivisioni di file
### Condivisioni file
{{#ref}}
az-file-shares.md
{{#endref}}
## Privilege Escalation
## Escalation dei privilegi
{{#ref}}
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}
## Post Exploitation
## Post-sfruttamento
{{#ref}}
../az-post-exploitation/az-blob-storage-post-exploitation.md
{{#endref}}
## Persistence
## Persistenza
{{#ref}}
../az-persistence/az-storage-persistence.md
@@ -449,6 +464,7 @@ az-file-shares.md
- [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- [https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview)
- [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)
- [Holiday Hack Challenge 2025 Spare Key (Azure static website SAS leak)](https://0xdf.gitlab.io/holidayhack2025/act1/spare-key)
- [Holiday Hack Challenge 2025: Blob Storage (Storage Secrets)](https://0xdf.gitlab.io/holidayhack2025/act1/blob-storage)
- [https://learn.microsoft.com/en-us/cli/azure/storage/account](https://learn.microsoft.com/en-us/cli/azure/storage/account)
- [https://learn.microsoft.com/en-us/cli/azure/storage/container](https://learn.microsoft.com/en-us/cli/azure/storage/container)