Docker 给你不一样的渗透体验
我们在渗透测试的时候,经常需要去配置一些环境,下载一些特别不容易的各种支持库。尤其是伟大的防火墙各种拦截的情况下,我们做相关的工作会花费大量的时间跟精力。那么这个时候有没有一种简单的方式来解决这个问题呢?这篇文章将会给大家介绍能实现安全人员最梦寐以求的一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行的容器——Docker
Docker is a set of platform as a service (PaaS) products that use OS-level virtualization to deliver software in packages called containers.——Wikipedia,所以想要搞懂Docker我们必须先从container(容器)开始说起。
一 、认识容器
1.1 什么是容器?
容器镜像是轻量的、可执行的独立软件包?,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
容器化软件在任何环境中都能够始终如一地运行,不依赖于任何语言、框架包括系统。
容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
1.2 图解物理机、虚拟机与容器
关于虚拟机与容器的对比在后面会详细介绍到,这里只是通过网上的图片加深大家对于物理机、虚拟机与容器这三者的理解。
物理机
虚拟机
容器
容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。
一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。
二、那么Docker又是什么呢
2.1 什么是Docker?
说实话关于Docker是什么并太好说,下面我通过四点向你说明Docker到底是个什么东西。
Docker 是世界领先的软件容器平台。
Docker?使用 Google 公司推出的 Go 语言 进行开发实现, 是?linux 容器的一种封装,提供简单易用的容器使用接口,接口相当简单,用户可以方便的创建、销毁容器,属于操作系统层面的虚拟化技术。
Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
2.2 Docker应用场景
? 使用Docker容器开发,测试,部署服务
? 创建隔离的运行环境
? 搭建测试环境
? 构建多用户的平台即服务基础设施
? 提供软件即服务应用程序
? 高性能,多规模的宿主机部署
2.3 Docker容器的特点
轻量
在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
标准
Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。
安全
Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。
2.4 为什么要用Docker
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高。无论你在用awvs扫漏洞还是用御剑扫后台,妈妈再也不用担心内存不够啦。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
一致的运行环境
Docker的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题。
持续交付和部署
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。安全人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署。正如分布式扫描器的部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。
比如渗透测试人员去做内网测试就可以很轻易的将在一个平台上运行的应用,迁移到甲方爸爸指定的平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
三、Docker基本概念
Docker 包括三个基本概念:
镜像(Image)
容器(Container)
仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。
3.1 镜像(Image)——一个特殊的文件系统
操作系统分为内核和用户空间。对于Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。
镜像构建时,充分利用 Union FS的技术,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
分层存储的特征还使得镜像的复用、定制变得更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
3.2 容器(Container)——镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
容器不应该向其存储层内写入任何数据?,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。
3.3 仓库(Repository)——集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是,?如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。
一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
用户可以使用Docker Registry公开服务和本地搭建私有 Docker Registry免费上传、下载公开的镜像,可能提供收费服务供用户管理私有镜像及足以支持 docker 命令 Docker Registry API 的服务端等。
这是Docker中非常重要的三个基本概念,理解了这三个概念,我们就对 Docker 的整个生命周期有了比较深的了解了。
四、渗透测试中docker的使用
4.1 渗透工具
很多安全工具的部署,用 Docker 可以一键安装,非常方便,比如 Kali 可以这样去安装:
Metasploit 可以这样去安装:
是不是非常方便?随时随地,用后即删,还有很多渗透工具就不一一列举了,同学们可以自行去发现。
4.2 搭建靶机环境
Docker 是近两年来十分流行的开源容器引擎,因此也出现了很多使用 Docker 容器搭建的靶机环境供新手学习和使用。
以Vulhub为例:
这里以 struts 环境为例,打开 struts2 下的 s2-016 目录
这时访问 就可以看到环境已经搭建好了。
真的是节省了我们大把时间!
测试结束后,我们结束部署
五、最后聊聊docker的安全性
打算入坑 Docker 的同学可以关注这份 Docker 安全部署指南:
GitHub - GDSSecurity/Docker-Secure-Deployment-Guid...
(
这份指南罗列了 Docker 在部署上如果不注意可能会出现的严重安全问题。对这块攻击感兴趣的也可以了解下。
Docker 是非常棒的轻量级虚拟化隔离解决方案,但还不是真正的虚拟机,所以安全上会有不少特别的学问
Docker 本身在部署上如果没做好,是可以黑掉实体机的,还可以恶意操作 Docker 的一些部署行为。
比如之前研究过 Docker 集群管理里的 2375/2376 端口,如果可以被外网访问到,就糟糕了,如列出所有 images:
之后就可以执行ssh pub key 注入等等一系列 Docker 的操作指令,邪恶点可以写个 Docker 蠕虫传播起来。
也许会有那么一天,Docker 蠕虫 / 勒索事件爆发。Docker安全,从安全部署习惯开始!
SSRF漏洞攻击原理及防御方案
揭秘|让企业55%的潜藏数据「分类」呈现,需几步?
从Gartner报告探究数字化转型破局之道
医疗行业数据安全的主要风险和应对分析
Web中间件漏洞之Apache篇