Docker逃逸_先锋性探测
判断是否为容器环境
大部分情景可以使用下面这个命令
1 | cat /proc/1/cgroup | grep -qi docker && echo "Is Docker" || echo "Not Docker" |
回显 “Is Docker”则代表当前为Docker环境
更详细的判断
援引:云上攻防-云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载
方式一:查询cgroup信息
docker中:

真实主机上:

方式二:检查/.dockerenv文件
通过判断根目录下的 .dockerenv文件是否存在,可以简单的识别docker环境 docker中:

真实主机上:

不过有一点需要注意的是,如果你获取的shell权限过小的话(www-data、或是某一服务的用户),根目录下也是不存在.dockerenv文件的
方式三:检查mount信息
利用mount查看挂载磁盘是否存在docker相关信息。
docker中:

真实主机上:

方式四:查看硬盘信息
fdisk -l 容器输出为空,非容器有内容输出。
docker中:

真实主机上:

方式五:查看文件系统以及挂载点
df -h 检查文件系统挂载的目录,也能够简单判断是否为docker环境。
1 | df -h | egrep '(overlay|aufs)' |
docker中:

真实主机上:

docker容器逃逸攻击面检测
援引:容器逃逸方法检测指北
在开始之前对于容器逃逸主要有以下三种方法:
- 不安全的配置
- 相关程序漏洞
- 内核漏洞
不安全的配置
特权模式
执行以下命令,如果返回 Is privileged mode 则说明当前是特权模式,反之置否
由于用户为了某些业务,图方便不划分权限组所做的危险挂载,这时容器内的root权限等同于宿主机的root权限
1 | cat /proc/self/status | grep -qi "0000003fffffffff" && echo "Is privileged mode" || echo "Not privileged mode" |
挂载 Docker Socket
执行以下命令,如果返回 Docker Socket is mounted. 说明当前挂载了 Docker Socket(守护进程)
当一个容器被授权访问 Docker Socket 时,它实际上获得了与宿主机上的 Docker 守护进程进行通信的能力。这意味着,容器内的进程可以扮演 Docker 客户端的角色,向宿主机上的 Docker 守护进程发送任何 Docker 命令。
1 | ls /var/run/ | grep -qi docker.sock && echo "Docker Socket is mounted." || echo "Docker Socket is not mounted." |
挂载 procfs
procfs(Process File System)是一个虚拟文件系统,由 Linux 内核动态生成。它以文件和目录的形式提供了关于系统和进程的实时信息。例如:
当一个容器**挂载了宿主机的 /proc 目录时,容器内的进程就可以读取甚至修改宿主机的内核参数和进程信息。**这可能导致敏感信息泄露以及一系列间接的影响
1 | find / -name core_pattern 2>/dev/null | wc -l | grep -q 2 && echo "Procfs is mounted." || echo "Procfs is not mounted." |
挂载宿主机根目录
执行以下命令,如果返回 Root directory is mounted. 则说明宿主机目录被挂载
挂载宿主机根目录等同于将宿主机的整个文件系统暴露给容器。一旦攻击者控制了这样的容器,就相当于获得了宿主机的 root 权限,容器的隔离性完全失效。这是 Docker 容器安全中最危险的配置之一。
1 | find / -name passwd 2>/dev/null | grep /etc/passwd | wc -l | grep -q 7 && echo "Root directory is mounted." || echo "Root directory is not mounted." |
如果返回 Root directory is not mounted. 则说明没有挂载
Docker remote api 未授权访问
执行以下命令,如果返回 Docker Remote API Is Enabled. 说明目标存在 Docker remote api 未授权访问
Docker Remote API 允许通过 HTTP 协议远程管理 Docker 守护进程。如果这个 API 没有经过适当的认证和授权就暴露在网络上(通常监听在 2375 端口),就会导致未授权访问漏洞,其影响与挂载 Docker Socket 类似,甚至更广。
- 一旦攻击者通过未授权的 Docker API 创建了特权容器并逃逸,他们就可以在宿主机上执行任意代码,窃取数据,植入后门,甚至完全破坏系统。
- 攻击者可以停止所有运行的容器,导致服务中断。
- 攻击者可能利用受感染的宿主机进行挖矿、DDoS 攻击、僵尸网络等恶意活动。
1 | IP=`hostname -i | awk -F. '{print $1 "." $2 "." $3 ".1"}' ` && timeout 3 bash -c "echo >/dev/tcp/$IP/2375" > /dev/null 2>&1 && echo "Docker Remote API Is Enabled." || echo "Docker Remote API is Closed." |
内核漏洞
CVE-2016-5195 DirtyCow 逃逸
执行 uname -r 命令,如果在 2.6.22 <= 版本 <= 4.8.3 之间说明可能存在 CVE-2016-5195 DirtyCow 漏洞。
CVE-2020-14386
执行 uname -r 命令,如果在 4.6 <= 版本 < 5.9 之间说明可能存在 CVE-2020-14386 漏洞。
CVE-2022-0847 DirtyPipe 逃逸
执行 uname -r 命令,如果在 5.8 <= 版本 < 5.10.102 < 版本 < 5.15.25 < 版本 < 5.16.11 之间说明可能存在 CVE-2022-0847 DirtyPipe 漏洞
漏洞利用
详细的漏洞利用可以去补wiki系列和这篇文章
剩下的不做详细叙述