Az - Storage Accounts & Blobs

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

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

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

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.

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:
# 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:
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:
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 daarvoor gebruik.

Toegang tot berging

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.

Gedeelde Sleutels & Lite Gedeelde Sleutels

Dit is moontlik om generate Shared Keys 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:
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:
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:
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:
StringToSign = Date + "\n"
CanonicalizedResource

Om die sleutel te gebruik, kan dit in die Authorization-header gedoen word volgens die volgende sintaks:

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). 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

PermissieSimboolBeskrywing
LeesrLees lĂȘerinhoud.
SkryfwLaai lĂȘers op en skep gidse.
LyslLys die inhoud van gidse.
VerwyderdVerwyder lĂȘers of gidse.
SkepcSkep lĂȘers of gidse.
Wysig eienaarskapoVerander die eienaar (gebruiker of groep).
Wysig toestemmingspVerander ACLs op lĂȘers of gidse.

Enumerasie

az cli enumerasie ```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 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")

LĂȘerdelinge

Az - File Shares

Privilege Escalation

Az - Storage Privesc

Post Exploitation

Az - Blob Storage Post Exploitation

Persistence

Az - Storage Persistence

Verwysings

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks