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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
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:
Port | Process | Description |
---|---|---|
443/TCP | kube-apiserver | Porta da API do Kubernetes |
2379/TCP | etcd | |
6666/TCP | etcd | etcd |
4194/TCP | cAdvisor | Métricas do contêiner |
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 em modo completo |
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 saúde do Kube Proxy |
9099/TCP | calico-felix | Servidor de verificação de saúde 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 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.
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:
Kubelet API
Este serviço é executado em cada nó do cluster. É o serviço que 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.
Kubelet API
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:
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)
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ê pode 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 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.
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:
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 desystem: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:
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:
kubeletctl pods
/exec
Este endpoint permite executar código dentro de qualquer contêiner com muita facilidade:
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:
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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.