A Kubernetes cluster left partially exposed — a misconfigured node component allows unauthenticated command execution, and the resulting access is enough to spin up a privileged pod that reads the entire host filesystem.
$ ip=10.129.96.167; ports=$(nmap -p- --min-rate=1000 -T4 $ip | grep '^[0-9]' | cut -d '/' -f 1 | tr' '',' | sed s/,$//); nmap -p$ports -sC -sV $ip Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-27 01:17 -0400 Nmap scan report for 10.129.96.167 Host is up (0.22s latency).
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 fc:fb:90:ee:7c:73:a1:d4:bf:87:f8:71:e8:44:c6:3c (RSA) | 256 46:83:2b:1b:01:db:71:64:6a:3e:27:cb:53:6f:81:a1 (ECDSA) |_ 256 1d:8d:d3:41:f3:ff:a4:37:e8:ac:78:08:89:c2:e3:c5 (ED25519) 2379/tcp open ssl/etcd-client? | tls-alpn: |_ h2 |_ssl-date: TLS randomness does not represent time | ssl-cert: Subject: commonName=steamcloud | Subject Alternative Name: DNS:localhost, DNS:steamcloud, IP Address:10.129.96.167, IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1 | Not valid before: 2026-03-27T05:09:05 |_Not valid after: 2027-03-27T05:09:06 2380/tcp open ssl/etcd-server? | ssl-cert: Subject: commonName=steamcloud | Subject Alternative Name: DNS:localhost, DNS:steamcloud, IP Address:10.129.96.167, IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1 | Not valid before: 2026-03-27T05:09:05 |_Not valid after: 2027-03-27T05:09:06 | tls-alpn: |_ h2 |_ssl-date: TLS randomness does not represent time 8443/tcp open ssl/http Golang net/http server | tls-alpn: | h2 |_ http/1.1 | fingerprint-strings: | GenericLines, Help, RTSPRequest, SSLSessionReq: | HTTP/1.1 400 Bad Request | Content-Type: text/plain; charset=utf-8 | Connection: close | Request | ssl-cert: Subject: commonName=minikube/organizationName=system:masters | Subject Alternative Name: DNS:minikubeCA, DNS:control-plane.minikube.internal, DNS:kubernetes.default.svc.cluster.local, DNS:kubernetes.default.svc, DNS:kubernetes.default, DNS:kubernetes, DNS:localhost, IP Address:10.129.96.167, IP Address:10.96.0.1, IP Address:127.0.0.1, IP Address:10.0.0.1 | Not valid before: 2026-03-26T05:09:04 |_Not valid after: 2029-03-26T05:09:04 |_ssl-date: TLS randomness does not represent time |_http-title: Site doesn't have a title (application/json). 10249/tcp open http Golang net/http server (Go-IPFS json-rpc or InfluxDB API) |_http-title: Site doesn't have a title (text/plain; charset=utf-8). 10250/tcp open ssl/http Golang net/http server (Go-IPFS json-rpc or InfluxDB API) | ssl-cert: Subject: commonName=steamcloud@1774588147 | Subject Alternative Name: DNS:steamcloud | Not valid before: 2026-03-27T04:09:07 |_Not valid after: 2027-03-27T04:09:07 |_ssl-date: TLS randomness does not represent time | tls-alpn: | h2 |_ http/1.1 |_http-title: Site doesn't have a title (text/plain; charset=utf-8). 10256/tcp open http Golang net/http server (Go-IPFS json-rpc or InfluxDB API) |_http-title: Site doesn't have a title (text/plain; charset=utf-8). Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 65.10 seconds
The scan reveals a full Kubernetes cluster surface:
2379/tcp and 2380/tcp — etcd client and server over TLS (Kubernetes backend datastore)
8443/tcp — Kubernetes API server; the certificate includes minikubeCA and control-plane.minikube.internal, confirming this is a Minikube cluster
10250/tcp — Kubelet API over TLS
10249/tcp and 10256/tcp — likely kube-proxy and node health components
The Kubelet’s /run endpoint allows executing commands inside a running container without any authentication. Test RCE on the nginx pod in the default namespace:
The service account token has sufficient permissions to create new pods via the API server. We create a privileged pod that mounts the entire host filesystem at /host. Because the pod runs with privileged: true and uses a hostPath volume pointing to /, we gain unrestricted read access to the underlying node’s filesystem — including /root: