Az - Storage-Konten & Blobs

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

Azure Storage Accounts sind grundlegende Dienste in Microsoft Azure, die skalierbaren, sicheren und hochverfügbaren Cloud-Speicher für verschiedene Datentypen bereitstellen, einschließlich Blobs (binary large objects), Files, Queues und Tables. Sie dienen als Container, die diese unterschiedlichen Storage-Services unter einem einzigen Namespace zur einfachen Verwaltung zusammenfassen.

Hauptkonfigurationsoptionen:

  • Jedes Storagekonto muss einen eindeutigen Namen in ganz Azure haben.
  • Jedes Storagekonto wird in einer Region oder in einer Azure extended zone bereitgestellt.
  • Es ist möglich, die Premium-Version des Storagekontos für bessere Performance auszuwählen.
  • Es ist möglich, zwischen 4 Arten von Redundanz zum Schutz vor Rack-, Laufwerks- und Rechenzentrums-Ausfällen zu wählen.

Sicherheitskonfigurationsoptionen:

  • Require secure transfer for REST API operations: TLS für jede Kommunikation mit dem Storage erforderlich.
  • Allows enabling anonymous access on individual containers: Falls deaktiviert, wird es in Zukunft nicht möglich sein, anonymen Zugriff zu aktivieren.
  • Enable storage account key access: Falls deaktiviert, wird der Zugriff mit Shared Keys verboten.
  • Minimum TLS version
  • Permitted scope for copy operations: Erlaubt von jedem Storage Account, von jedem Storage Account desselben Entra-Tenants oder von Storage Accounts mit privaten Endpoints im selben Virtual Network.

Blob Storage options:

  • Allow cross-tenant replication
  • Access tier: Hot (häufig verwendete Daten), Cool und Cold (selten abgerufene Daten)

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: Ermöglicht eine private Verbindung zum Storage Account aus einem Virtual Network.

Data protection options:

  • Point-in-time restore for containers: Ermöglicht das Wiederherstellen von Containern in einen früheren Zustand.
    • Erfordert, dass Versioning, Change Feed und Blob Soft Delete aktiviert sind.
  • Enable soft delete for blobs: Aktiviert eine Aufbewahrungsfrist in Tagen für gelöschte Blobs (auch überschrieben).
  • Enable soft delete for containers: Aktiviert eine Aufbewahrungsfrist in Tagen für gelöschte Container.
  • Enable soft delete for file shares: Aktiviert eine Aufbewahrungsfrist in Tagen für gelöschte File Shares.
  • Enable versioning for blobs: Bewahrt vorherige Versionen deiner Blobs.
  • Enable blob change feed: Führt Protokolle über Erstellungs-, Änderungs- und Löschvorgänge an Blobs.
  • Enable version-level immutability support: Ermöglicht das Setzen einer zeitbasierten Aufbewahrungsrichtlinie auf Kontoebene, die für alle Blob-Versionen gilt.
  • Version-level immutability support und point-in-time restore for containers können nicht gleichzeitig aktiviert werden.

Verschlüsselungskonfiguration:

  • Encryption type: Es ist möglich, Microsoft-managed keys (MMK) oder Customer-managed keys (CMK) zu verwenden.
  • Enable infrastructure encryption: Erlaubt eine doppelte Verschlüsselung der Daten “für mehr Sicherheit”.

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

Öffentliche Zugänglichkeit

If “Allow Blob public access” is enabled (disabled by default), when creating a container it’s possible to:

  • Give public access to read blobs (you need to know the name).
  • List container blobs and read them.
  • Make it fully private

Static website ($web) exposure & leaked secrets

  • Static websites werden vom speziellen $web-Container über einen regionsspezifischen Endpoint wie https://<account>.z13.web.core.windows.net/ bereitgestellt.
  • Der $web-Container kann via Blob-API publicAccess: null melden, aber Dateien sind weiterhin über den statischen Site-Endpoint erreichbar, sodass das Ablegen von Config/IaC-Artefakten dort can 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

Prüfung anonymen Blob-Zugriffs

  • Locate storage accounts die Daten exponieren können: az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'. Wenn allowBlobPublicAccess false ist, kannst du Container nicht öffentlich machen.
  • Riskante Accounts prüfen um das Flag und weitere schwache Einstellungen zu bestätigen: az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'.
  • Auf Container-Ebene exponierte Ressourcen aufzählen bei aktivem Flag:
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
  • "Blob": anonyme Lesezugriffe erlaubt nur wenn der Blob-Name bekannt ist (kein Auflisten).
  • "Container": anonyme Auflistung + Lesen jedes Blobs.
  • null: privat; Authentifizierung erforderlich.
  • Zugriff nachweisen ohne Anmeldeinformationen:
  • Wenn publicAccess Container ist, funktioniert anonyme Auflistung: curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list".
  • Für Blob und Container funktioniert der anonyme Blob-Download, wenn der Name bekannt ist:
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>"

Mit Storage verbinden

Wenn Sie ein storage finden, zu dem Sie eine Verbindung herstellen können, können Sie das Tool Microsoft Azure Storage Explorer dafür verwenden.

Zugriff auf Storage

RBAC

Es ist möglich, Entra ID-Principals mit RBAC roles zu verwenden, um auf Storage-Accounts zuzugreifen — dies ist der empfohlene Weg.

Access Keys

Die Storage-Accounts verfügen über Access Keys, die verwendet werden können, um darauf zuzugreifen. Dies gewährt vollen Zugriff auf das storage account.

Shared Keys & Lite Shared Keys

Es ist möglich, generate Shared Keys, die mit den Access Keys signiert sind, zu verwenden, um den Zugriff auf bestimmte Ressourcen über eine signierte URL zu autorisieren.

Note

Hinweis: Der CanonicalizedResource-Teil repräsentiert die Ressource des storage services (URI). Wenn ein Teil der URL kodiert ist, sollte er auch innerhalb des CanonicalizedResource kodiert sein.

Note

Dies wird standardmäßig vom az CLI benutzt, um Requests zu authentifizieren. Um stattdessen die Anmeldeinformationen eines Entra ID Principals zu verwenden, geben Sie den Parameter --auth-mode login an.

  • Es ist möglich, einen shared key für blob, queue und file services zu generieren, indem die folgenden Informationen signiert werden:
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;
  • Es ist möglich, einen Shared Key für Table Services zu generieren, indem man die folgenden Informationen signiert:
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
  • Es ist möglich, einen lite shared key for blob, queue and file services zu generieren, indem die folgenden Informationen signiert werden:
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
  • Es ist möglich, einen lite shared key for table services zu erzeugen, indem man die folgenden Informationen signiert:
StringToSign = Date + "\n"
CanonicalizedResource

Um den Schlüssel zu verwenden, kann er im Authorization-Header nach folgender Syntax angegeben werden:

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)

Shared Access Signatures (SAS) sind sichere, zeitlich begrenzte URLs, die spezifische Berechtigungen zum Zugriff auf Ressourcen in einem Azure Storage account gewähren, ohne die Zugriffsschlüssel des Kontos offenzulegen. Während Zugriffsschlüssel vollen administrativen Zugriff auf alle Ressourcen bieten, ermöglicht SAS eine granulare Steuerung durch Angabe von Berechtigungen (z. B. read oder write) und Festlegung einer Ablaufzeit.

SAS Types

  • User delegation SAS: Dieses wird von einem Entra ID principal erstellt, der die SAS signiert und die Berechtigungen vom Benutzer an die SAS delegiert. Es kann nur mit blob and data lake storage verwendet werden (docs). Es ist möglich, alle erzeugten user delegated SAS zu revoken.
  • Even if it’s possible to generate a delegation SAS with “more” permissions than the ones the user has. However, if the principal doesn’t have them, it won’t work (no privesc).
  • Service SAS: Diese wird mit einem der storage account access keys signiert. Sie kann verwendet werden, um Zugriff auf spezifische Ressourcen in einem einzelnen Storage service zu gewähren. Wenn der Key erneuert wird, funktioniert die SAS nicht mehr.
  • Account SAS: Ebenfalls mit einem der storage account access keys signiert. Sie gewährt Zugriff auf Ressourcen über Storage account services hinweg (Blob, Queue, Table, File) und kann service-level Operationen einschließen.

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

Note some 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

When generating a SAS it’s needed to indicate the permissions that it should be granting. Depending on the objet the SAS is being generated over different permissions might be included. For example:

  • (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 unterstützt jetzt das SSH File Transfer Protocol (SFTP) und ermöglicht sichere Dateiübertragung und -verwaltung direkt zu Blob Storage, ohne benutzerdefinierte Lösungen oder Drittanbieterprodukte zu benötigen.

Key Features

  • Protocol Support: SFTP funktioniert mit Blob Storage accounts, die mit hierarchical namespace (HNS) konfiguriert sind. Dadurch werden Blobs in Verzeichnisse und Unterverzeichnisse organisiert, was die Navigation erleichtert.
  • Security: SFTP verwendet lokale Benutzeridentitäten zur Authentifizierung und integriert sich nicht in RBAC oder ABAC. Jeder lokale Benutzer kann sich authentifizieren über:
  • Azure-generated passwords
  • Public-private SSH key pairs
  • Granular Permissions: Berechtigungen wie Lesen, Schreiben, Löschen und Auflisten können lokalen Benutzern für bis zu 100 container zugewiesen werden.
  • Networking Considerations: SFTP-Verbindungen erfolgen über Port 22. Azure unterstützt Netzwerk-Konfigurationen wie Firewalls, private endpoints oder virtual networks, um SFTP-Traffic abzusichern.

Setup Requirements

  • Hierarchical Namespace: HNS muss beim Erstellen des storage account aktiviert sein.
  • Supported Encryption: Erfordert von Microsoft SDL (Security Development Lifecycle) zugelassene kryptografische Algorithmen (z. B. rsa-sha2-256, ecdsa-sha2-nistp256).
  • SFTP Configuration:
  • Enable SFTP on the storage account.
  • Create local user identities with appropriate permissions.
  • Configure home directories for users to define their starting location within the container.

Permissions

PermissionSymbolDescription
ReadrDateiinhalt lesen.
WritewDateien hochladen und Verzeichnisse erstellen.
ListlInhalte von Verzeichnissen auflisten.
DeletedDateien oder Verzeichnisse löschen.
CreatecDateien oder Verzeichnisse erstellen.
Modify OwnershipoBesitzender Benutzer oder Gruppe ändern.
Modify PermissionspACLs auf Dateien oder Verzeichnissen ändern.

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

Dateifreigaben

Az - File Shares

Privilege Escalation

Az - Storage Privesc

Post Exploitation

Az - Blob Storage Post Exploitation

Persistence

Az - Storage Persistence

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks