Unc1e
Unc1e
手把手教你用Docker搭建CTF靶场环境

安装Docker

略,参考CentOS Docker 安装来操作即可

卸载旧版本

注意:需要开启iptables

重启docker

编写Dockerfile

寻找初始环境

Dockerfile里的第一行,就是你CTF题的初始环境。如下所示,

代表的就是从hub.docker.com/r/drupalci/php-5.5.38-apache拉的镜像作为初始环境。
那这个初始环境到哪里去找呢?
只需要在https://hub.docker.com里搜索合适的版本即可。此处要注意必须写出tag,也就是上面冒号后面的dev,它指明了镜像里中间件的版本,常见的taglatest

调整环境参数

有时候,在不同的环境下,我们需要更改中间件的配置,如Apache的配置文件apache2.conf、PHP的配置文件php.ini,那么就需要在Dockerfile里进行相应的编写。
下面给出常用的命令写法,更多细节请移步=>如何用Dockerfile构建镜像
Dockerfile样例

image.png

图片来自周旭龙的文章:你必须知道的Dockerfile

为什么需要start.sh呢?这就需要提醒了:Dockerfile只定义了软件开机后需要执行的命令/操作,里面的操作是有限的
start.sh样例

配置启动命令

有时,由于各种特殊的需要:如实现动态flag,需要在docker外部指定flag,因此就需要了解docker-compose.yml的写法。
要实现动态flag,docker-compose.yml必须和Dockerfile相互配合。此处我以赵师傅做的bytectf_2019_babyblog的镜像来做说明。

docker-compose.yml

docker-compose.yml是 模板文件,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。

下面是一个简单的例子——只有1个容器。

Dockerfile

关于如何实现动态flag:相信你已经看出来了——两个文件都只需要看最后一行。首先在docker-compose.yml 里设定一个环境变量(environment),变量名叫做FLAG,就是我们的动态flag值;而下一步Dockerfile中的命令CMD echo $FLAG >> /flag,将这个FLAG写入了/flag文件。
对于运维者来说,要在某个CTF题中实现动态flag的效果,只需要对docker-compose.yml进行调整,再运行docker-compose up -d即可,完全不需要改动Dockerfile. 这在某些场景(CTF靶场、AWD)中是很有用的。
不过,如果你还是不明白docker-composedocker之间的关系,那么请你移步=>Docker 微服务教程 – 阮一峰的网络日志,我将其总结概括如下:

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。

常见的docker-compose运维命令如下

测试Docker镜像

打包镜像创建完上面的Dockerfile后,在当前目录执行以下命令进行镜像的构建

稍等片刻,运行docker images指令,就能看到名为web_ctf_puzzle,TAG为test1的镜像了。
需要提醒的是:有些机构收题时要求制作者提供可用的docker镜像压缩包(tar包),可能的原因呢,一方面是考虑到安装后的东西不一定跟制作者制作时的东西一模一样,另一方面可能是由于安装时断外网。不过,制作docker镜像压缩包并不复杂,只需要按以下命令来操作即可

Docker之间的互通

很多时候,需要不同的docker之间能够相互访问(互通),这就需要进行相应的配置。下面介绍两种个人常用的互通方案

法一、docker run –links

在单独的docker运行命令中,加入--links选项

docker run --link可以用来链接2个容器,使得 发起链接的容器 和 接收链接的容器 之间可以互相通信。当然--link还有其它作用,我们按下不表。

例如,我先用下面命令起了一个redis的容器:

接着,我又看向手上一个PHP的容器,想让它跟redis互通,只需要运行如下的命令即可

这样,就实现了:在容器web中,通过别名aliasredis来访问容器redis。它的原理也很容易理解:通过给/etc/hosts中加入名称和IP的解析关系来实现。如果你打开容器web/etc/hosts,就能看到了类似下面的内容

image.png

最后,需要说明的是

docker官方已不推荐使用docker run –link来链接2个容器互相通信,随后的版本中会删除–link,但了解其原理,对如何使2个容器之间互相通信还是有帮助的。

法二、docker-compose.yml

docker-compose.yml文件中,指定link选项,即可完成容器的互连,例如下面代码中的16~17行

docker-compose.yml 容器互通示例(有删减),完整题目地址github.com/hi-unc1e/some_scripts/tree/master/puzzles/uploadTest

运行测试

下面就开始运行docker
启动镜像的命令

要想成功构建docker,常需要一次次的测试与修改,这里是一些操作的提示
要想控制docker(也就是进入docker的shell),需要将下面命令中019dfb3e357b改为你运行docker ps后 CONTAINER ID。相信你一定明白我在说什么 ;)

references

首页      WEB安全      手把手教你用Docker搭建CTF靶场环境

发表评论

textsms
account_circle
email

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Unc1e

手把手教你用Docker搭建CTF靶场环境
手把手教你用Docker搭建CTF靶场环境
扫描二维码继续阅读
2020-11-08
%d 博主赞过: