Pentesting Kubernetes Services

Reading time: 8 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Kubernetes usa vários serviços de rede específicos que você pode encontrar expostos à Internet ou em uma rede interna uma vez que você tenha comprometido um pod.

Encontrando pods expostos com OSINT

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

Exposing Services in Kubernetes

Encontrando pods expostos via varredura de portas

As seguintes portas podem estar abertas em um cluster Kubernetes:

PortProcessDescription
443/TCPkube-apiserverPorta da API do Kubernetes
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorMétricas do contêiner
6443/TCPkube-apiserverPorta da API do Kubernetes
8443/TCPkube-apiserverPorta da API do Minikube
8080/TCPkube-apiserverPorta da API insegura
10250/TCPkubeletAPI HTTPS que permite acesso em modo completo
10255/TCPkubeletPorta HTTP somente leitura não autenticada: pods, pods em execução e estado do nó
10256/TCPkube-proxyServidor de verificação de saúde do Kube Proxy
9099/TCPcalico-felixServidor de verificação de saúde para Calico
6782-4/TCPweaveMétricas e endpoints
30000-32767/TCPNodePortProxy para os serviços
44134/TCPTillerServiço Helm escutando

Nmap

bash
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 API Kubernetes com o qual os administradores geralmente se comunicam usando a ferramenta kubectl.

Portas comuns: 6443 e 443, mas também 8443 no minikube e 8080 como inseguro.

bash
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 página a seguir para aprender como obter dados sensíveis e realizar ações sensíveis conversando com este serviço:

Kubernetes Enumeration

Kubelet API

Este serviço é executado em cada nó do cluster. É o serviço que 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.

Kubelet API

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

Se a resposta for Unauthorized, então requer autenticação.

Se você puder listar nós, pode obter uma lista de endpoints de kubelets com:

bash
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 (Somente leitura)

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

API etcd

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

Tiller

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

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

cAdvisor

Serviço útil para coletar métricas.

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

NodePort

Quando uma porta é exposta em todos os nós via NodePort, a mesma porta é aberta em todos os nós, proxyando o tráfego para o Service declarado. Por padrão, essa porta estará na faixa 30000-32767. Portanto, novos serviços não verificados podem estar acessíveis através dessas portas.

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

Vulnerabilidades de Configuração

Acesso Anônimo ao Kube-apiserver

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

Verificando o Acesso Anônimo ao ETCD

O ETCD armazena os 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, você pode precisar usar o etcdctl ferramenta. O seguinte comando irá obter todas as chaves armazenadas:

bash
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:

Permite solicitações anônimas ao 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 de system:anonymous e um nome de grupo de system:unauthenticated

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

Kubelet Authentication & Authorization

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

bash
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 Kubeletctl ferramenta para interagir com Kubelets e seus endpoints.

/pods

Este endpoint lista pods e seus contêineres:

bash
kubeletctl pods

/exec

Este endpoint permite executar código dentro de qualquer contêiner com muita facilidade:

bash
kubeletctl exec [command]

note

Para evitar esse ataque, o serviço kubelet deve ser executado com --anonymous-auth false e o serviço deve ser segregado no nível da rede.

Verificando a Exposição de Informações do Kubelet (Porta Somente Leitura)

Quando uma porta somente leitura do kubelet está exposta, torna-se possível que informações sejam recuperadas 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, locais de arquivos internos e outras configurações, possam não ser críticas, sua exposição ainda representa um risco à 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:

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

Referências

Kubernetes Pentest Methodology Part 2

Threats & Research Archives - F-Secure Blog

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks