Pentesting Kubernetes Services

Support HackTricks

Kubernetes inatumia huduma kadhaa maalum za mtandao ambazo unaweza kupata zilizo wazi kwa Mtandao au katika mtandao wa ndani mara tu unaposhambulia pod moja.

Finding exposed pods with OSINT

Njia moja inaweza kuwa kutafuta Identity LIKE "k8s.%.com" katika crt.sh ili kupata subdomains zinazohusiana na kubernetes. Njia nyingine inaweza kuwa kutafuta "k8s.%.com" katika github na kutafuta faili za YAML zinazokuwa na string hiyo.

How Kubernetes Exposes Services

Inaweza kuwa na manufaa kwako kuelewa jinsi Kubernetes inaweza kufichua huduma hadharani ili kuweza kuzitafuta:

Finding Exposed pods via port scanning

Port zifuatazo zinaweza kuwa wazi katika klasta ya Kubernetes:

Nmap

nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16

Kube-apiserver

Hii ni huduma ya API ya Kubernetes ambayo wasimamizi huwasiliana nayo mara nyingi wakitumia chombo kubectl.

Bandari za kawaida: 6443 na 443, lakini pia 8443 katika minikube na 8080 kama isiyo salama.

curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1

Angalia ukurasa ufuatao kujifunza jinsi ya kupata data nyeti na kutekeleza hatua nyeti ukizungumza na huduma hii:

Kubelet API

Huduma hii inafanya kazi katika kila node ya klasta. Ni huduma ambayo itakuwa na udhibiti wa pods ndani ya node. Inazungumza na kube-apiserver.

Ikiwa utapata huduma hii imewekwa wazi huenda umepata RCE isiyo na uthibitisho.

Kubelet API

curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

Ikiwa jibu ni Unauthorized basi inahitaji uthibitisho.

Ikiwa unaweza kuorodhesha nodi unaweza kupata orodha ya mwisho za kubelets kwa:

kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done

kubelet (Soma tu)

curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods

etcd API

curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Tiller

helm --host tiller-deploy.kube-system:44134 version

You could abuse this service to escalate privileges inside Kubernetes:

cAdvisor

Huduma inayofaa kukusanya metriki.

curl -k https://<IP Address>:4194

NodePort

Wakati bandari inafichuliwa katika nodi zote kupitia NodePort, bandari hiyo hiyo inafunguliwa katika nodi zote ikipitia trafiki kwenye Service iliyotangazwa. Kwa default, bandari hii itakuwa katika range 30000-32767. Hivyo, huduma mpya zisizokaguliwa zinaweza kupatikana kupitia bandari hizo.

sudo nmap -sS -p 30000-32767 <IP>

Vulnerable Misconfigurations

Kube-apiserver Anonymous Access

Upatikanaji wa bila jina kwa kube-apiserver API endpoints haukubaliwi. Lakini unaweza kuangalia baadhi ya endpoints:

Checking for ETCD Anonymous Access

ETCD inahifadhi siri za klasta, faili za usanidi na data nyeti zaidi. Kwa kawaida, ETCD haiwezi kufikiwa bila jina, lakini ni vyema kuangalia.

Ikiwa ETCD inaweza kufikiwa bila jina, unaweza kuhitaji kutumia etcdctl chombo. Amri ifuatayo itapata funguo zote zilizohifadhiwa:

etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Kubelet RCE

The Kubelet documentation inaeleza kwamba kwa default ufikiaji wa kutotambulika kwa huduma unaruhusiwa:

Inaruhusu maombi ya kutotambulika kwa seva ya Kubelet. Maombi ambayo hayakukataliwa na njia nyingine ya uthibitishaji yanachukuliwa kama maombi ya kutotambulika. Maombi ya kutotambulika yana jina la mtumiaji system:anonymous, na jina la kundi system:unauthenticated

Ili kuelewa vizuri jinsi uthibitishaji na idhini ya Kubelet API inavyofanya kazi, angalia ukurasa huu:

Huduma ya Kubelet API haijandikwa, lakini msimbo wa chanzo unaweza kupatikana hapa na kupata ncha zilizofichwa ni rahisi kama kukimbia:

curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").

Wote wanakera kuvutia.

Unaweza kutumia chombo cha Kubeletctl kuingiliana na Kubelets na mwisho wao.

/pods

Mwishoni hapa orodha ya pods na kontena zao:

kubeletctl pods

/exec

Hii endpoint inaruhusu kutekeleza msimbo ndani ya kontena yoyote kwa urahisi:

kubeletctl exec [command]

Ili kuepuka shambulio hili, huduma ya kubelet inapaswa kuendeshwa na --anonymous-auth false na huduma hiyo inapaswa kutengwa katika kiwango cha mtandao.

Kuangalia Kuwekwa wazi kwa Taarifa za Kubelet (Bandari ya Kusoma Tu)

Wakati bandari ya kubelet ya kusoma tu inakabiliwa, inakuwa inawezekana kwa taarifa kutolewa kutoka kwa API na wahusika wasioidhinishwa. Kuwekwa wazi kwa bandari hii kunaweza kusababisha kufichuliwa kwa vipengele mbalimbali vya mipangilio ya klasta. Ingawa taarifa, ikiwa ni pamoja na majina ya pod, maeneo ya faili za ndani, na mipangilio mingine, inaweza isiwe muhimu, kuwekwa wazi kwake bado kunaweka hatari ya usalama na inapaswa kuepukwa.

Mfano wa jinsi udhaifu huu unaweza kutumika ni pamoja na mshambuliaji wa mbali kufikia URL maalum. Kwa kuhamasisha http://<external-IP>:10255/pods, mshambuliaji anaweza kupata taarifa nyeti kutoka kwa kubelet:

Marejeleo

Support HackTricks

Last updated