AWS - EKS पोस्ट एक्सप्लॉइटेशन

Reading time: 7 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

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

EKS

अधिक जानकारी के लिए देखें

AWS - EKS Enum

AWS कंसोल से क्लस्टर की गणना करें

यदि आपके पास अनुमति eks:AccessKubernetesApi है, तो आप AWS EKS कंसोल के माध्यम से Kubernetes ऑब्जेक्ट्स को देख सकते हैं (Learn more).

AWS Kubernetes क्लस्टर से कनेक्ट करें

  • आसान तरीका:
bash
# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • इतना आसान तरीका नहीं:

यदि आप aws eks get-token --name <cluster_name> के साथ एक टोकन प्राप्त कर सकते हैं लेकिन आपके पास क्लस्टर जानकारी (describeCluster) प्राप्त करने की अनुमति नहीं है, तो आप अपना खुद का ~/.kube/config तैयार कर सकते हैं। हालांकि, टोकन होने पर, आपको जुड़ने के लिए url endpoint की आवश्यकता है (यदि आप किसी पॉड से JWT टोकन प्राप्त करने में सफल रहे हैं तो यहाँ पढ़ें) और क्लस्टर का नाम

मेरे मामले में, मैंने CloudWatch लॉग में जानकारी नहीं पाई, लेकिन मैंने LaunchTemplates userData में और EC2 मशीनों में userData में भी इसे पाया। आप इस जानकारी को userData में आसानी से देख सकते हैं, उदाहरण के लिए अगले उदाहरण में (क्लस्टर का नाम cluster-name था):

bash
API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com

/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false
क्यूब कॉन्फ़िग
yaml
describe-cache-parametersapiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
contexts:
- context:
cluster: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
user: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
current-context: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- --region
- us-west-2
- --profile
- <profile>
- eks
- get-token
- --cluster-name
- <cluster-name>
command: aws
env: null
interactiveMode: IfAvailable
provideClusterInfo: false

AWS से Kubernetes तक

EKS क्लस्टर का निर्माता हमेशा समूह system:masters (k8s प्रशासन) के kubernetes क्लस्टर भाग में प्रवेश प्राप्त कर सकेगा। इस लेख के समय क्लस्टर को बनाने वाले कोई सीधा तरीका नहीं है (आप CloudTrail की जांच कर सकते हैं)। और उस अधिकार को हटाने का कोई तरीका नहीं है।

K8s पर अधिक AWS IAM उपयोगकर्ताओं या भूमिकाओं को पहुँच प्रदान करने का तरीका configmap aws-auth का उपयोग करना है।

warning

इसलिए, config map aws-auth पर लिखने की पहुँच रखने वाला कोई भी व्यक्ति पूरे क्लस्टर को समझौता कर सकेगा।

IAM भूमिकाओं और उपयोगकर्ताओं को एक ही या विभिन्न खाते में अतिरिक्त अधिकार प्रदान करने के बारे में अधिक जानकारी के लिए और इसे दुरुपयोग करने के लिए privesc इस पृष्ठ की जांच करें

यहाँ भी यह अद्भुत पोस्ट देखें कि IAM -> Kubernetes प्रमाणीकरण कैसे काम करता है

Kubernetes से AWS तक

यह संभव है कि kubernetes सेवा खाते के लिए OpenID प्रमाणीकरण की अनुमति दी जाए ताकि वे AWS में भूमिकाएँ ग्रहण कर सकें। जानें कि यह इस पृष्ठ पर कैसे काम करता है

JWT टोकन से GET Api सर्वर एंडपॉइंट

JWT टोकन को डिकोड करने पर हमें क्लस्टर आईडी और क्षेत्र भी मिलता है। image यह जानते हुए कि EKS URL का मानक प्रारूप है

bash
https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com

कोई दस्तावेज़ नहीं मिला जो 'दो अक्षरों' और 'संख्या' के लिए मानदंडों को समझाए। लेकिन मैंने अपनी ओर से कुछ परीक्षण किए और ये दो बार दिखाई दिए:

  • gr7
  • yl4

वैसे, ये सिर्फ 3 अक्षर हैं, हम इन्हें ब्रूटफोर्स कर सकते हैं। सूची बनाने के लिए नीचे दिए गए स्क्रिप्ट का उपयोग करें।

python
from itertools import product
from string import ascii_lowercase

letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2)
number_combinations = product('0123456789', repeat = 1)

result = [
f'{''.join(comb[0])}{comb[1][0]}'
for comb in product(letter_combinations, number_combinations)
]

with open('out.txt', 'w') as f:
f.write('\n'.join(result))

फिर wfuzz के साथ

bash
wfuzz -Z -z file,out.txt --hw 0 https://<cluster-id>.FUZZ.<region>.eks.amazonaws.com

warning

याद रखें कि & को बदलें।

CloudTrail को बायपास करें

यदि एक हमलावर के पास EKS पर अनुमति के साथ AWS के क्रेडेंशियल्स हैं। यदि हमलावर अपने kubeconfig को कॉन्फ़िगर करता है (बिना update-kubeconfig को कॉल किए) जैसा कि पहले समझाया गया है, तो get-token Cloudtrail में लॉग उत्पन्न नहीं करता क्योंकि यह AWS API के साथ इंटरैक्ट नहीं करता (यह केवल स्थानीय रूप से टोकन बनाता है)।

तो जब हमलावर EKS क्लस्टर के साथ बात करता है, cloudtrail उपयोगकर्ता के चोरी होने और इसे एक्सेस करने से संबंधित कुछ भी लॉग नहीं करेगा

ध्यान दें कि EKS क्लस्टर में लॉग सक्षम हो सकते हैं जो इस एक्सेस को लॉग करेंगे (हालांकि, डिफ़ॉल्ट रूप से, वे अक्षम होते हैं)।

EKS फिरौती?

डिफ़ॉल्ट रूप से, उपयोगकर्ता या भूमिका जिसने एक क्लस्टर बनाया है, वह हमेशा क्लस्टर पर प्रशासनिक विशेषाधिकार रखेगा। और यही एकमात्र "सुरक्षित" एक्सेस होगा जो AWS Kubernetes क्लस्टर पर होगा।

तो, यदि एक हमलावर फर्गेट का उपयोग करके एक क्लस्टर से समझौता करता है और सभी अन्य प्रशासकों को हटा देता है और क्लस्टर बनाने वाले AWS उपयोगकर्ता/भूमिका को हटा देता है, हमलावर ने क्लस्टर को फिरौती** ली हो सकती है**।

tip

ध्यान दें कि यदि क्लस्टर EC2 VMs का उपयोग कर रहा था, तो नोड से प्रशासनिक विशेषाधिकार प्राप्त करना संभव हो सकता है और क्लस्टर को पुनर्प्राप्त करना।

वास्तव में, यदि क्लस्टर फर्गेट का उपयोग कर रहा है तो आप EC2 नोड्स को क्लस्टर में ले जा सकते हैं या सब कुछ EC2 में स्थानांतरित कर सकते हैं और नोड में टोकन को एक्सेस करके इसे पुनर्प्राप्त कर सकते हैं।

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

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