# Az - Storage Accounts & Blobs

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

## Basiese Inligting

Azure Storage Accounts is fundamentele dienste in Microsoft Azure wat skaalbare, veilige en hoog-beskikbare wolk **storage vir verskeie datatipes** verskaf, insluitend blobs (binary large objects), files, queues, and tables. Hulle dien as houers wat hierdie verskillende storage-dienste saam onder 'n enkele namespace groepeer vir maklike bestuur.

**Hoof konfigurasie-opsies**:

- Elke storage account moet 'n **unieke naam oor alle Azure** hê.
- Elke storage account word in 'n **region** of in 'n Azure extended zone ontplooi.
- Dit is moontlik om die **premium** weergawe van die storage account te kies vir beter prestasie.
- Dit is moontlik om te kies tussen **4 tipes redundansie om te beskerm** teen rak-, skyf- en datacentrum-**foute**.

**Sekuriteitskonfigurasie-opsies**:

- **Require secure transfer for REST API operations**: Vereis TLS in enige kommunikasie met die storage.
- **Allows enabling anonymous access on individual containers**: As dit nie aangeskakel is nie, sal dit in die toekoms nie moontlik wees om anonieme toegang aan te skakel nie.
- **Enable storage account key access**: As dit nie aangeskakel is nie, sal toegang met Shared Keys verbied wees.
- **Minimum TLS version**
- **Permitted scope for copy operations**: Toelaat vanaf enige storage account, vanaf enige storage account in dieselfde Entra tenant of vanaf storage accounts met private endpoints in dieselfde virtual network.

**Blob Storage options**:

- **Allow cross-tenant replication**
- **Access tier**: Hot (gereeld toegang tot data), Cool en Cold (selde geraadpleegde data)

**Networking options**:

- **Network access**:
  - Allow from all networks
  - Allow from selected virtual networks and IP addresses
  - Disable public access and use private access
- **Private endpoints**: Dit laat 'n private verbinding toe na die storage account vanaf 'n virtual network.

**Data protection options**:

- **Point-in-time restore for containers**: Maak dit moontlik om containers na 'n vroeër toestand te herstel.
- Dit vereis dat versioning, change feed, en blob soft delete aangeskakel is.
- **Enable soft delete for blobs**: Dit stel 'n retensieperiode in dae vas vir verwyderde blobs (selfs oorskryfde).
- **Enable soft delete for containers**: Dit stel 'n retensieperiode in dae vas vir verwyderde containers.
- **Enable soft delete for file shares**: Dit stel 'n retensieperiode in dae vas vir verwyderde file shares.
- **Enable versioning for blobs**: Handhaaf vorige weergawes van jou blobs.
- **Enable blob change feed**: Hou logs van skep-, wysiging- en verwyderingsveranderinge aan blobs by.
- **Enable version-level immutability support**: Laat jou toe om 'n tydgebaseerde retensiebeleid op rekeningvlak te stel wat op alle blob-weergawes van toepassing sal wees.
- Version-level immutability support en point-in-time restore for containers kan nie gelyktydig aangeskakel word nie.

**Encryption configuration options**:

- **Encryption type**: Dit is moontlik om Microsoft-managed keys (MMK) of Customer-managed keys (CMK) te gebruik.
- **Enable infrastructure encryption**: Laat toe om die data dubbel te enkodeer "vir meer sekuriteit".

### 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>

### Publieke Blootstelling

As "Allow Blob public access" **enabled** is (standaard disabled), is dit moontlik wanneer 'n container geskep word om:

- Gee **public access to read blobs** (jy moet die naam ken).
- **List container blobs** en **read** dit.
- Maak dit volledig **private**.

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>

### Static website (`$web`) blootstelling & leaked secrets

- **Static websites** word bedien vanaf die spesiale `$web` container oor 'n region-spesifieke endpoint soos `https://<account>.z13.web.core.windows.net/`.
- Die `$web` container kan `publicAccess: null` rapporteer via die blob API, maar lêers is steeds deur die static site endpoint bereikbaar, so die plaas van config/IaC artifacts daar kan leak secrets.
- Quick audit workflow:
```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
```
### Oudit van anonieme blob-blootstelling

