Az - Storage Accounts & Blobs

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Βασικές πληροφορίες

Azure Storage Accounts είναι θεμελιώδεις υπηρεσίες στο Microsoft Azure που παρέχουν κλιμακούμενη, ασφαλή και υψηλής διαθεσιμότητας cloud αποθήκευση για διάφορους τύπους δεδομένων, συμπεριλαμβανομένων των blobs (binary large objects), files, queues και tables. Λειτουργούν ως containers που ομαδοποιούν αυτές τις διαφορετικές υπηρεσίες αποθήκευσης κάτω από ένα μοναδικό namespace για εύκολη διαχείριση.

Κύριες επιλογές διαμόρφωσης:

  • Κάθε storage account πρέπει να έχει ένα μοναδικό όνομα σε όλο το Azure.
  • Κάθε storage account αναπτύσσεται σε μια περιοχή (region) ή σε μια επεκταμένη ζώνη Azure
  • Είναι δυνατή η επιλογή της premium έκδοσης του storage account για καλύτερες επιδόσεις
  • Είναι δυνατή η επιλογή ανάμεσα σε 4 τύπους redundancy για προστασία από αποτυχίες rack, drive και datacenter.

Επιλογές διαμόρφωσης ασφάλειας:

  • Require secure transfer for REST API operations: Απαιτεί TLS σε οποιαδήποτε επικοινωνία με το storage
  • Allows enabling anonymous access on individual containers: Αν δεν είναι ενεργό, δεν θα είναι δυνατό να ενεργοποιηθεί anonymous access στο μέλλον
  • Enable storage account key access: Αν δεν είναι ενεργό, η πρόσβαση με Shared Keys θα απαγορεύεται
  • Minimum TLS version
  • Permitted scope for copy operations: Να επιτρέπεται από οποιοδήποτε storage account, από οποιοδήποτε storage account μέσα στον ίδιο Entra tenant ή από storage account με private endpoints στο ίδιο virtual network.

Blob Storage options:

  • Allow cross-tenant replication
  • Access tier: Hot (συχνά προσπελάσιμα δεδομένα), Cool και Cold (σπάνια προσπελάσιμα δεδομένα)

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: Επιτρέπει ιδιωτική σύνδεση στο storage account από ένα virtual network

Επιλογές προστασίας δεδομένων:

  • Point-in-time restore for containers: Επιτρέπει την αποκατάσταση containers σε προηγούμενη κατάσταση
  • Απαιτεί την ενεργοποίηση versioning, change feed και blob soft delete.
  • Enable soft delete for blobs: Ενεργοποιεί περίοδο διατήρησης σε ημέρες για διαγεγραμμένα blobs (ακόμα και αν έχουν overwritten)
  • Enable soft delete for containers: Ενεργοποιεί περίοδο διατήρησης σε ημέρες για διαγραμμένα containers
  • Enable soft delete for file shares: Ενεργοποιεί περίοδο διατήρησης σε ημέρες για διαγραμμένα file shares
  • Enable versioning for blobs: Διατηρεί προηγούμενες εκδόσεις των blobs
  • Enable blob change feed: Διατηρεί logs για δημιουργία, τροποποίηση και διαγραφή αλλαγών σε blobs
  • Enable version-level immutability support: Σας επιτρέπει να ορίσετε πολιτική διατήρησης με βάση τον χρόνο σε επίπεδο account που θα εφαρμόζεται σε όλες τις εκδόσεις των blobs.
  • Η version-level immutability support και το point-in-time restore for containers δεν μπορούν να ενεργοποιηθούν ταυτόχρονα.

Επιλογές κρυπτογράφησης:

  • Encryption type: Είναι δυνατό να χρησιμοποιηθούν Microsoft-managed keys (MMK) ή Customer-managed keys (CMK)
  • Enable infrastructure encryption: Επιτρέπει τη διπλή κρυπτογράφηση των δεδομένων “για περισσότερη ασφάλεια”

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

Δημόσια έκθεση

Αν το “Allow Blob public access” είναι enabled (απενεργοποιημένο από προεπιλογή), κατά τη δημιουργία ενός container είναι δυνατό να:

  • Δώσετε δημόσια πρόσβαση για ανάγνωση blobs (πρέπει να γνωρίζετε το όνομα).
  • List container blobs και read αυτά.
  • Το κάνετε πλήρως private

Static website ($web) exposure & leaked secrets

  • Static websites σερβίρονται από το ειδικό container $web μέσω ενός region-specific endpoint όπως https://<account>.z13.web.core.windows.net/.
  • Το container $web μπορεί να αναφέρει publicAccess: null μέσω του blob API, αλλά τα αρχεία εξακολουθούν να είναι προσβάσιμα μέσω του static site endpoint, οπότε τοποθετώντας config/IaC artifacts εκεί μπορεί να leak secrets.
  • Γρήγορη ροή ελέγχου:
