因CTF比赛需要和设备闲置 学习搭建Docker靶场

搭建环境

  • OS: Ubuntu 16.04
  • 设备类型: VM
  • 宿主机:ESXI 6.5

开始

卸载原有Docker

$ apt-get remove docker \
docker-engine \
docker.io

安装

Ubuntu 16.04 + 上的 Docker CE 默认使用overlay2存储层驱动,无需手动配置。

使用 APT 安装

由于apt源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。

$ apt-get update -y && apt-get upgrade -y

$ apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

鉴于国内网络问题,建议使用国内源,官方源请在注释中查看。
为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

然后,我们需要向 source.list 中添加 Docker 软件源

$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"


# 官方源
# $ sudo add-apt-repository \
# "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
# $(lsb_release -cs) \
# stable"

以上命令会添加稳定版本的 Docker CE APT 镜像源,如果需要测试或每日构建版本的 Docker CE 请将 stable 改为 test 或者 nightly。

安装 Docker CE

更新 apt 软件包缓存,并安装 docker-ce:

$ sudo apt-get update

$ sudo apt-get install docker-ce

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
$ sudo systemctl start 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

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/


若能正常输出以上信息,则说明安装成功。

参考
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镜像  
docker pull nginx
//拉取php镜像
docker pull php:7.1.0-fpm
//拉取mysql镜像
docker pull mysql:5.7.18

注意!
mysql务必加上版本号 否则会拉取MySQL8.0的镜像下来导致后面各种奇奇怪怪的错

第三步:启动基础环境

//启动php  
docker run -p 9000:9000 --name php -v /opt/docker/www/:/var/www/html/ --privileged=true -d php:7.1.0-fpm
//启动nginx
docker run -p 80:80 --name nginx -v /opt/docker/www/:/usr/share/nginx/html/ -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d --privileged=true -d nginx
//启动mysql
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql5 -v /opt/docker/mysql-5.7.18/data:/var/lib/mysql -d mysql:5.7.18

命令详解
-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

[index.php]
<?php
phpinfo();
?>

然后在宿主机目录/opt/docker/nginx/conf.d/新建index.conf
内容如下

[/opt/docker/nginx/conf.d/index.conf]
server {
listen 80;
#server_name www.test.com;
root /usr/share/nginx/html/;#nginx映射的地址
location / {
index index.html index.htm index.php;
autoindex off;
}
location ~ \.php(.*)$ {
root /var/www/html/;#php映射的地址 同时定义为$document_root
fastcgi_pass 172.17.0.2:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}

然后重启nginx docker

docker restart nginx

访问10.16.11.231【你部署Docker的机器的地址】查看是否输出PHPINFO

如图即为成功

第四步:安装&部署靶机

以DeDeCMS为例
先拉取有dedemcms的镜像

docker pull chengxulvtu/dedecms:utf8_full_5.7  
docker run -d --name dede-lantinghe -p 8081:80 -v /opt/docker/www/dedecms:/var/www/html 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

COPY src/ /var/www/html/

RUN rm /var/www/html/index.html \
&& chmod -R 755 /var/www/html

解释下每行命令

FROM <image>或 
FROM <image>:<tag>

在Dockerfile中第一条非注释INSTRUCTION一定是FROM,它决定了以哪一个镜像作为基准,<image>首选本地是否存在,如果不存在则会从公共仓库下载(当然也可以使用私有仓库的格式)。这里引用了eboraas最新的apache-php集成环境

COPY <src> <dest>

将文件<src>拷贝到container的文件系统对应的路径<dest>下。
其中
<src>可以是文件、文件夹,对于文件和文件夹<src>必须是在Dockerfile的相对路径下,即只能是相对路径且不能包含../path/
<dest>只能是容器中的绝对路径。如果路径不存在则会自动级联创建,根据你的需要是<dest>里是否需要反斜杠/,习惯使用/结尾从而避免被当成文件。
ADD命令相比,ADD支持远程URL获取文件,但官方认为是strongly discouraged,建议使用wgetcurl代替。
COPY的语法与功能与ADD相同,只是不支持上面讲到的<src>是远程URL、自动解压这两个特性,但是Best Practices for Writing Dockerfiles建议尽量使用COPY,并使用RUNCOPY的组合来代替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 ["executable", "param1", "param2"]

RUN指令会在当前镜像的顶层执行任何命令,并commit成新的(中间)镜像,提交的镜像会在后面继续用到。
另外RUN命令的格式有两种写法。
shell格式,相当于执行/bin/sh -c "<command>"
RUN apt-get install vim -y
exec格式,不会触发shell,所以$HOME这样的环境变量无法使用,但它可以在没有bash的镜像中执行,而且可以避免错误的解析命令字符串:

RUN ["apt-get", "install", "vim", "-y"]

RUN ["/bin/bash", "-c", "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的镜像了