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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
EKS
अधिक जानकारी के लिए देखें
AWS कंसोल से क्लस्टर की गणना करें
यदि आपके पास अनुमति eks:AccessKubernetesApi
है, तो आप AWS EKS कंसोल के माध्यम से Kubernetes ऑब्जेक्ट्स को देख सकते हैं (Learn more).
AWS Kubernetes क्लस्टर से कनेक्ट करें
- आसान तरीका:
# 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 था):
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
क्यूब कॉन्फ़िग
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 टोकन को डिकोड करने पर हमें क्लस्टर आईडी और क्षेत्र भी मिलता है। यह जानते हुए कि EKS URL का मानक प्रारूप है
https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com
कोई दस्तावेज़ नहीं मिला जो 'दो अक्षरों' और 'संख्या' के लिए मानदंडों को समझाए। लेकिन मैंने अपनी ओर से कुछ परीक्षण किए और ये दो बार दिखाई दिए:
- gr7
- yl4
वैसे, ये सिर्फ 3 अक्षर हैं, हम इन्हें ब्रूटफोर्स कर सकते हैं। सूची बनाने के लिए नीचे दिए गए स्क्रिप्ट का उपयोग करें।
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 के साथ
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।