# 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

Έλεγχος ανώνυμης έκθεσης blob

  • Εντοπισμός storage accounts που μπορούν να εκθέσουν δεδομένα: az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'. Αν allowBlobPublicAccess είναι false δεν μπορείτε να κάνετε τα containers δημόσια.
  • Επιθεώρηση επικίνδυνων storage accounts για επιβεβαίωση του flag και άλλων αδύναμων ρυθμίσεων: az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'.
  • Απαρίθμηση έκθεσης σε επίπεδο container όπου το flag είναι ενεργοποιημένο:
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
  • "Blob": επιτρέπονται ανώνυμες αναγνώσεις μόνο όταν είναι γνωστό το όνομα του blob (χωρίς δυνατότητα λίστας).
  • "Container": ανώνυμη λίστα + ανάγνωση όλων των blob.
  • null: ιδιωτικό· απαιτείται έλεγχος ταυτότητας.
  • Αποδείξτε πρόσβαση χωρίς διαπιστευτήρια:
  • Αν publicAccess είναι Container, η ανώνυμη λίστα λειτουργεί: curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list".
  • Για τόσο το Blob όσο και το Container, η ανώνυμη λήψη blob λειτουργεί όταν το όνομα είναι γνωστό:
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>"

Σύνδεση με Storage

Αν βρείτε κάποιο storage στο οποίο μπορείτε να συνδεθείτε, μπορείτε να χρησιμοποιήσετε το εργαλείο Microsoft Azure Storage Explorer για αυτό.

Πρόσβαση στο Storage

RBAC

Είναι δυνατό να χρησιμοποιηθούν principals του Entra ID με RBAC roles για πρόσβαση σε storage accounts και είναι ο συνιστώμενος τρόπος.

Access Keys

Τα storage accounts έχουν access keys που μπορούν να χρησιμοποιηθούν για πρόσβαση. Αυτό παρέχει πλήρη πρόσβαση στο storage account.

Shared Keys & Lite Shared Keys

Είναι δυνατό να generate Shared Keys υπογεγραμμένα με τα access keys για να εξουσιοδοτείται η πρόσβαση σε συγκεκριμένους πόρους μέσω ενός signed URL.

Note

Σημειώστε ότι το τμήμα CanonicalizedResource αντιπροσωπεύει τον πόρο των storage services (URI). Και αν οποιοδήποτε τμήμα στο URL είναι encoded, θα πρέπει επίσης να είναι encoded μέσα στο CanonicalizedResource.

Note

Αυτό χρησιμοποιείται από προεπιλογή από το az cli για την πιστοποίηση των requests. Για να το κάνετε να χρησιμοποιήσει τα credentials του Entra ID principal, υποδείξτε την παράμετρο --auth-mode login.

  • Είναι δυνατό να παραχθεί ένα shared key για blob, queue και file services υπογράφοντας τις παρακάτω πληροφορίες:
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;
  • Είναι δυνατό να δημιουργηθεί ένα κοινό κλειδί για υπηρεσίες πίνακα υπογράφοντας τις παρακάτω πληροφορίες:
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
  • Είναι δυνατό να δημιουργηθεί ένα lite shared key for blob, queue and file services υπογράφοντας τις ακόλουθες πληροφορίες:
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
  • Είναι δυνατόν να δημιουργηθεί ένα lite shared key for table services υπογράφοντας τις ακόλουθες πληροφορίες:
StringToSign = Date + "\n"
CanonicalizedResource

Στη συνέχεια, για να χρησιμοποιήσετε το κλειδί, αυτό μπορεί να γίνει στην κεφαλίδα Authorization ακολουθώντας την εξής σύνταξη:

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

Κοινή Υπογραφή Πρόσβασης (SAS)

Shared Access Signatures (SAS) είναι ασφαλείς, χρονικά περιορισμένα URLs που παρέχουν συγκεκριμένα δικαιώματα πρόσβασης σε πόρους σε έναν Azure Storage λογαριασμό χωρίς να αποκαλύπτουν τα κλειδιά πρόσβασης του λογαριασμού. Ενώ τα κλειδιά πρόσβασης παρέχουν πλήρη διοικητική πρόσβαση σε όλους τους πόρους, το SAS επιτρέπει λεπτομερή έλεγχο καθορίζοντας δικαιώματα (όπως ανάγνωση ή εγγραφή) και ορίζοντας χρόνο λήξης.

SAS Types

  • User delegation SAS: Δημιουργείται από έναν Entra ID principal ο οποίος θα υπογράψει το SAS και θα εκχωρήσει τα δικαιώματα από τον χρήστη στο SAS. Μπορεί να χρησιμοποιηθεί μόνο με blob and data lake storage (docs). Είναι δυνατό να ανακληθούν όλα τα δημιουργημένα user delegated SAS.
  • Είναι δυνατό να δημιουργηθεί ένα delegation SAS με “περισσότερα” δικαιώματα από αυτά που έχει ο χρήστης. Ωστόσο, αν ο principal δεν διαθέτει αυτά τα δικαιώματα, δεν θα λειτουργήσει (no privesc).
  • Service SAS: Υπογράφεται χρησιμοποιώντας ένα από τα κλειδιά πρόσβασης του storage account. Μπορεί να χρησιμοποιηθεί για να δώσει πρόσβαση σε συγκεκριμένους πόρους σε μία μόνο υπηρεσία αποθήκευσης. Εάν το κλειδί ανανεωθεί, το SAS θα σταματήσει να λειτουργεί.
  • Account SAS: Επίσης υπογράφεται με ένα από τα κλειδιά πρόσβασης του storage account. Παρέχει πρόσβαση σε πόρους σε υπηρεσίες ενός storage account (Blob, Queue, Table, File) και μπορεί να περιλαμβάνει λειτουργίες σε επίπεδο υπηρεσίας.

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

Σημειώστε μερικά http params:

  • The se param indicates the expiration date of the SAS
  • The sp param indicates the permissions of the SAS
  • The sig is the signature validating the SAS

SAS permissions

Κατά τη δημιουργία ενός SAS πρέπει να δηλωθούν τα δικαιώματα που θα παραχωρεί. Ανάλογα με το αντικείμενο πάνω στο οποίο δημιουργείται το SAS, μπορεί να περιλαμβάνονται διαφορετικά δικαιώματα. Για παράδειγμα:

  • (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 για Azure Blob Storage

Το Azure Blob Storage πλέον υποστηρίζει το SSH File Transfer Protocol (SFTP), επιτρέποντας ασφαλή μεταφορά και διαχείριση αρχείων απευθείας στο Blob Storage χωρίς να απαιτούνται προσαρμοσμένες λύσεις ή προϊόντα τρίτων.

Βασικά Χαρακτηριστικά

  • Protocol Support: Το SFTP λειτουργεί με λογαριασμούς Blob Storage που έχουν ενεργοποιημένο hierarchical namespace (HNS). Αυτό οργανώνει τα blobs σε φακέλους και υποφακέλους για ευκολότερη πλοήγηση.
  • Security: Το SFTP χρησιμοποιεί τοπικές ταυτότητες χρηστών για αυθεντικοποίηση και δεν ενσωματώνεται με RBAC ή ABAC. Κάθε τοπικός χρήστης μπορεί να αυθεντικοποιηθεί μέσω:
  • Azure-generated passwords
  • Public-private SSH key pairs
  • Granular Permissions: Δικαιώματα όπως Read, Write, Delete και List μπορούν να ανατεθούν σε τοπικούς χρήστες για έως και 100 containers.
  • Networking Considerations: Οι SFTP συνδέσεις πραγματοποιούνται μέσω της θύρας 22. Το Azure υποστηρίζει ρυθμίσεις δικτύου όπως firewalls, private endpoints ή virtual networks για την ασφάλεια της SFTP κίνησης.

Απαιτήσεις Ρύθμισης

  • Hierarchical Namespace: Το HNS πρέπει να είναι ενεργοποιημένο κατά τη δημιουργία του storage account.
  • Supported Encryption: Απαιτεί κρυπτογραφικούς αλγόριθμους εγκεκριμένους από το Microsoft Security Development Lifecycle (SDL) (π.χ., rsa-sha2-256, ecdsa-sha2-nistp256).
  • SFTP Configuration:
  • Ενεργοποίηση SFTP στο storage account.
  • Δημιουργία τοπικών ταυτοτήτων χρηστών με κατάλληλα δικαιώματα.
  • Διαμόρφωση home directories για τους χρήστες ώστε να οριστεί η αρχική τους θέση εντός του container.

Δικαιώματα

ΔικαίωμαΣύμβολοΠεριγραφή
ΑνάγνωσηrΑνάγνωση περιεχομένου αρχείου.
ΕγγραφήwΜεταφόρτωση αρχείων και δημιουργία καταλόγων.
ΛίσταlΛίστα περιεχομένων καταλόγων.
ΔιαγραφήdΔιαγραφή αρχείων ή καταλόγων.
ΔημιουργίαcΔημιουργία αρχείων ή καταλόγων.
Αλλαγή ιδιοκτησίαςoΑλλαγή του χρήστη ή της ομάδας ιδιοκτησίας.
Αλλαγή δικαιωμάτωνpΑλλαγή ACLs σε αρχεία ή καταλόγους.

Enumeration

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 enumeration</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")

Κοινόχρηστα Αρχεία

Az - File Shares

Privilege Escalation

Az - Storage Privesc

Post Exploitation

Az - Blob Storage Post Exploitation

Persistence

Az - Storage Persistence

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks