Az - Storage Accounts & Blobs

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Основна інформація

Azure Storage Accounts — це фундаментальні сервіси в Microsoft Azure, які забезпечують масштабоване, захищене та високо доступне хмарне зберігання для різних типів даних, включаючи blobs (binary large objects), files, queues та tables. Вони слугують контейнерами, що групують ці різні сервіси зберігання під одним простором імен для зручного керування.

Основні параметри конфігурації:

  • Кожен обліковий запис сховища повинен мати унікальне ім’я в межах усього Azure.
  • Кожен обліковий запис розгортається в регіоні або в розширеній зоні Azure
  • Можна обрати premium версію облікового запису сховища для покращеної продуктивності
  • Можна вибрати серед 4 типів надмірності для захисту від відмов стійки, диска та дата-центру.

Параметри конфігурації безпеки:

  • Require secure transfer for REST API operations: Вимагати TLS у будь-якій комунікації зі сховищем
  • Allows enabling anonymous access on individual containers: Якщо ні — у майбутньому неможливо буде ввімкнути анонімний доступ
  • Enable storage account key access: Якщо ні — доступ за допомогою Shared Keys буде заборонено
  • Minimum TLS version
  • Permitted scope for copy operations: Дозволяти з будь-якого storage account, з будь-якого storage account того самого Entra tenant або з облікового запису зі private endpoints в тій же virtual network.

Blob Storage options:

  • Allow cross-tenant replication
  • Access tier: Hot (часто доступні дані), Cool та Cold (рідко доступні дані)

Параметри мережі:

  • Network access:
  • Дозволити з усіх мереж
  • Дозволити з вибраних virtual networks та IP-адрес
  • Вимкнути публічний доступ і використовувати приватний доступ
  • Private endpoints: Дозволяє приватне з’єднання до облікового запису сховища з virtual network

Параметри захисту даних:

  • Point-in-time restore for containers: Дозволяє відновити контейнери до попереднього стану
  • Потребує ввімкнених versioning, change feed та blob soft delete.
  • Enable soft delete for blobs: Вмикає період збереження в днях для видалених blobs (навіть перезаписаних)
  • Enable soft delete for containers: Вмикає період збереження в днях для видалених контейнерів
  • Enable soft delete for file shares: Вмикає період збереження в днях для видалених file shares
  • Enable versioning for blobs: Зберігати попередні версії ваших blobs
  • Enable blob change feed: Зберігати журнали створення, зміни та видалення blobs
  • Enable version-level immutability support: Дозволяє встановити політику зберігання на основі часу на рівні облікового запису, яка застосовуватиметься до всіх версій blob.
  • 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

Сервіс зберіганняКінцева точка
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 (disabled за замовчуванням), при створенні контейнера можливо:

  • Надати публічний доступ для читання blobs (потрібно знати ім’я).
  • Можливість перераховувати blobs контейнера та читати їх.
  • Зробити його повністю приватним

Статичний вебсайт ($web) exposure & leaked secrets

  • Static websites подаються з спеціального контейнера $web через регіонально-залежну кінцеву точку, наприклад https://<account>.z13.web.core.windows.net/.
  • Контейнер $web може повідомляти publicAccess: null через blob API, але файли все ще доступні через endpoint статичного сайту, тому розміщення конфігураційних/IaC артефактів там може 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 публічними.
  • Перевірити ризикові облікові записи щоб підтвердити прапорець та інші слабкі налаштування: az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'.
  • Перелічити експозицію на рівні контейнерів там, де прапорець увімкнено:
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>"

Підключення до сховища

Якщо ви знайдете будь-яке сховище, до якого можна підключитися, ви можете використати інструмент Microsoft Azure Storage Explorer для цього.

Доступ до сховища

RBAC

Можна використовувати принципали Entra ID з RBAC roles для доступу до облікових записів сховища, і це рекомендований спосіб.

Ключі доступу

Облікові записи сховища мають ключі доступу, які можна використати для доступу. Це надає повний доступ до облікового запису сховища.

Shared Keys & Lite Shared Keys

Можна generate Shared Keys, підписані ключами доступу, щоб авторизувати доступ до певних ресурсів через підписаний URL.

Note

Зверніть увагу, що частина CanonicalizedResource представляє ресурс сервісу сховища (URI). І якщо якась частина в URL закодована, вона також повинна бути закодована всередині CanonicalizedResource.

Note

Це за замовчуванням використовується az cli для автентифікації запитів. Щоб змусити його використовувати облікові дані принципала Entra ID, вкажіть параметр --auth-mode login.

  • Можна згенерувати shared key for blob, queue and 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;
  • Можна згенерувати shared key for table services, підписавши наступну інформацію:
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

Щоб використати key, це можна зробити в Authorization header, використовуючи такий синтаксис:

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) — це безпечні, обмежені в часі URL, які надають конкретні дозволи для доступу до ресурсів у обліковому записі Azure Storage без розкриття ключів доступу облікового запису. У той час як ключі доступу забезпечують повний адміністративний доступ до всіх ресурсів, SAS дозволяє здійснювати дрібнозерняний контроль, вказуючи дозволи (наприклад, read або write) та визначаючи час закінчення дії.

SAS Types

  • User delegation SAS: Створюється від імені Entra ID principal, який підписує SAS і делегує дозволи від користувача до SAS. Може використовуватися лише з blob and data lake storage (docs). Можна відкликати усі згенеровані user delegated SAS.
  • Навіть якщо можливо згенерувати delegation SAS з “більшими” дозволами, ніж має користувач, якщо principal не має цих дозволів, це не спрацює (немає privesc).
  • Service SAS: Підписується за допомогою одного з access keys облікового запису. Може використовуватися для надання доступу до конкретних ресурсів у межах однієї storage service. Якщо ключ оновлено, SAS перестане працювати.
  • Account SAS: Також підписується одним із access keys облікового запису. Надає доступ до ресурсів у різних службах облікового запису (Blob, Queue, Table, File) і може включати операції на рівні служби.

SAS URL, підписаний access key, виглядає так:

  • 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

SAS URL, підписаний як user delegation, виглядає так:

  • 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:

  • Параметр se вказує на дату закінчення дії SAS
  • Параметр sp вказує на дозволи SAS
  • sig — це підпис, що валідовує 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 Support for Azure Blob Storage

Azure Blob Storage тепер підтримує SSH File Transfer Protocol (SFTP), що дозволяє безпечну передачу файлів і керування безпосередньо в Blob Storage без потреби у власних рішеннях або сторонніх продуктах.

Key Features

  • Protocol Support: SFTP працює з Blob Storage accounts, сконфігурованими з hierarchical namespace (HNS). Це організовує blobs у директорії та піддиректорії для простішої навігації.
  • Security: SFTP використовує локальні ідентичності користувачів для автентифікації і не інтегрується з RBAC або ABAC. Кожен локальний користувач може автентифікуватися через:
  • Azure-generated passwords
  • Public-private SSH key pairs
  • Granular Permissions: Permissions such as Read, Write, Delete, and List can be assigned to local users for up to 100 containers.
  • Networking Considerations: SFTP connections are made through port 22. Azure supports network configurations like firewalls, private endpoints, or virtual networks to secure SFTP traffic.

Setup Requirements

  • Hierarchical Namespace: HNS must be enabled when creating the storage account.
  • Supported Encryption: Requires Microsoft Security Development Lifecycle (SDL)-approved cryptographic algorithms (e.g., 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

ДозвілСимволОпис
ReadrЧитати вміст файлу.
WritewЗавантажувати файли та створювати директорії.
ListlПереглядати вміст директорій.
DeletedВидаляти файли або директорії.
CreatecСтворювати файли або директорії.
Modify OwnershipoЗмінювати власника (користувача або групу).
Modify PermissionspЗмінювати ACL на файлах або директоріях.

Перерахування

az cli перерахування ```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 перерахування</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

Підвищення привілеїв

Az - Storage Privesc

Постексплуатація

Az - Blob Storage Post Exploitation

Утримання доступу

Az - Storage Persistence

Посилання

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks