Docker逃逸学习

前言 趁着这几天刚出完公司的题,抽出时间看了一下docker逃逸方面的东西,这里的话主要就是放攻击手法了,一些基础的概念就懒得赘述了 如何判断虚拟环境类型 参考:https://yuy0ung.github.io/blog/%E4%BA%91%E5%AE%89%E5%85%A8/%E8%AF%86%E5%88%AB%E8%99%9A%E6%8B%9F%E6%9C%BAdocker%E5%92%8Ck8s%E9%9B%86%E7%BE%A4%E7%8E%AF%E5%A2%83/ 通常在getshell之后,我们都需要考虑一个问题:我们是真的拿到目标机器的shell了还是只是处于机器中虚拟环境里?前者的话肯定直接做一些比如提权,内网穿透,横向移动,权限维持等内网渗透的手法,但是如果我们此时是处在机器中的虚拟环境中的话,我们需要先判断该虚拟环境的类型 通常情况下,shell的虚拟环境可能有三个类型:虚拟机,Docker,k8s。这三种类型对应着三种不同的攻击面: 虚拟机:通常考虑横向移动来扩大攻击效果 Docker:通常考虑容器逃逸到宿主机 K8s:通常先尝试接管集群,以获取对容器和集群资源的完全控制(注意:K8s其实本质上也是跑容器,只不过不一定用 Docker,现代 K8s 常见运行时是 containerd / cri-o) 当然,仍有一些特殊的情况比如:Docker运行在虚拟机里,这种情况在这里就不讲述了 查看主机名和进程 hostname #查看主机名 ps aux #显示系统上所有用户的详细进程信息 Docker 默认 hostname 通常是容器 ID 的前 12 位(不绝对),PID1非系统进程,可初步判断当前为容器环境 如果是在普通虚拟机或物理机里,PID 1 通常是:systemd 或者 init 如果是在容器里,PID 1 可能是: bash,sh,python,node,java,nginx,tini,supervisord 但是注意: 有些容器也会跑 systemd 有些轻量 VM 也可能不是 systemd 所以 PID 1 只是作为初步的判断 检查根目录下.dockerenv文件 ls -la /.dockerenv 通过判断根目录下的.dockerenv文件是否存在,确认当前环境是否为容器环境。 需要注意:有些 Docker 容器可能没有这个文件,甚至有些镜像为了伪装会删除掉这个文件 看 cgroup 信息 cat /proc/1/cgroup 或者: cat /proc/self/cgroup 这个文件是一个 内核提供的虚拟文件,里面包含了PID 1 这个进程属于哪些 cgroup,而cgroup 是 Linux 用来做资源隔离和限制的机制,通常用于限制一个进程/容器的cpu,内存等资源使用 ...

May 28, 2026 · 5 min · 1058 words · Me