- **Lokaliseer storage accounts** wat data kan blootstel: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. As `allowBlobPublicAccess` op `false` gestel is, kan jy nie containers publiek maak nie.
- **Kontroleer riskante accounts** om die vlag en ander swak instellings te bevestig: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Enumereer container-vlak blootstelling** waar die vlag geaktiveer is:
```bash
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
```
- `"Blob"`: anonieme lees toegelaat **slegs wanneer die blob-naam bekend is** (geen listing).
- `"Container"`: anonieme **list + read** van elke blob.
- `null`: privaat; authentication required.
- **Bewys toegang** sonder credentials:
- As `publicAccess` op `Container` gestel is, werk anonieme listing: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- Vir beide `Blob` en `Container` werk anonieme blob-aflaai wanneer die naam bekend is:
```bash
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>"
```
### Koppel aan berging

As jy enige **berging** vind waarop jy kan koppel, kan jy die hulpmiddel [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) daarvoor gebruik.

## Toegang tot berging <a href="#about-blob-storage" id="about-blob-storage"></a>

### RBAC

Dit is moontlik om Entra ID principals met **RBAC roles** te gebruik om toegang tot bergingsrekeninge te kry, en dit is die aanbevole manier.

### Toegangsleutels

Bergingsrekeninge het toegangssleutels wat gebruik kan word om toegang daartoe te kry. Dit bied **volledige toegang tot die bergingsrekening.**

<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>

### **Gedeelde Sleutels & Lite Gedeelde Sleutels**

Dit is moontlik om [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) wat met die toegangsleutels geteken is, te gebruik om toegang tot sekere hulpbronne via 'n ondertekende URL te magtig.

> [!NOTE]
> Let daarop dat die `CanonicalizedResource`-gedeelte die storage-dienshulpbron (URI) verteenwoordig. En as enige deel van die URL gekodeer is, moet dit ook binne die `CanonicalizedResource` gekodeer wees.

> [!NOTE]
> Hierdie word **standaard deur die `az` cli gebruik** om versoeke te verifieer. Om dit die Entra ID principal-geloofsbriewe te laat gebruik, gee die parameter `--auth-mode login` aan.

- Dit is moontlik om 'n **shared key for blob, queue and file services** te genereer deur die volgende inligting te teken:
```bash
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;
```
- Dit is moontlik om 'n **shared key for table services** te genereer deur die volgende inligting te onderteken:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
```
- Dit is moontlik om 'n **lite shared key for blob, queue and file services** te genereer deur die volgende inligting te onderteken:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- Dit is moontlik om 'n **lite shared key for table services** te genereer deur die volgende inligting te onderteken:
```bash
StringToSign = Date + "\n"
CanonicalizedResource
```
Om die sleutel te gebruik, kan dit in die Authorization-header gedoen word volgens die volgende sintaks:
```bash
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
```
### **Gedeelde Toegangshandtekening** (SAS)

Gedeelde Toegangshandtekeninge (SAS) is veilige, tydelike URL'e wat **spesifieke toestemmings gee om toegang tot hulpbronne** in 'n Azure Storage-rekening te kry sonder om die rekenings toegangssleutels bloot te stel. Terwyl toegangssleutels volle administratiewe toegang tot alle hulpbronne bied, laat SAS meer gedetailleerde beheer toe deur toestemmings (bv. lees of skryf) te spesifiseer en 'n vervaltyd te definieer.

#### SAS Types

- **User delegation SAS**: Dit word geskep vanaf 'n **Entra ID principal** wat die SAS sal onderteken en die toestemmings van die gebruiker na die SAS sal delegeer. Dit kan slegs gebruik word met **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Dit is moontlik om alle gegenereerde user delegated SAS te **herroep**.
- Dit is selfs moontlik om 'n delegation SAS te genereer met "meer" permissies as wat die gebruiker het. As die principal dit egter nie het nie, sal dit nie werk nie (geen privesc).
- **Service SAS**: Dit word onderteken met een van die storage account **access keys**. Dit kan gebruik word om toegang tot spesifieke hulpbronne in 'n enkele storage service te verleen. As die sleutel hernu word, sal die SAS ophou werk.
- **Account SAS**: Dit word ook onderteken met een van die storage account **access keys**. Dit verleen toegang tot hulpbronne oor verskeie storage account-dienste (Blob, Queue, Table, File) en kan service-level operasies insluit.

A SAS URL signed by an **access key** looks like this:

- `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`

A SAS URL signed as a **user delegation** looks like this:

- `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`

Let op sommige **http params**:

- Die **`se`** param dui die **vervaldatum** van die SAS aan
- Die **`sp`** param dui die **toestemmings** van die SAS aan
- Die **`sig`** is die **handtekening** wat die SAS valideer

#### SAS permissions

Wanneer 'n SAS gegenereer word, moet die toestemmings wat dit behoort te gee aangedui word. Afhangend van die objek waaroor die SAS gegenereer word, kan verskillende permissies ingesluit wees. Byvoorbeeld:

- (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 ondersteun nou die SSH File Transfer Protocol (SFTP), wat veilige lêeroorplasing en bestuur direk na Blob Storage moontlik maak sonder dat custom solutions of derdeparty-produkte nodig is.

### Belangrike kenmerke

- Protokolondersteuning: SFTP werk met Blob Storage-rekeninge wat met hierarchical namespace (HNS) gekonfigureer is. Dit organiseer blobs in gidse en subgidse vir makliker navigasie.
- Sekuriteit: SFTP gebruik plaaslike gebruikersidentiteite vir verifikasie en integreer nie met RBAC of ABAC nie. Elke plaaslike gebruiker kan verifieer via:
  - Azure-gegenereerde wagwoorde
  - Openbare-private SSH-sleutelpare
- Gedetailleerde toestemmings: Toestemmings soos Lees, Skryf, Verwyder en Lys kan aan plaaslike gebruikers toegeken word vir tot 100 containers.
- Netwerkoorwegings: SFTP-verbindinge word deur poort 22 gemaak. Azure ondersteun netwerkkonfigurasies soos firewalls, private endpoints, of virtual networks om SFTP-verkeer te beveilig.

### Opstellingsvereistes

- Hierarchical Namespace: HNS moet geaktiveer word wanneer die storage account geskep word.
- Ondersteunde enkripsie: Vereis Microsoft Security Development Lifecycle (SDL)-goedgekeurde kriptografiese algoritmes (bv. rsa-sha2-256, ecdsa-sha2-nistp256).
- SFTP-konfigurasie:
  - Skakel SFTP op die storage account in.
  - Skep plaaslike gebruikersidentiteite met toepaslike toestemmings.
  - Konfigureer huisgidse vir gebruikers om hul beginligging binne die container te bepaal.

### Permissions

| Permissie              | Simbool | Beskrywing                             |
| ---------------------- | ------ | -------------------------------------- |
| **Lees**               | `r`    | Lees lêerinhoud.                       |
| **Skryf**              | `w`    | Laai lêers op en skep gidse.           |
| **Lys**                | `l`    | Lys die inhoud van gidse.              |
| **Verwyder**           | `d`    | Verwyder lêers of gidse.               |
| **Skep**               | `c`    | Skep lêers of gidse.                   |
| **Wysig eienaarskap**  | `o`    | Verander die eienaar (gebruiker of groep). |
| **Wysig toestemmings** | `p`    | Verander ACLs op lêers of gidse.       |

## Enumerasie

{{#tabs }}
{{#tab name="az cli" }}

<details>
<summary>az cli enumerasie</summary>
```bash
# Get storage accounts
az storage account list #Get the account name from here

# BLOB STORAGE
## List containers
az storage container list --account-name <name>
## Check if public access is allowed
az storage container show-permission \
--account-name <acc-name> \
-n <container-name>
## Make a container public
az storage container set-permission \
--public-access container \
--account-name <acc-name> \
-n <container-name>
## List blobs in a container
az storage blob list \
--container-name <container name> \
--account-name <account name>
## Download blob
az storage blob download \
--account-name <account name> \
--container-name <container name> \
--name <blob 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 <name>
az storage message peek --account-name <name> --queue-name <queue-name>

# ACCESS KEYS
az storage account keys list --account-name <name>
## Check key policies (expiration time?)
az storage account show -n <name> --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 <container name> \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw=="
## Download a file using an account key
az storage blob download \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Upload a file using an account key
az storage blob upload \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--file </path/to/local/file>

# SAS
## List access policies
az storage <container|queue|share|table> policy list \
--account-name <acc name> \
--container-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 <acc-name> \
-n <container-name>

## 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 <acc-name> \
--as-user --auth-mode login \
-n <container-name>

## Generate account SAS
az storage account generate-sas \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-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 <account name> \
--container-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 <storage-account-name> \
--resource-group <resource-group-name>
## Get user
az storage account local-user show \
--account-name <storage-account-name> \
--resource-group <resource-group-name> \
--name <local-user-name>

## List keys
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>
```
</details>

{{#endtab }}

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

<details>
<summary>Az PowerShell enumerasie</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")
```
</details>

{{#endtab }}
{{#endtabs }}

### Lêerdelinge

{{#ref}}
az-file-shares.md
{{#endref}}

## Privilege Escalation

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

## Post Exploitation

{{#ref}}
../az-post-exploitation/az-blob-storage-post-exploitation.md
{{#endref}}

## Persistence

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

## Verwysings

- [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)
- [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}}
