Pentesting Kubernetes Services

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

O Kubernetes utiliza vários serviços de rede específicos que podem estar expostos à Internet ou em uma rede interna uma vez que você comprometeu um pod.

Encontrando pods expostos com OSINT

Uma maneira poderia ser procurar por Identity LIKE "k8s.%.com" em crt.sh para encontrar subdomínios relacionados ao Kubernetes. Outra maneira poderia ser pesquisar "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:

pageExposing Services in Kubernetes

Encontrando Pods Expostos via varredura de portas

As seguintes portas podem estar abertas em um cluster Kubernetes:

PortaProcessoDescriçã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

nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16

Kube-apiserver

Este é o serviço de API do 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.

curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1

Verifique a seguinte página para aprender como obter dados sensíveis e realizar ações sensíveis ao falar com este serviço:

pageKubernetes Enumeration

API do Kubelet

Este serviço roda em cada nó do cluster. É o serviço que irá controlar os pods dentro do . 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

curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

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:

kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done

kubelet (Apenas leitura)

curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods

API etcd

curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Tiller

helm --host tiller-deploy.kube-system:44134 version

Você poderia abusar deste serviço para escalar privilégios dentro do Kubernetes:

cAdvisor

Serviço útil para coletar métricas.

curl -k https://<IP Address>:4194

NodePort

Quando uma porta é exposta em todos os nós via um NodePort, a mesma porta é aberta em todos os nós, direcionando o tráfego para o Serviço declarado. Por padrão, essa porta estará no intervalo de 30000 a 32767. Portanto, novos serviços não verificados podem ser acessíveis por meio dessas portas.

sudo nmap -sS -p 30000-32767 <IP>

Configurações Vulneráveis

Acesso Anônimo ao Kube-apiserver

O acesso anônimo aos endpoints da API do kube-apiserver não é permitido. No entanto, você pode verificar alguns endpoints:

Verificando o Acesso Anônimo ao ETCD

O ETCD armazena segredos do cluster, arquivos de configuração e outros 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 utilizar a ferramenta etcdctl. O comando a seguir irá obter todas as chaves armazenadas:

etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Kubelet RCE

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 grupo system:unauthenticated

Para entender melhor como a autenticação e autorização da API do Kuebelet funcionam, consulte esta página:

pageKubelet Authentication & Authorization

O serviço Kubelet API não é documentado, mas o código fonte pode ser encontrado aqui e encontrar os endpoints expostos é tão fácil quanto executar:

curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").

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:

kubeletctl pods

/exec

Este endpoint permite executar código dentro de qualquer container de forma muito fácil:

kubeletctl exec [command]

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 Apenas do Kubelet

Quando uma porta de leitura apenas 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

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Última actualización