Az - Storage Accounts & Blobs

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di base

Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che forniscono cloud storage scalabile, sicuro e altamente disponibile per vari tipi di dati, inclusi blobs (binary large objects), files, queues e tables. Servono come contenitori che raggruppono questi diversi servizi di storage sotto un unico namespace per una gestione 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 Azure extended zone
  • È possibile selezionare la versione premium dello storage account per migliori prestazioni
  • È possibile selezionare tra 4 tipi di ridondanza per proteggere contro guasti 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
  • Minimum TLS version
  • Permitted scope for copy operations: Consenti 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:

  • Allow cross-tenant replication
  • Access tier: Hot (dati ad accesso frequente), Cool e Cold (dati raramente accessi)

Opzioni di rete:

  • Network access:
  • Consenti da tutte le reti
  • Consenti da virtual networks selezionate e indirizzi IP
  • Disabilita l’accesso pubblico e usa accesso privato
  • Private endpoints: Permettono una connessione privata allo storage account da una virtual network

Opzioni di protezione dei dati:

  • Point-in-time restore for containers: Permette di ripristinare i container a uno stato precedente
  • Richiede che siano abilitati versioning, change feed e blob soft delete.
  • Enable soft delete for blobs: Attiva un periodo di retention in giorni per i blob cancellati (anche sovrascritti)
  • Enable soft delete for containers: Attiva un periodo di retention in giorni per i container cancellati
  • Enable soft delete for file shares: Attiva un periodo di retention in giorni per i file share cancellati
  • Enable versioning for blobs: Mantiene versioni precedenti dei blob
  • Enable blob change feed: Tiene traccia delle operazioni di create, modification e delete sui 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 simultaneamente.

Opzioni di crittografia:

  • Encryption type: È possibile usare Microsoft-managed keys (MMK) o Customer-managed keys (CMK)
  • Enable infrastructure encryption: Permette di doppiare la cifratura dei dati “for more security”

Storage endpoints

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 “Allow Blob public access” è abilitato (disabilitato di default), quando si crea un container è possibile:

  • Dare accesso pubblico per la lettura dei blobs (è necessario conoscere il nome).
  • Listare i blob del container e leggerli.
  • Renderlo completamente privato

Static website ($web) exposure & leaked secrets

  • Le static websites sono servite dal contenitore speciale $web tramite un endpoint specifico per regione come https://<account>.z13.web.core.windows.net/.
  • Il container $web può riportare publicAccess: null tramite la blob API, ma i file sono comunque raggiungibili tramite lo static site endpoint, quindi lasciare artefatti di config/IaC lĂŹ può leak secrets.
  • Workflow di audit rapido:
# 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 gli storage account che possono esporre dati: az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'. Se allowBlobPublicAccess è false non puoi rendere i container pubblici.
  • 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:
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": elenco + lettura anonimi di ogni blob.
  • null: privato; autenticazione richiesta.
  • Dimostrare l’accesso senza credenziali:
  • Se publicAccess è Container, la lista anonima 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:
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
curl "https://<acc>.blob.core.windows.net/<container>/<blob>"

Connettersi allo Storage

Se trovi qualsiasi storage a cui puoi connetterti, puoi usare lo strumento Microsoft Azure Storage Explorer per farlo.

Accesso allo Storage

RBAC

È possibile usare i principal di Entra ID con ruoli RBAC per accedere agli storage account ed è il metodo raccomandato.

Access Keys

Gli storage account hanno delle access keys che possono essere usate per accedervi. Questo fornisce l’accesso completo allo storage account.

Shared Keys & Lite Shared Keys

È possibile generare Shared Keys firmate con le access keys per autorizzare l’accesso a determinate risorse tramite un URL firmato.

Note

Nota che la parte CanonicalizedResource rappresenta la risorsa del servizio di storage (URI). E se qualsiasi parte nell’URL è codificata, dovrebbe essere codificata anche all’interno del CanonicalizedResource.

Note

Questo è usato per 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 shared key per i servizi blob, queue e file firmando le seguenti informazioni:
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
Content-Language + "\n" +
Content-Length + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
If-Modified-Since + "\n" +
If-Match + "\n" +
If-None-Match + "\n" +
If-Unmodified-Since + "\n" +
Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
  • È possibile generare una shared key for table services firmando le seguenti informazioni:
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
  • È possibile generare una lite shared key for blob, queue and file services firmando le seguenti informazioni:
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
  • È possibile generare una lite shared key for table services firmando le seguenti informazioni:
StringToSign = Date + "\n"
CanonicalizedResource

Quindi, per usare la chiave, può essere inserita nell’header Authorization seguendo la sintassi:

Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=

PUT http://myaccount/mycontainer?restype=container&timeout=30 HTTP/1.1
x-ms-version: 2014-02-14
x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0

Shared Access Signature (SAS)

Le Shared Access Signatures (SAS) sono URL sicuri e temporanei 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 l’accesso amministrativo completo a tutte le risorse, le SAS permettono un controllo granulare specificando i permessi (come read o write) e definendo un tempo di scadenza.

Tipi di SAS

  • 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). È 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: Questo è firmato usando una delle access keys dell’account storage. Può essere usato 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 access keys dell’account 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.

Una URL SAS firmata da una access key assomiglia a questa:

  • https://<container_name>.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

Una URL SAS firmata come user delegation assomiglia a questa:

  • https://<container_name>.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:

  • 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

Permessi SAS

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

Supporto SFTP per Azure Blob Storage

Azure Blob Storage ora supporta lo SSH File Transfer Protocol (SFTP), permettendo il trasferimento sicuro di file e la gestione direttamente su Blob Storage senza richiedere soluzioni custom o prodotti di terze parti.

Caratteristiche principali

  • Supporto del protocollo: SFTP funziona con account Blob Storage configurati con hierarchical namespace (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:
  • Azure-generated passwords
  • Coppie di chiavi SSH pubblica/privata
  • Permessi granulari: Permessi come Read, Write, Delete e List possono essere assegnati agli utenti locali fino a 100 container.
  • Considerazioni di rete: 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

  • Hierarchical Namespace: HNS deve essere abilitato al momento della creazione dell’account di storage.
  • Crittografia supportata: Richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (es. rsa-sha2-256, ecdsa-sha2-nistp256).
  • Configurazione SFTP:
  • Abilitare SFTP sull’account di storage.
  • Creare identitĂ  utente locali con permessi appropriati.
  • Configurare directory home per gli utenti per definire la loro posizione iniziale all’interno del container.

Permissions

PermessoSymbolDescrizione
ReadrLegge il contenuto del file.
WritewCarica file e crea directory.
ListlElenca il contenuto delle directory.
DeletedElimina file o directory.
CreatecCrea file o directory.
Modify OwnershipoCambia l’utente o il gruppo proprietario.
Modify PermissionspModifica le ACL su file o directory.

Enumerazione

az cli enumeration ```bash # Get storage accounts az storage account list #Get the account name from here

BLOB STORAGE

List containers

az storage container list –account-name

Check if public access is allowed

az storage container show-permission
–account-name
-n

Make a container public

az storage container set-permission
–public-access container
–account-name
-n

List blobs in a container

az storage blob list
–container-name
–account-name

Download blob

az storage blob download
–account-name
–container-name
–name
–file </path/to/local/file>

Create container policy

az storage container policy create
–account-name mystorageaccount
–container-name mycontainer
–name fullaccesspolicy
–permissions racwdl
–start 2023-11-22T00:00Z
–expiry 2024-11-22T00:00Z

QUEUE

az storage queue list –account-name az storage message peek –account-name –queue-name

ACCESS KEYS

az storage account keys list –account-name

Check key policies (expiration time?)

az storage account show -n –query “{KeyPolicy:keyPolicy}”

Once having the key, it’s possible to use it with the argument –account-key

Enum blobs with account key

az storage blob list
–container-name
–account-name
–account-key “ZrF40pkVKvWPUr[…]v7LZw==”

Download a file using an account key

az storage blob download
–account-name
–account-key “ZrF40pkVKvWPUr[…]v7LZw==”
–container-name
–name
–file </path/to/local/file>

Upload a file using an account key

az storage blob upload
–account-name
–account-key “ZrF40pkVKvWPUr[…]v7LZw==”
–container-name
–file </path/to/local/file>

SAS

List access policies

az storage <container|queue|share|table> policy list
–account-name
–container-name

Generate SAS with all permissions using an access key

az storage <container|queue|share|table|blob> generate-sas
–permissions acdefilmrtwxy
–expiry 2024-12-31T23:59:00Z
–account-name
-n

Generate SAS with all permissions using via user delegation

az storage <container|queue|share|table|blob> generate-sas
–permissions acdefilmrtwxy
–expiry 2024-12-31T23:59:00Z
–account-name
–as-user –auth-mode login
-n

Generate account SAS

az storage account generate-sas
–expiry 2024-12-31T23:59:00Z
–account-name
–services qt
–resource-types sco
–permissions acdfilrtuwxy

Use the returned SAS key with the param –sas-token

e.g.

az storage blob show
–account-name
–container-name
–sas-token ‘se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D’
–name ‘asd.txt’

#Local-Users

List users

az storage account local-user list
–account-name
–resource-group

Get user

az storage account local-user show
–account-name
–resource-group
–name

List keys

az storage account local-user list
–account-name
–resource-group

</details>

{{#endtab }}

{{#tab name="Az PowerShell" }}

<details>
<summary>Az PowerShell enumerazione</summary>
```powershell
# Get storage accounts
Get-AzStorageAccount | fl
# Get rules to access the storage account
Get-AzStorageAccount | select -ExpandProperty NetworkRuleSet
# Get IPs
(Get-AzStorageAccount | select -ExpandProperty NetworkRuleSet).IPRules
# Get containers of a storage account
Get-AzStorageContainer -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).context
# Get blobs inside container
Get-AzStorageBlob -Container epbackup-planetary -Context (Get-AzStorageAccount -name <name> -ResourceGroupName <name>).context
# Get a blob from a container
Get-AzStorageBlobContent -Container <NAME> -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).context -Blob <blob_name> -Destination .\Desktop\filename.txt

# Create a Container Policy
New-AzStorageContainerStoredAccessPolicy `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container <container-name> `
-Policy <policy-name> `
-Permission racwdl `
-StartTime (Get-Date "2023-11-22T00:00Z") `
-ExpiryTime (Get-Date "2024-11-22T00:00Z")
#Get Container policy
Get-AzStorageContainerStoredAccessPolicy `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container "storageaccount1994container"

# Queue Management
Get-AzStorageQueue -Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context
(Get-AzStorageQueue -Name <NAME> -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).Context).QueueClient.PeekMessage().Value

#Blob Container
Get-AzStorageBlob -Container <container-name> -Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
Get-AzStorageBlobContent `
-Container <container-name> `
-Blob <blob-name> `
-Destination <local-path> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context

Set-AzStorageBlobContent `
-Container <container-name> `
-File <local-file-path> `
-Blob <blob-name> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context

# Shared Access Signatures (SAS)
Get-AzStorageContainerAcl `
-Container <container-name> `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context

New-AzStorageBlobSASToken `
-Context $ctx `
-Container <container-name> `
-Blob <blob-name> `
-Permission racwdl `
-ExpiryTime (Get-Date "2024-12-31T23:59:00Z")

Condivisioni file

Az - File Shares

Privilege Escalation

Az - Storage Privesc

Post Exploitation

Az - Blob Storage Post Exploitation

Persistence

Az - Storage Persistence

Riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks