mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-29 07:00:29 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor
This commit is contained in:
@@ -4,27 +4,27 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Azure Storage Accounts є фундаментальними сервісами в Microsoft Azure, які надають масштабоване, безпечне та високодоступне cloud **storage для різних типів даних**, включно з blobs (binary large objects), files, queues і tables. Вони слугують контейнерами, які об’єднують ці різні storage-сервіси під одним namespace для зручного керування.
|
||||
Azure Storage Accounts є фундаментальними сервісами в Microsoft Azure, що надають масштабоване, безпечне та високо доступне cloud **storage for various data types**, including blobs (binary large objects), files, queues, and tables. Вони слугують контейнерами, які об’єднують ці різні storage services під одним namespace для зручного керування.
|
||||
|
||||
**Main configuration options**:
|
||||
|
||||
- Кожен storage account має мати **uniq name across all Azure**.
|
||||
- Кожен storage account розгортається в **region** або в Azure extended zone
|
||||
- Можна вибрати **premium** версію storage account для кращої продуктивності
|
||||
- Можна вибрати серед **4 типів redundancy to protect** against rack, drive and datacenter **failures**.
|
||||
- Every storage account must have a **uniq name across all Azure**.
|
||||
- Every storage account is deployed in a **region** or in an Azure extended zone
|
||||
- It's possible to select the **premium** version of the storage account for better performance
|
||||
- It's possible to select among **4 types of redundancy to protect** against rack, drive and datacenter **failures**.
|
||||
|
||||
**Security configuration options**:
|
||||
|
||||
- **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 буде заборонено
|
||||
- **Require secure transfer for REST API operations**: Require TLS in any communication with the storage
|
||||
- **Allows enabling anonymous access on individual containers**: If not, it won't be possible to enable anonymous access in the future
|
||||
- **Enable storage account key access**: If not, access with Shared Keys will be forbidden
|
||||
- **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**: Allow from any storage account, from any storage account from the same Entra tenant or from storage account with private endpoints in the same virtual network.
|
||||
|
||||
**Blob Storage options**:
|
||||
|
||||
- **Allow cross-tenant replication**
|
||||
- **Access tier**: Hot (дані, до яких часто звертаються), Cool і Cold (дані, до яких рідко звертаються)
|
||||
- **Access tier**: Hot (frequently access data), Cool and Cold (rarely accessed data)
|
||||
|
||||
**Networking options**:
|
||||
|
||||
@@ -32,24 +32,24 @@ Azure Storage Accounts є фундаментальними сервісами в
|
||||
- Allow from all networks
|
||||
- Allow from selected virtual networks and IP addresses
|
||||
- Disable public access and use private access
|
||||
- **Private endpoints**: Це дозволяє private connection до storage account з virtual network
|
||||
- **Private endpoints**: It allows a private connection to the storage account from a virtual network
|
||||
|
||||
**Data protection options**:
|
||||
|
||||
- **Point-in-time restore for containers**: Дозволяє відновлювати containers до попереднього стану
|
||||
- Потрібно, щоб були увімкнені versioning, change feed і blob soft delete.
|
||||
- **Enable soft delete for blobs**: Увімкнення retention period у днях для видалених blobs (навіть overwritten)
|
||||
- **Enable soft delete for containers**: Увімкнення retention period у днях для видалених containers
|
||||
- **Enable soft delete for file shares**: Увімкнення retention period у днях для видалених file shared
|
||||
- **Enable versioning for blobs**: Зберігати попередні versions ваших blobs
|
||||
- **Enable blob change feed**: Зберігати logs про create, modification і delete changes для blobs
|
||||
- **Enable version-level immutability support**: Дозволяє встановити time-based retention policy на рівні account, яка застосовуватиметься до всіх blob versions.
|
||||
- Version-level immutability support і point-in-time restore for containers не можна вмикати одночасно.
|
||||
- **Point-in-time restore for containers**: Allows to restore containers to an earlier state
|
||||
- It requires versioning, change feed, and blob soft delete to be enabled.
|
||||
- **Enable soft delete for blobs**: It enables a retention period in days for deleted blobs (even overwritten)
|
||||
- **Enable soft delete for containers**: It enables a retention period in days for deleted containers
|
||||
- **Enable soft delete for file shares**: It enables a retention period in days for deleted file shared
|
||||
- **Enable versioning for blobs**: Maintain previous versions of your blobs
|
||||
- **Enable blob change feed**: Keep logs of create, modification, and delete changes to blobs
|
||||
- **Enable version-level immutability support**: Allows you to set time-based retention policy on the account-level that will apply to all blob versions.
|
||||
- Version-level immutability support and point-in-time restore for containers cannot be enabled simultaneously.
|
||||
|
||||
**Encryption configuration options**:
|
||||
|
||||
- **Encryption type**: Можна використовувати Microsoft-managed keys (MMK) або Customer-managed keys (CMK)
|
||||
- **Enable infrastructure encryption**: Дозволяє double encrypt the data "for more security"
|
||||
- **Encryption type**: It's possible to use Microsoft-managed keys (MMK) or Customer-managed keys (CMK)
|
||||
- **Enable infrastructure encryption**: Allows to double encrypt the data "for more security"
|
||||
|
||||
### Storage endpoints
|
||||
|
||||
@@ -89,19 +89,19 @@ az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdou
|
||||
```
|
||||
### Auditing anonymous blob exposure
|
||||
|
||||
- **Знайдіть storage accounts**, які можуть exposure data: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. If `allowBlobPublicAccess` is `false` you cannot turn containers public.
|
||||
- **Знайдіть storage accounts**, які можуть expose дані: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Якщо `allowBlobPublicAccess` дорівнює `false`, ви не можете зробити containers public.
|
||||
- **Перевірте risky accounts**, щоб підтвердити flag та інші weak settings: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
|
||||
- **Перелічіть container-level exposure**, де flag увімкнено:
|
||||
```bash
|
||||
az storage container list --account-name <acc> \
|
||||
--query '[].{name:name, access:properties.publicAccess}'
|
||||
```
|
||||
- `"Blob"`: anonymous reads allowed **only when blob name is known** (no listing).
|
||||
- `"Container"`: anonymous **list + read** of every blob.
|
||||
- `null`: private; authentication required.
|
||||
- **Підтвердити доступ** без credentials:
|
||||
- If `publicAccess` is `Container`, anonymous listing works: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
|
||||
- For both `Blob` and `Container`, anonymous blob download works when the name is known:
|
||||
- `"Blob"`: анонімні reads дозволені **лише коли blob name відомий** (без listing).
|
||||
- `"Container"`: анонімні **list + read** для кожного blob.
|
||||
- `null`: private; потрібна authentication.
|
||||
- **Підтвердити access** без credentials:
|
||||
- Якщо `publicAccess` це `Container`, анонімний listing працює: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
|
||||
- Для `Blob` і `Container`, анонімний blob download працює, коли name відомий:
|
||||
```bash
|
||||
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
|
||||
# or via raw HTTP
|
||||
@@ -115,25 +115,25 @@ If you find any **storage** you can connect to you could use the tool [**Microso
|
||||
|
||||
### RBAC
|
||||
|
||||
Можна використовувати principals Entra ID з **RBAC roles** для доступу до storage accounts, і це рекомендований спосіб.
|
||||
It's possible to use Entra ID principals with **RBAC roles** to access storage accounts and it's the recommended way.
|
||||
|
||||
### Access Keys
|
||||
|
||||
Storage accounts мають access keys, які можна використовувати для доступу до них. Це надає f**ull access to the storage account.**
|
||||
The storage accounts have access keys that can be used to access it. This provides f**ull access to the storage account.**
|
||||
|
||||
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### **Shared Keys & Lite Shared Keys**
|
||||
|
||||
Можна [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key), підписані access keys, для авторизації доступу до певних ресурсів через signed 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` представляє storage services resource (URI). І якщо будь-яка частина в URL закодована, вона також має бути закодована всередині `CanonicalizedResource`.
|
||||
> Note that the `CanonicalizedResource` part represents the storage services resource (URI). And if any part in the URL is encoded, it should also be encoded inside the `CanonicalizedResource`.
|
||||
|
||||
> [!NOTE]
|
||||
> Це **used by default by `az` cli** для автентифікації запитів. Щоб змусити його використовувати credentials principal Entra ID, вкажіть параметр `--auth-mode login`.
|
||||
> This is **used by default by `az` cli** to authenticate requests. To make it use the Entra ID principal credentials indicate the param `--auth-mode login`.
|
||||
|
||||
- Можна згенерувати **shared key for blob, queue and file services** підписуючи таку інформацію:
|
||||
- It's possible to generate a **shared key for blob, queue and file services** signing the following information:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-Encoding + "\n" +
|
||||
@@ -150,7 +150,7 @@ Range + "\n" +
|
||||
CanonicalizedHeaders +
|
||||
CanonicalizedResource;
|
||||
```
|
||||
- Можливо згенерувати **shared key для table services**, підписавши таку інформацію:
|
||||
- Можливо згенерувати **shared key for table services**, підписавши таку інформацію:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-MD5 + "\n" +
|
||||
@@ -158,7 +158,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" +
|
||||
@@ -167,12 +167,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] <AccountName>:<Signature>"
|
||||
#e.g.
|
||||
@@ -186,20 +186,20 @@ Content-Length: 0
|
||||
```
|
||||
### **Shared Access Signature** (SAS)
|
||||
|
||||
Shared Access Signatures (SAS) — це безпечні URL-адреси з обмеженим часом дії, які **надають конкретні permissions для доступу до ресурсів** в Azure Storage account без розкриття access keys облікового запису. Хоча access keys надають повний адміністративний доступ до всіх ресурсів, SAS дає granular control через вказання permissions (наприклад, read або write) і визначення часу завершення дії.
|
||||
Shared Access Signatures (SAS) — це безпечні, обмежені за часом URL-адреси, які **надають конкретні permissions для доступу до resources** в Azure Storage account без розкриття access keys account. Хоча access keys надають повний адміністративний доступ до всіх resources, SAS дозволяє granular control шляхом вказання permissions (наприклад, read або write) і визначення часу завершення дії.
|
||||
|
||||
#### SAS Types
|
||||
|
||||
- **User delegation SAS**: створюється з **Entra ID principal**, який підписує SAS і делегує permissions від user до 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 з "більшими" permissions, ніж ті, що має user. Однак, якщо principal не має цих permissions, це не спрацює (no privesc).
|
||||
- **Service SAS**: підписується одним із storage account **access keys**. Його можна використовувати для надання доступу до конкретних ресурсів в одному storage service. Якщо key буде оновлено, SAS перестане працювати.
|
||||
- **Account SAS**: також підписується одним із storage account **access keys**. Він надає доступ до ресурсів у сервісах storage account (Blob, Queue, Table, File) і може включати service-level operations.
|
||||
- **User delegation SAS**: Створюється з **Entra ID principal**, який підписує SAS і делегує permissions від user до 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 із "більшими" permissions, ніж має user. Однак, якщо principal їх не має, це не спрацює (no privesc).
|
||||
- **Service SAS**: Підписується за допомогою одного з storage account **access keys**. Його можна використовувати для надання доступу до конкретних resources в одному storage service. Якщо key буде оновлено, SAS перестане працювати.
|
||||
- **Account SAS**: Також підписується за допомогою одного з storage account **access keys**. Він надає доступ до resources across storage account services (Blob, Queue, Table, File) і може включати service-level operations.
|
||||
|
||||
SAS URL, підписаний за допомогою **access key**, має такий вигляд:
|
||||
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**, має такий вигляд:
|
||||
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`
|
||||
|
||||
@@ -207,35 +207,35 @@ SAS URL, підписаний як **user delegation**, має такий виг
|
||||
|
||||
- Параметр **`se`** вказує **expiration date** SAS
|
||||
- Параметр **`sp`** вказує **permissions** SAS
|
||||
- **`sig`** — це **signature**, яка валідовує SAS
|
||||
- **`sig`** — це **signature**, що валідовує SAS
|
||||
|
||||
#### SAS permissions
|
||||
|
||||
Під час генерації SAS потрібно вказати permissions, які він має надавати. Залежно від об'єкта, для якого генерується SAS, можуть бути включені різні permissions. Наприклад:
|
||||
Під час генерації SAS потрібно вказати permissions, які він має надавати. Залежно від object, поверх якого генерується SAS, можуть бути включені різні permissions. Наприклад:
|
||||
|
||||
- (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 без потреби в custom solutions або third-party products.
|
||||
Azure Blob Storage тепер підтримує SSH File Transfer Protocol (SFTP), що дає змогу безпечно передавати files і керувати ними безпосередньо в Blob Storage без потреби в custom solutions або third-party products.
|
||||
|
||||
### Key Features
|
||||
|
||||
- Protocol Support: SFTP працює з Blob Storage accounts, налаштованими з hierarchical namespace (HNS). Це організовує blobs у directories і subdirectories для простішої навігації.
|
||||
- Security: SFTP використовує local user identities для authentication і не інтегрується з RBAC або ABAC. Кожен local user може authenticate через:
|
||||
- Protocol Support: SFTP працює з Blob Storage accounts, налаштованими з hierarchical namespace (HNS). Це організовує blobs у directories і subdirectories для зручнішої навігації.
|
||||
- Security: SFTP може використовувати local user identities, але також підтримує Microsoft Entra ID-based access з Azure RBAC для authorization. Це означає, що доступ можна надавати через звичайні Blob Storage data-plane roles замість створення local SFTP users. Local users можуть authenticate via:
|
||||
- Azure-generated passwords
|
||||
- Public-private SSH key pairs
|
||||
- Granular Permissions: permissions, такі як Read, Write, Delete і List, можуть бути призначені local users для up to 100 containers.
|
||||
- Networking Considerations: SFTP connections встановлюються через port 22. Azure підтримує network configurations, як-от firewalls, private endpoints або virtual networks, для захисту SFTP traffic.
|
||||
- Granular Permissions: Permissions, такі як Read, Write, Delete, і List, можуть бути призначені local users для до 100 containers.
|
||||
- Networking Considerations: SFTP connections встановлюються через port 22. Azure підтримує network configurations, як-от firewalls, private endpoints, або virtual networks, щоб захистити SFTP traffic.
|
||||
|
||||
### Setup Requirements
|
||||
|
||||
- Hierarchical Namespace: HNS має бути увімкнено під час створення storage account.
|
||||
- Supported Encryption: Requires Microsoft Security Development Lifecycle (SDL)-approved cryptographic algorithms (e.g., rsa-sha2-256, ecdsa-sha2-nistp256).
|
||||
- Supported Encryption: Потрібні cryptographic algorithms, схвалені Microsoft Security Development Lifecycle (SDL) (наприклад, 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.
|
||||
- Увімкніть SFTP на storage account.
|
||||
- Для local-user access створіть local user identities з відповідними permissions.
|
||||
- Для local users налаштуйте home directories, щоб визначити їхню стартову location всередині container.
|
||||
|
||||
### Permissions
|
||||
|
||||
@@ -379,7 +379,7 @@ az storage account local-user list \
|
||||
{{#tab name="Az PowerShell" }}
|
||||
|
||||
<details>
|
||||
<summary>Перелік Az PowerShell</summary>
|
||||
<summary>Перерахування Az PowerShell</summary>
|
||||
```powershell
|
||||
# Get storage accounts
|
||||
Get-AzStorageAccount | fl
|
||||
@@ -448,7 +448,7 @@ New-AzStorageBlobSASToken `
|
||||
az-file-shares.md
|
||||
{{#endref}}
|
||||
|
||||
## Privilege Escalation
|
||||
## Підвищення привілеїв
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-storage-privesc.md
|
||||
@@ -471,10 +471,11 @@ 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)
|
||||
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support-entra-id-based-access](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support-entra-id-based-access)
|
||||
- [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)
|
||||
- [https://learn.microsoft.com/en-us/cli/azure/storage/blob](https://learn.microsoft.com/en-us/cli/azure/storage/blob)
|
||||
- [https://learn.microsoft.com/en-us/cli/azure/storage/blob](https://learn.microsoft.com/en-us/azure/storage/blob)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user