Ubuntu 16.04搭建适用于CTF的Docker靶场
因CTF比赛需要和设备闲置 学习搭建Docker靶场
搭建环境
- OS: Ubuntu 16.04
- 设备类型: VM
- 宿主机:ESXI 6.5
开始
卸载原有Docker
apt-get remove docker \ |
安装
Ubuntu 16.04 + 上的 Docker CE 默认使用overlay2
存储层驱动,无需手动配置。
使用 APT 安装
由于apt
源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。
apt-get update -y && apt-get upgrade -y |
鉴于国内网络问题,建议使用国内源,官方源请在注释中查看。
为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - |
然后,我们需要向 source.list 中添加 Docker 软件源
sudo add-apt-repository \ |
以上命令会添加稳定版本的 Docker CE APT 镜像源,如果需要测试或每日构建版本的 Docker CE 请将 stable 改为 test 或者 nightly。
安装 Docker CE
更新 apt 软件包缓存,并安装 docker-ce:
sudo apt-get update |
Tips
使用脚本自动安装
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。
启动 Docker CE
sudo systemctl enable docker |
建立 docker 用户组
默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立 docker 组:
sudo groupadd docker |
将当前用户加入 docker 组:
sudo usermod -aG docker $USER |
退出当前终端并重新登录,进行如下测试。
测试 Docker 是否安装正确
docker run hello-world |
若能正常输出以上信息,则说明安装成功。
参考
https://yeasy.gitbooks.io/docker_practice/install/ubuntu.html
搭建
先搭建一个WEB容器练练手 理解下端口映射的原理
操作过程:
第一步:准备工作
- 根目录: /opt/docker
- 网站根目录:/opt/docker/www
- nginx相关目录:/opt/docker/nginx/conf.d
第二步:安装php7,nginx,mysql
//拉取nginx镜像 |
注意!
mysql务必加上版本号 否则会拉取MySQL8.0的镜像下来导致后面各种奇奇怪怪的错
第三步:启动基础环境
//启动php |
命令详解
-v /opt/docker/www/:/var/www/html/:把宿主机(Ubuntu)的/opt/docker/www/挂载到了docker的/var/www/html/
–name php 命名为php
-p 80:80 把宿主机的80映射到docker的80端
-e MYSQL_ROOT_PASSWORD=123456 设置MySQL密码为123456
测试环境是否正确
编辑文件/opt/docker/www/index.php
<?php |
然后在宿主机目录/opt/docker/nginx/conf.d/
新建index.conf
内容如下
server { |
然后重启nginx
docker
docker restart nginx |
访问10.16.11.231【你部署Docker的机器的地址】查看是否输出PHPINFO
如图即为成功
第四步:安装&部署靶机
以DeDeCMS为例
先拉取有dedemcms的镜像
docker pull chengxulvtu/dedecms:utf8_full_5.7 |
然后访问10.16.11.231:8081
进行常规安装即可
然后kill掉该docker并rm掉,FTP连接到宿主机找到安装好dedecms的目录/opt/docker/www/dedecms
,在目录下创建一个新的文件夹(这里我用的src
)并把dedecms的所有文件移入src
文件夹内,再在/opt/docker/www/dedecms
新建一个Dockerfile
文件,操作后的/opt/docker/www/dedecms
目录应该类似这样
编辑Dockerfile
文件内容如下
FROM eboraas/apache-php:latest |
解释下每行命令
FROM <image>或 |
在Dockerfile中第一条非注释INSTRUCTION一定是FROM,它决定了以哪一个镜像作为基准,<image>
首选本地是否存在,如果不存在则会从公共仓库下载(当然也可以使用私有仓库的格式)。这里引用了eboraas
最新的apache-php
集成环境
COPY <src> <dest> |
将文件<src>
拷贝到container
的文件系统对应的路径<dest>
下。
其中<src>
可以是文件、文件夹,对于文件和文件夹<src>
必须是在Dockerfile的相对路径下,即只能是相对路径且不能包含../path/
。<dest>
只能是容器中的绝对路径。如果路径不存在则会自动级联创建,根据你的需要是<dest>
里是否需要反斜杠/
,习惯使用/
结尾从而避免被当成文件。
与ADD
命令相比,ADD
支持远程URL获取文件,但官方认为是strongly discouraged
,建议使用wget
或curl
代替。COPY
的语法与功能与ADD
相同,只是不支持上面讲到的<src>
是远程URL、自动解压这两个特性,但是Best Practices for Writing Dockerfiles
建议尽量使用COPY
,并使用RUN
与COPY
的组合来代替ADD
,这是因为虽然COPY
只支持本地文件拷贝到container
,但它的处理比ADD
更加透明,建议只在复制tar
文件时使用ADD
,如ADD trusty-core-amd64.tar.gz /
,会先自动解压内容再COPY
到在容器的/
目录下。
在本例中
COPY src/ /var/www/html/ |
复制相对于Dockerfile
文件位置的src/
下的所有内容到/var/www/html/
下
RUN <commnad> |
RUN
指令会在当前镜像的顶层执行任何命令,并commit
成新的(中间)镜像,提交的镜像会在后面继续用到。
另外RUN
命令的格式有两种写法。shell
格式,相当于执行/bin/sh -c "<command>"
:RUN apt-get install vim -y
exec
格式,不会触发shell,所以$HOME
这样的环境变量无法使用,但它可以在没有bash的镜像中执行,而且可以避免错误的解析命令字符串:
RUN ["apt-get", "install", "vim", "-y"] |
功能与shell风格相同
配置Flag项
进入src
目录,配置你需要的Flag
项目,然后就可以打包了
第五步:打包【制作】CTF用镜像
打包成镜像
创建完上面的Dockerfile
后在当前目录执行
docker build -t ctf:list1 . |
命令原型
docker build [OPTIONS] PATH | URL | - |
稍等片刻就可以运行docker images
指令并能看到名为ctf
,TAG
为list1的镜像了