From e71a0fbba1930823eb8c2cdfd47dcb19efb0cd6b Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 18 Jan 2026 15:04:37 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor --- .../azure-security/az-services/az-storage.md | 208 ++++++++++-------- 1 file changed, 112 insertions(+), 96 deletions(-) diff --git a/src/pentesting-cloud/azure-security/az-services/az-storage.md b/src/pentesting-cloud/azure-security/az-services/az-storage.md index b45214cf2..2e33b8e39 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-storage.md +++ b/src/pentesting-cloud/azure-security/az-services/az-storage.md @@ -1,85 +1,100 @@ -# Az - Облікові записи сховища та Blobs +# Az - Storage Accounts & Blobs {{#include ../../../banners/hacktricks-training.md}} -## Основна інформація +## Basic Information -Azure Storage Accounts — це базові сервіси в Microsoft Azure, які забезпечують масштабоване, захищене та високо доступне хмарне **зберігання для різних типів даних**, включно з blobs (binary large objects), файли, черги та таблиці. Вони виступають контейнерами, що групують ці різні сервіси зберігання під єдиним простором імен для зручного управління. +Azure Storage Accounts — це базові сервіси в Microsoft Azure, які забезпечують масштабоване, безпечне та високо доступне хмарне **storage for various data types**, включаючи blobs (binary large objects), files, queues та tables. Вони слугують контейнерами, що групують ці різні служби зберігання під єдиним простором імен для зручного керування. -**Основні параметри конфігурації**: +**Main configuration options**: -- Кожен обліковий запис сховища повинен мати **унікальну назву в межах всього Azure**. -- Кожен обліковий запис розгортається в **регіоні** або в розширеній зоні Azure -- Можна вибрати **premium**-версію облікового запису сховища для кращої продуктивності -- Можна обрати серед **4 типів реплікації для захисту** від відмов стійки, диска та дата-центру. +- Кожен storage account має мати **uniq name across all Azure**. +- Кожен storage account деплоїться в певному **region** або в Azure extended zone. +- Можна обрати **premium** версію storage account для кращої продуктивності. +- Можна обрати серед **4 types of redundancy to protect** від rack, drive та datacenter **failures**. -**Параметри безпеки**: +**Security configuration options**: -- **Require secure transfer for REST API operations**: Вимагати TLS у будь-якому з'єднанні зі сховищем -- **Allows enabling anonymous access on individual containers**: Якщо вимкнено, у майбутньому неможливо буде увімкнути анонімний доступ -- **Enable storage account key access**: Якщо вимкнено, доступ за допомогою Shared Keys буде заборонено +- **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. +- **Permitted scope for copy operations**: Дозволити з будь-якого storage account, з будь-якого storage account того ж Entra tenant або зі storage account з private endpoints у тій же віртуальній мережі. -**Параметри Blob Storage**: +**Blob Storage options**: - **Allow cross-tenant replication** -- **Access tier**: Hot (часто використовувані дані), Cool і Cold (рідко використовувані дані) +- **Access tier**: Hot (часто використовувані дані), Cool та Cold (рідко використовувані дані) -**Параметри мережі**: +**Networking options**: - **Network access**: -- Дозволити з усіх мереж -- Дозволити з вибраних virtual networks та IP-адрес -- Вимкнути публічний доступ і використовувати приватний доступ -- **Private endpoints**: Дозволяє приватне з'єднання з обліковим записом сховища з virtual network +- 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 -**Параметри захисту даних**: +**Data protection options**: -- **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. -- Підтримка immutability на рівні версій і point-in-time restore для контейнерів не можна увімкнути одночасно. +- **Point-in-time restore for containers**: Дозволяє відновлювати контейнери до попереднього стану +- Вимагає увімкнених versioning, change feed та blob soft delete. +- **Enable soft delete for blobs**: Увімкнення періоду зберігання в днях для видалених blob-ів (навіть перезаписаних) +- **Enable soft delete for containers**: Увімкнення періоду зберігання в днях для видалених контейнерів +- **Enable soft delete for file shares**: Увімкнення періоду зберігання в днях для видалених file shares +- **Enable versioning for blobs**: Зберігання попередніх версій ваших blob-ів +- **Enable blob change feed**: Ведення журналу створення, модифікацій та видалень blob-ів +- **Enable version-level immutability support**: Дозволяє встановити політику збереження на рівні часу для всіх версій blob-ів на рівні аккаунта. +- Version-level immutability support і point-in-time restore for containers не можуть бути увімкнені одночасно. -**Параметри шифрування**: +**Encryption configuration options**: - **Encryption type**: Можна використовувати Microsoft-managed keys (MMK) або Customer-managed keys (CMK) -- **Enable infrastructure encryption**: Дозволяє подвійне шифрування даних "для підвищення безпеки" +- **Enable infrastructure encryption**: Дозволяє подвійно зашифрувати дані "for more security" -### Кінцеві точки сховища +### 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
+
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
-### Публічна доступність +### Public Exposure -Якщо "Allow Blob public access" **увімкнено** (за замовчуванням вимкнено), при створенні контейнера можливо: +Якщо "Allow Blob public access" **увімкнено** (за замовчуванням вимкнено), під час створення контейнера можна: -- Надати **публічний доступ для читання blobs** (потрібно знати ім'я). -- **Перелік blob'ів контейнера** та **читання** їх. -- Зробити його повністю **приватним** +- Надати **public access to read blobs** (потрібно знати ім'я). +- **List container blobs** та **read** їх. +- Зробити його повністю **private**
-#### Аудит анонімного доступу до blob +### Static website (`$web`) exposure & leaked secrets -- **Знайти storage accounts**, які можуть розкривати дані: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Якщо `allowBlobPublicAccess` є `false`, ви не зможете увімкнути публічний доступ для контейнерів. -- **Перевірити ризикові облікові записи**, щоб підтвердити прапорець та інші слабкі налаштування: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`. -- **Перелічити експозицію на рівні контейнерів** там, де прапорець увімкнено: +- **Static websites** are served from the special `$web` container over a region-specific endpoint such as `https://.z13.web.core.windows.net/`. +- The `$web` container may report `publicAccess: null` via the blob API, but files are still reachable through the static site endpoint, so dropping config/IaC artifacts there can leak secrets. +- Quick audit workflow: +```bash +# Identify storage accounts with static website hosting enabled +az storage blob service-properties show --account-name --auth-mode login +# Enumerate containers (including $web) and their public flags +az storage container list --account-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 --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 --auth-mode login +``` +### Аудит анонімного доступу до blob + +- **Знайдіть storage accounts**, які можуть відкривати дані: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Якщо `allowBlobPublicAccess` має значення `false`, ви не зможете зробити контейнери публічними. +- **Перевірте ризикові облікові записи**, щоб підтвердити прапорець і інші слабкі налаштування: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`. +- **Перелічіть публічний доступ на рівні контейнера** там, де прапорець увімкнено: ```bash az storage container list --account-name \ --query '[].{name:name, access:properties.publicAccess}' ``` -- `"Blob"`: дозволено анонімне читання **лише коли ім'я blob відоме** (без листингу). -- `"Container"`: анонімний **листинг + читання** кожного blob. +- `"Blob"`: дозволено анонімне читання **лише коли відоме ім'я blob** (без переліку). +- `"Container"`: анонімний **перелік + читання** кожного blob. - `null`: приватний; потрібна автентифікація. -- **Підтвердити доступ** без облікових даних: -- Якщо `publicAccess` встановлено в `Container`, анонімний листинг працює: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`. -- Для обох `Blob` та `Container`, анонімне завантаження blob працює, коли ім'я відоме: +- **Доведіть доступ** без облікових даних: +- Якщо `publicAccess` — `Container`, анонімне перелічення працює: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`. +- Для обох `Blob` і `Container`, анонімне завантаження blob працює, коли ім'я відоме: ```bash az storage blob download -c -n --account-name --file /dev/stdout # or via raw HTTP @@ -87,31 +102,31 @@ curl "https://.blob.core.windows.net//" ``` ### Підключення до сховища -Якщо ви знайдете будь-яке **сховище**, до якого можна підключитися, ви можете використовувати інструмент [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) для цього. +Якщо ви знайдете будь-яке **сховище**, до якого можна підключитися, ви можете скористатися інструментом [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) для цього. ## Доступ до сховища ### RBAC -Можна використовувати принципали Entra ID з **RBAC roles** для доступу до облікових записів сховища, і це рекомендований підхід. +Можна використовувати суб'єкти Entra ID з ролями **RBAC** для доступу до облікових записів сховища — це рекомендований спосіб. ### Ключі доступу -Облікові записи сховища мають ключі доступу, за допомогою яких можна отримати доступ. Це надає **повний доступ до облікового запису сховища.** +Облікові записи сховища мають ключі доступу, які можна використовувати для доступу до них. Це надає **повний доступ до облікового запису сховища.**
### **Shared Keys & Lite Shared Keys** -Можна [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) підписані ключами доступу для авторизації доступу до певних ресурсів через підписане URL. +It's possible to [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) signed with the access keys to authorize access to certain resources via a signed URL. > [!NOTE] > Зверніть увагу, що частина `CanonicalizedResource` представляє ресурс служби сховища (URI). І якщо будь-яка частина в URL закодована, вона також має бути закодована всередині `CanonicalizedResource`. > [!NOTE] -> За замовчуванням для автентифікації запитів **використовується `az` cli**. Щоб змусити його використовувати облікові дані принципала Entra ID, вкажіть параметр `--auth-mode login`. +> За замовчуванням для автентифікації запитів **використовується `az` cli**. Щоб змусити його використовувати облікові дані суб'єкта Entra ID, вкажіть параметр `--auth-mode login`. -- Можна згенерувати **shared key для служб blob, queue та file**, підписавши таку інформацію: +- Можна згенерувати **shared key for blob, queue and file services** шляхом підпису наступної інформації: ```bash StringToSign = VERB + "\n" + Content-Encoding + "\n" + @@ -136,7 +151,7 @@ Content-Type + "\n" + Date + "\n" + CanonicalizedResource; ``` -- Можна згенерувати **lite shared key for blob, queue and file services** підписавши наступну інформацію: +- Можна згенерувати **lite shared key for blob, queue and file services**, підписавши наступну інформацію: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + @@ -145,12 +160,12 @@ Date + "\n" + CanonicalizedHeaders + CanonicalizedResource; ``` -- Можна згенерувати **lite shared key for table services**, підписавши таку інформацію: +- Можна згенерувати **lite shared key for table services** підписавши наступну інформацію: ```bash StringToSign = Date + "\n" CanonicalizedResource ``` -Тоді, щоб використати ключ, його можна передати в заголовку Authorization за таким синтаксисом: +Тоді, щоб використати ключ, це можна зробити в заголовку Authorization, використовуючи синтаксис: ```bash Authorization="[SharedKey|SharedKeyLite] :" #e.g. @@ -162,78 +177,78 @@ x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08= Content-Length: 0 ``` -### **Підпис для спільного доступу** (SAS) +### **Shared Access Signature** (SAS) -Shared Access Signatures (SAS) — це безпечні, обмежені в часі URL, які надають конкретні дозволи на доступ до ресурсів в Azure Storage account без розкриття ключів доступу облікового запису. У той час як access keys дають повний адміністративний доступ до всіх ресурсів, SAS дозволяє тонко керувати доступом, вказуючи дозволи (наприклад read або write) та визначаючи час закінчення дії. +Shared Access Signatures (SAS) — це безпечні URL з обмеженим терміном дії, які **grant specific permissions to access resource**s в обліковому записі Azure Storage і дозволяють отримати доступ до ресурсів без розкриття ключів доступу облікового запису. У той час як access keys дають повний адміністративний доступ до всіх ресурсів, SAS дозволяє здійснювати тонке управління доступом, вказуючи дозволи (наприклад, read або write) і визначаючи час закінчення дії. #### SAS Types -- **User delegation SAS**: Створюється від імені **Entra ID principal**, який підписує SAS і делегує дозволи від користувача до SAS. Може використовуватись лише з **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Можна **revoke** всі згенеровані user delegated SAS. -- Навіть якщо можливо згенерувати delegation SAS з "більшими" дозволами, ніж має користувач, якщо принципал їх не має, це не спрацює (немає privesc). -- **Service SAS**: Підписується за допомогою одного з access keys облікового запису storage. Може надавати доступ до конкретних ресурсів в межах однієї storage service. Якщо ключ буде оновлено, SAS перестане працювати. -- **Account SAS**: Також підписується одним з access keys облікового запису storage. Надає доступ до ресурсів по всіх сервісах storage account (Blob, Queue, Table, File) і може включати операції на рівні сервісу. +- **User delegation SAS**: Створюється від імені **Entra ID principal**, який підписує SAS і делегує дозволи від користувача до SAS. Може використовуватися лише з **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Можна **revoke** всі згенеровані user delegated SAS. +- Навіть якщо можливо згенерувати delegation SAS з "більшими" дозволами, ніж має користувач, якщо у принципала їх немає — це не спрацює (no privesc). +- **Service SAS**: Підписується за допомогою одного з access keys облікового запису storage. Може давати доступ до конкретних ресурсів в межах одного сервісу storage. Якщо ключ буде оновлено, SAS перестане працювати. +- **Account SAS**: Теж підписується одним з access keys облікового запису. Надає доступ до ресурсів у межах сервісів облікового запису (Blob, Queue, Table, File) і може включати операції на рівні сервісу. -SAS URL, підписаний за допомогою **access key**, виглядає так: +A SAS URL signed by an **access key** looks like this: - `https://.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**, виглядає так: +A SAS URL signed as a **user delegation** looks like this: - `https://.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**: +Note some **http params**: -- Параметр **`se`** вказує **дату закінчення дії** SAS -- Параметр **`sp`** вказує **дозволи** SAS -- **`sig`** — це **підпис**, що валідовує SAS +- 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, можуть включатися різні дозволи. Наприклад: +При генерації 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 без необхідності кастомних рішень або сторонніх продуктів. +Azure Blob Storage тепер підтримує SSH File Transfer Protocol (SFTP), що дозволяє безпечно передавати файли і керувати ними безпосередньо в Blob Storage без потреби у кастомних рішеннях або продуктах сторонніх розробників. ### Key Features -- Protocol Support: SFTP працює з Blob Storage accounts, сконфігурованими з hierarchical namespace (HNS). Це організовує blobs у директорії та піддиректорії для зручнішої навігації. -- Security: SFTP використовує локальні user identities для аутентифікації і не інтегрується з RBAC або ABAC. Кожен локальний user може аутентифікуватись через: -- Azure-generated passwords -- Public-private SSH key pairs -- Granular Permissions: Дозволи такі як Read, Write, Delete та List можуть бути призначені локальним users для до 100 containers. -- Networking Considerations: SFTP-з'єднання здійснюються через порт 22. Azure підтримує мережеві конфігурації, як-от firewalls, private endpoints або virtual networks для захисту SFTP-трафіку. +- Protocol Support: SFTP працює з Blob Storage accounts, налаштованими з hierarchical namespace (HNS). Це організовує blobs у директорії та піддиректорії для зручнішої навігації. +- Security: SFTP використовує локальні користувацькі облікові записи для автентифікації і не інтегрується з RBAC або ABAC. Кожен локальний користувач може автентифікуватися за допомогою: + - Azure-generated passwords + - Public-private SSH key pairs +- Granular Permissions: Такі дозволи, як Read, Write, Delete і List, можна призначати локальним користувачам для максимум 100 контейнерів. +- Networking Considerations: SFTP-з'єднання відбуваються через порт 22. Azure підтримує мережеві конфігурації такі як firewalls, private endpoints або virtual networks для захисту трафіку SFTP. ### Setup Requirements -- Hierarchical Namespace: HNS має бути увімкнено при створенні storage account. -- Supported Encryption: Потребує криптографічних алгоритмів, схвалених Microsoft Security Development Lifecycle (SDL) (наприклад rsa-sha2-256, ecdsa-sha2-nistp256). +- Hierarchical Namespace: HNS має бути ввімкнено під час створення storage account. +- Supported Encryption: Потрібні криптографічні алгоритми, затверджені Microsoft SDL (наприклад, rsa-sha2-256, ecdsa-sha2-nistp256). - SFTP Configuration: -- Увімкніть SFTP на storage account. -- Створіть локальні user identities з відповідними дозволами. -- Налаштуйте home directories для user, щоб визначити їх початкове розташування в контейнері. + - 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 | Permission | Symbol | Description | | ---------------------- | ------ | ------------------------------------ | -| **Read** | `r` | Читання вмісту файлу. | -| **Write** | `w` | Завантаження файлів та створення директорій. | -| **List** | `l` | Перелік вмісту директорій. | -| **Delete** | `d` | Видалення файлів або директорій. | -| **Create** | `c` | Створення файлів або директорій. | -| **Modify Ownership** | `o` | Зміна власника або групи. | -| **Modify Permissions** | `p` | Зміна ACLs на файлах або директоріях. | +| **Read** | `r` | Читати вміст файлу. | +| **Write** | `w` | Завантажувати файли та створювати директорії. | +| **List** | `l` | Перелічувати вміст директорій. | +| **Delete** | `d` | Видаляти файли або директорії. | +| **Create** | `c` | Створювати файли або директорії. | +| **Modify Ownership** | `o` | Змінювати власника користувача або групи. | +| **Modify Permissions** | `p` | Змінювати ACL на файлах або директоріях. | -## Перерахування +## Enumeration {{#tabs }} {{#tab name="az cli" }}
-az cli enumeration +az cli перерахування ```bash # Get storage accounts az storage account list #Get the account name from here @@ -357,7 +372,7 @@ az storage account local-user list \ {{#tab name="Az PowerShell" }}
-Az PowerShell enumeration +Az PowerShell перерахування ```powershell # Get storage accounts Get-AzStorageAccount | fl @@ -420,25 +435,25 @@ New-AzStorageBlobSASToken ` {{#endtab }} {{#endtabs }} -### File Shares +### Файлові ресурси {{#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 @@ -449,6 +464,7 @@ az-file-shares.md - [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)