Pentesting Kubernetes Services
O Kubernetes utiliza vários serviços de rede específicos que podem estar expostos à Internet ou em uma rede interna após comprometer um pod.
Encontrando pods expostos com OSINT
Uma maneira poderia ser buscar por Identity LIKE "k8s.%.com"
no crt.sh para encontrar subdomínios relacionados ao Kubernetes. Outra maneira poderia ser buscar por "k8s.%.com"
no github e procurar por arquivos YAML contendo a string.
Como o Kubernetes Expõe Serviços
Pode ser útil para você entender como o Kubernetes pode expor serviços publicamente para encontrá-los:
Exposing Services in KubernetesEncontrando Pods Expostos via varredura de portas
As seguintes portas podem estar abertas em um cluster Kubernetes:
Porta | Processo | Descrição |
---|---|---|
443/TCP | kube-apiserver | Porta da API do Kubernetes |
2379/TCP | etcd | |
6666/TCP | etcd | etcd |
4194/TCP | cAdvisor | Métricas de contêineres |
6443/TCP | kube-apiserver | Porta da API do Kubernetes |
8443/TCP | kube-apiserver | Porta da API do Minikube |
8080/TCP | kube-apiserver | Porta da API insegura |
10250/TCP | kubelet | API HTTPS que permite acesso total |
10255/TCP | kubelet | Porta HTTP somente leitura não autenticada: pods, pods em execução e estado do nó |
10256/TCP | kube-proxy | Servidor de verificação de integridade do Kube Proxy |
9099/TCP | calico-felix | Servidor de verificação de integridade para Calico |
6782-4/TCP | weave | Métricas e endpoints |
30000-32767/TCP | NodePort | Proxy para os serviços |
44134/TCP | Tiller | Serviço Helm escutando |
Nmap
Kube-apiserver
Este é o serviço API Kubernetes com o qual os administradores geralmente interagem usando a ferramenta kubectl
.
Portas comuns: 6443 e 443, mas também 8443 no minikube e 8080 como inseguro.
Verifique a seguinte página para aprender como obter dados sensíveis e realizar ações sensíveis ao falar com este serviço:
Kubernetes EnumerationAPI do Kubelet
Este serviço roda em cada nó do cluster. É o serviço que irá controlar os pods dentro do nó. Ele se comunica com o kube-apiserver.
Se você encontrar este serviço exposto, pode ter encontrado um RCE não autenticado.
API do Kubelet
Se a resposta for Não autorizado
, então requer autenticação.
Se você pode listar nós, você pode obter uma lista de endpoints de kubelets com:
kubelet (Apenas leitura)
API do etcd
Tiller
Você poderia abusar deste serviço para escalar privilégios dentro do Kubernetes:
cAdvisor
Serviço útil para coletar métricas.
NodePort
Quando uma porta é exposta em todos os nós via um NodePort, a mesma porta é aberta em todos os nós para encaminhar o tráfego para o Serviço declarado. Por padrão, esta porta estará no intervalo 30000-32767. Portanto, novos serviços não verificados podem ser acessíveis por meio dessas portas.
Configurações Vulneráveis
Acesso Anônimo ao Kube-apiserver
O acesso anônimo aos pontos de extremidade da API kube-apiserver não é permitido. Mas você pode verificar alguns pontos de extremidade:
Verificando o Acesso Anônimo ao ETCD
O ETCD armazena segredos do cluster, arquivos de configuração e mais dados sensíveis. Por padrão, o ETCD não pode ser acessado anonimamente, mas sempre é bom verificar.
Se o ETCD puder ser acessado anonimamente, talvez seja necessário usar a ferramenta etcdctl. O comando a seguir obterá todas as chaves armazenadas:
RCE do Kubelet
A documentação do Kubelet explica que por padrão o acesso anônimo ao serviço é permitido:
Habilita solicitações anônimas para o servidor Kubelet. Solicitações que não são rejeitadas por outro método de autenticação são tratadas como solicitações anônimas. Solicitações anônimas têm um nome de usuário
system:anonymous
e um nome de gruposystem:unauthenticated
Para entender melhor como a autenticação e autorização da API do Kubelet funcionam, consulte esta página:
Kubelet Authentication & AuthorizationO serviço Kubelet API não está documentado, mas o código fonte pode ser encontrado aqui e encontrar os endpoints expostos é tão fácil quanto executar:
Todos eles parecem interessantes.
Você pode usar a ferramenta Kubeletctl para interagir com Kubelets e seus endpoints.
/pods
Este endpoint lista pods e seus containers:
/exec
Este endpoint permite executar código dentro de qualquer container de forma muito fácil:
Para evitar esse ataque, o serviço kubelet deve ser executado com --anonymous-auth false
e o serviço deve ser segregado ao nível da rede.
Verificação da Exposição de Informações do Porta de Leitura do Kubelet
Quando uma porta de leitura somente leitura do kubelet é exposta, torna-se possível recuperar informações da API por partes não autorizadas. A exposição dessa porta pode levar à divulgação de vários elementos de configuração do cluster. Embora as informações, incluindo nomes de pods, localizações de arquivos internos e outras configurações, possam não ser críticas, sua exposição ainda representa um risco de segurança e deve ser evitada.
Um exemplo de como essa vulnerabilidade pode ser explorada envolve um atacante remoto acessando uma URL específica. Ao navegar para http://<external-IP>:10255/pods
, o atacante pode potencialmente recuperar informações sensíveis do kubelet:
Referências
Last updated