diff --git a/src/pentesting-cloud/azure-security/az-services/az-storage.md b/src/pentesting-cloud/azure-security/az-services/az-storage.md index c769598fd..6076a8ea5 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-storage.md +++ b/src/pentesting-cloud/azure-security/az-services/az-storage.md @@ -4,94 +4,114 @@ ## Informazioni di base -Gli Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che forniscono **storage cloud scalabile, sicuro e altamente disponibile per vari tipi di dati**, inclusi blob (oggetti binari di grandi dimensioni), file, code e tabelle. Servono come contenitori che raggruppano questi diversi servizi di storage sotto un unico namespace per una gestione facile. +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. -**Opzioni di configurazione principali**: +**Principali opzioni di configurazione**: -- Ogni storage account deve avere un **nome unico in tutti gli Azure**. +- 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** contro guasti di rack, disco e datacenter. +- È possibile scegliere tra **4 tipi di ridondanza per proteggere** da guasti a livello di rack, disco e datacenter. **Opzioni di configurazione della sicurezza**: -- **Richiedere trasferimento sicuro per le operazioni API REST**: Richiedere TLS in qualsiasi comunicazione con lo storage. -- **Consente di abilitare l'accesso anonimo su contenitori individuali**: In caso contrario, non sarà possibile abilitare l'accesso anonimo in futuro. -- **Abilitare l'accesso con chiave dello storage account**: In caso contrario, l'accesso con chiavi condivise sarà vietato. -- **Versione minima TLS**. -- **Ambito consentito per le operazioni di copia**: Consenti da qualsiasi storage account, da qualsiasi storage account dello stesso tenant Entra o da storage account con endpoint privati nella stessa rete virtuale. +- **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. +- **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. -**Opzioni di Blob Storage**: +**Opzioni Blob Storage**: -- **Consenti replicazione cross-tenant**. -- **Livello di accesso**: Hot (dati accessibili frequentemente), Cool e Cold (dati raramente accessibili). +- **Allow cross-tenant replication** +- **Access tier**: Hot (dati accessati frequentemente), Cool e Cold (dati raramente accessati) -**Opzioni di rete**: +**Opzioni di networking**: -- **Accesso di rete**: -- Consenti da tutte le reti. -- Consenti da reti virtuali e indirizzi IP selezionati. -- Disabilita l'accesso pubblico e utilizza l'accesso privato. -- **Endpoint privati**: Consente una connessione privata allo storage account da una rete virtuale. +- **Network access**: +- 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 **Opzioni di protezione dei dati**: -- **Ripristino point-in-time per contenitori**: Consente di ripristinare i contenitori a uno stato precedente. -- Richiede versioning, change feed e blob soft delete per essere abilitati. -- **Abilitare soft delete per i blob**: Abilita un periodo di retention in giorni per i blob eliminati (anche sovrascritti). -- **Abilitare soft delete per i contenitori**: Abilita un periodo di retention in giorni per i contenitori eliminati. -- **Abilitare soft delete per le condivisioni di file**: Abilita un periodo di retention in giorni per le condivisioni di file eliminate. -- **Abilitare versioning per i blob**: Mantieni le versioni precedenti dei tuoi blob. -- **Abilitare blob change feed**: Tieni traccia dei log di creazione, modifica ed eliminazione dei blob. -- **Abilitare il supporto per l'immutabilità a livello di versione**: Consente di impostare una politica di retention basata sul tempo a livello di account che si applicherà a tutte le versioni dei blob. -- Il supporto per l'immutabilità a livello di versione e il ripristino point-in-time per i contenitori non possono essere abilitati simultaneamente. +- **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. -**Opzioni di configurazione della crittografia**: +**Opzioni di crittografia**: -- **Tipo di crittografia**: È possibile utilizzare chiavi gestite da Microsoft (MMK) o chiavi gestite dal cliente (CMK). -- **Abilitare la crittografia dell'infrastruttura**: Consente di crittografare i dati "per maggiore sicurezza". +- **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". -### Endpoint di storage +### Storage endpoints -
Servizio di storageEndpoint
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net
+
Storage ServiceEndpoint
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net
### Esposizione pubblica -Se "Consenti accesso pubblico ai blob" è **abilitato** (disabilitato per impostazione predefinita), durante la creazione di un contenitore è possibile: +Se "Allow Blob public access" è **enabled** (disabled by default), quando si crea un container è possibile: -- Dare **accesso pubblico per leggere i blob** (è necessario conoscere il nome). -- **Elencare i blob del contenitore** e **leggerli**. -- Renderlo completamente **privato**. +- Dare **accesso pubblico in lettura ai blob** (è necessario conoscere il nome). +- **Listare i blob del container** e **leggerli**. +- Rendersi completamente **privato**.
-### Connettersi allo Storage +#### Auditing anonymous blob exposure -Se trovi qualche **storage** a cui puoi connetterti, puoi utilizzare lo strumento [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) per farlo. +- **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 --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`. +- **Enumerare l'esposizione a livello di container** dove il flag è abilitato: +```bash +az storage container list --account-name \ +--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. +- `null`: privato; autenticazione richiesta. +- **Dimostrare l'accesso** senza credenziali: +- Se `publicAccess` è `Container`, l'elenco anonimo funziona: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`. +- Per entrambi `Blob` e `Container`, il download anonimo del blob funziona quando il nome è noto: +```bash +az storage blob download -c -n --account-name --file /dev/stdout +# or via raw HTTP +curl "https://.blob.core.windows.net//" +``` +### Connettersi allo storage -## Accesso allo Storage +Se trovi uno **storage** a cui puoi connetterti, puoi usare lo strumento [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) per farlo. + +## Accesso allo storage ### RBAC -È possibile utilizzare i principi di Entra ID con **ruoli RBAC** per accedere agli storage account ed è il modo raccomandato. +È possibile usare i principal di Entra ID con i **ruoli RBAC** per accedere agli storage accounts ed è il metodo raccomandato. ### Chiavi di accesso -Gli storage account hanno chiavi di accesso che possono essere utilizzate per accedervi. Questo fornisce **accesso completo allo storage account.** +Gli account di storage dispongono di chiavi di accesso che possono essere usate per accederci. Questo fornisce l'**accesso completo all'account di storage.**
-### **Chiavi condivise & Chiavi condivise Lite** +### **Shared Keys & Lite Shared Keys** -È possibile [**generare Chiavi Condivise**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmate con le chiavi di accesso per autorizzare l'accesso a determinate risorse tramite un URL firmato. +È 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. > [!NOTE] -> Nota che la parte `CanonicalizedResource` rappresenta la risorsa dei servizi di storage (URI). E se qualche parte nell'URL è codificata, dovrebbe essere codificata anche all'interno del `CanonicalizedResource`. +> 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`. > [!NOTE] -> Questo è **utilizzato per impostazione predefinita da `az` cli** per autenticare le richieste. Per farlo utilizzare le credenziali del principale Entra ID, indica il parametro `--auth-mode login`. +> 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`. -- È possibile generare una **chiave condivisa per i servizi blob, queue e file** firmando le seguenti informazioni: +- È possibile generare una **shared key per i servizi blob, queue e file** firmando le seguenti informazioni: ```bash StringToSign = VERB + "\n" + Content-Encoding + "\n" + @@ -108,7 +128,7 @@ Range + "\n" + CanonicalizedHeaders + CanonicalizedResource; ``` -- È possibile generare una **chiave condivisa per i servizi di tabella** firmando le seguenti informazioni: +- È possibile generare una **shared key for table services** firmando le seguenti informazioni: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + @@ -116,7 +136,7 @@ Content-Type + "\n" + Date + "\n" + CanonicalizedResource; ``` -- È possibile generare una **lite shared key per i servizi blob, queue e file** firmando le seguenti informazioni: +- È possibile generare una **lite shared key for blob, queue and file services** firmando le seguenti informazioni: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + @@ -130,7 +150,7 @@ CanonicalizedResource; StringToSign = Date + "\n" CanonicalizedResource ``` -Quindi, per utilizzare la chiave, può essere fatto nell'intestazione Authorization seguendo la sintassi: +Quindi, per usare la chiave, si può inserirla nell'header Authorization seguendo la sintassi: ```bash Authorization="[SharedKey|SharedKeyLite] :" #e.g. @@ -144,73 +164,76 @@ Content-Length: 0 ``` ### **Shared Access Signature** (SAS) -Le Shared Access Signatures (SAS) sono URL sicuri e limitati nel tempo che **concedono permessi specifici per accedere a risorse** in un account di Azure Storage senza esporre le chiavi di accesso dell'account. Mentre le chiavi di accesso forniscono accesso amministrativo completo a tutte le risorse, la SAS consente un controllo granulare specificando i permessi (come lettura o scrittura) e definendo un tempo di scadenza. +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. -#### Tipi di SAS +#### SAS Types -- **User delegation SAS**: Questa viene creata da un **Entra ID principal** che firmerà la SAS e delega i permessi dall'utente alla SAS. Può essere utilizzata solo con **blob e data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). È possibile **revocare** tutte le SAS delegate generate dall'utente. -- Anche se è possibile generare una SAS di delega con "più" permessi di quelli che l'utente ha. Tuttavia, se il principal non li ha, non funzionerà (no privesc). -- **Service SAS**: Questa è firmata utilizzando una delle **chiavi di accesso** dell'account di storage. Può essere utilizzata per concedere accesso a risorse specifiche in un singolo servizio di storage. Se la chiave viene rinnovata, la SAS smetterà di funzionare. -- **Account SAS**: È anch'essa firmata con una delle **chiavi di accesso** dell'account di storage. Concede accesso a risorse attraverso i servizi di un account di storage (Blob, Queue, Table, File) e può includere operazioni a livello di servizio. +- **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. -Un URL SAS firmato da una **chiave di accesso** appare così: +A SAS URL signed by an **access key** looks like this: - `https://.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D` -Un URL SAS firmato come **user delegation** appare così: +A SAS URL signed as a **user delegation** looks like this: - `https://.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D` -Nota alcuni **parametri http**: +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 **firma** che convalida la SAS +- Il **`sig`** è la **signature** che valida la SAS -#### Permessi SAS +#### SAS permissions -Quando si genera una SAS è necessario indicare i permessi che dovrebbe concedere. A seconda dell'oggetto su cui viene generata la SAS, potrebbero essere inclusi permessi diversi. Ad 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 differenti. 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 -## Supporto SFTP per Azure Blob Storage +## SFTP Support for Azure Blob Storage -Azure Blob Storage ora supporta il protocollo SSH File Transfer Protocol (SFTP), consentendo il trasferimento e la gestione sicura dei file direttamente su Blob Storage senza richiedere soluzioni personalizzate o prodotti di terze parti. +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. -### Caratteristiche principali +### Key Features -- Supporto del protocollo: SFTP funziona con gli account di Blob Storage configurati con namespace gerarchico (HNS). Questo organizza i blob in directory e sottodirectory per una navigazione più semplice. -- Sicurezza: SFTP utilizza identità utente locali per l'autenticazione e non si integra con RBAC o ABAC. Ogni utente locale può autenticarsi tramite: -- Password generate da Azure -- Coppie di chiavi SSH pubbliche-private -- Permessi granulari: Permessi come Lettura, Scrittura, Cancellazione e Elenco possono essere assegnati agli utenti locali per un massimo di 100 contenitori. -- Considerazioni di rete: Le connessioni SFTP vengono effettuate tramite la porta 22. Azure supporta configurazioni di rete come firewall, endpoint privati o reti virtuali per proteggere il traffico SFTP. +- 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. -### Requisiti di configurazione +### Setup Requirements -- Namespace gerarchico: L'HNS deve essere abilitato durante la creazione dell'account di storage. -- Crittografia supportata: Richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (ad es., rsa-sha2-256, ecdsa-sha2-nistp256). -- Configurazione SFTP: +- 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). +- SFTP Configuration: - Abilitare SFTP sull'account di storage. - Creare identità utente locali con permessi appropriati. -- Configurare le directory home per gli utenti per definire la loro posizione di partenza all'interno del contenitore. +- Configurare le home directory per gli utenti per definire la loro posizione iniziale all'interno del container. -### Permessi +### Permissions -| Permesso | Simbolo | Descrizione | -| --------------------- | ------- | ------------------------------------ | -| **Lettura** | `r` | Leggi il contenuto del file. | -| **Scrittura** | `w` | Carica file e crea directory. | -| **Elenco** | `l` | Elenca i contenuti delle directory. | -| **Cancellazione** | `d` | Cancella file o directory. | -| **Creazione** | `c` | Crea file o directory. | -| **Modifica proprietà**| `o` | Cambia l'utente o il gruppo proprietario. | -| **Modifica permessi** | `p` | Cambia le ACL su file o directory. | +| 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. | ## Enumerazione {{#tabs }} {{#tab name="az cli" }} + +
+az cli enumerazione ```bash # Get storage accounts az storage account list #Get the account name from here @@ -327,10 +350,15 @@ az storage account local-user list \ --account-name \ --resource-group ``` +
+ {{#endtab }} {{#tab name="Az PowerShell" }} -```bash + +
+Az PowerShell enumerazione +```powershell # Get storage accounts Get-AzStorageAccount | fl # Get rules to access the storage account @@ -387,16 +415,18 @@ New-AzStorageBlobSASToken ` -Permission racwdl ` -ExpiryTime (Get-Date "2024-12-31T23:59:00Z") ``` +
+ {{#endtab }} {{#endtabs }} -### Condivisioni di File +### Condivisioni di file {{#ref}} az-file-shares.md {{#endref}} -## Escalation dei Privilegi +## Privilege Escalation {{#ref}} ../az-privilege-escalation/az-storage-privesc.md @@ -408,7 +438,7 @@ az-file-shares.md ../az-post-exploitation/az-blob-storage-post-exploitation.md {{#endref}} -## Persistenza +## Persistence {{#ref}} ../az-persistence/az-storage-persistence.md @@ -419,5 +449,9 @@ 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: 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) +- [https://learn.microsoft.com/en-us/cli/azure/storage/blob](https://learn.microsoft.com/en-us/cli/azure/storage/blob) {{#include ../../../banners/hacktricks-training.md}}