(更新)从零开始利用docker搭建CTFd动态独立靶机的靶场

更新

由于CTFd版本和ctfd-whale版本更新,以下的配置可能会出现不成功的情况,鉴于此,做出以下更新,请移步到以下链接
CTFd动态靶机靶场搭建

一、前言

1.最近准备毕业设计,准备搭建CTFd动态独立靶机的靶场(ctfd+ctfd-whale)
2.动态独立靶机:每做一道题,就会自动生成一个虚拟题目环境,每一个环境刚刚生成的时候都是崭新的,且能为每个队伍生成一个独一无二的flag,防止flag分享作弊的行为
3.官方教程:https://www.zhaoj.in/read-6333.html
4.部分参考赵师傅fjh1997师傅博客

二、服务器

1.准备一台具有公网IP的服务器
2.镜像采用CentOs 7.3,方便环境安装

三、安装、设置环境

(一)、安装一切需要安装的环境,这里我是centos的镜像,直接可以用yum源安装,首先更新yum源

yum update

在这里插入图片描述

yum install -y git nginx mariadb mariadb-server Mysql-python python-pip gcc  python-devel yum-utils device-mapper-persistent-data lvm2 epel-release

在这里插入图片描述
(二)、配置mysql

1.开启mysql服务

systemctl start mariadb

2.初始化mysql,设置数据库root密码,首先enter然后问你是否设置root密码,输入y,然后设置密码,然后一直都是y

mysql_secure_installation

在这里插入图片描述
在这里插入图片描述
(三)、安装docker
1.首先换源:

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在这里插入图片描述
2.查看并选择合适的docker版本

yum list docker-ce --showduplicates | sort -r

在这里插入图片描述
3.安装docker

yum -y install docker-ce-17.12.1.ce

在这里插入图片描述
4.DaoCloud配置docker镜像源加速

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

在这里插入图片描述
5.查看是否安装成功

docker --version

在这里插入图片描述
7.启动docker

systemctl start docker

(四)、安装docker-compose
1.三种安装方式:直接下载、pip安装、离线安装,如果直接下载慢可以用pip安装,pip安装也慢直接用离线安装,但是建议前两种方法
直接下载:

# 下载docker compose
curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加可执行权限
chmod +x /usr/local/bin/docker-compose
# 将文件copy到 /usr/bin/目录下
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看版本
docker-compose --version

在这里插入图片描述
pip安装:
1.更新pip

pip install --upgrade pip

在这里插入图片描述
2.安装docker-compose

pip install docker-compose 

可能出现的错误
在这里插入图片描述
3.解决方法:直接用pip3安装

yum install python3-pip

在这里插入图片描述
4.使用pip3安装docker-compose即不会发生以上问题

pip3 install docker-compose

在这里插入图片描述
5.查看是否安装成功

docker-compose --version

在这里插入图片描述
6.设置权限:

chmod +x /usr/local/bin/docker-compose

在这里插入图片描述
(五)、安装frp
1.下载frp并安装

cd
wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
tar -zxvf frp_0.29.0_linux_amd64.tar.gz
cd frp_0.29.0_linux_amd64
cp systemd/* /etc/systemd/system/
mkdir /etc/frp
cp frpc.ini  frps.ini /etc/frp/
cp frpc  frps /usr/bin/
chmod a+x /usr/bin/frpc /usr/bin/frps
systemctl enable frps

在这里插入图片描述
2.编辑frps.ini

vim /etc/frp/frps.ini

内容如下:

[common]
bind_port = 7897
bind_addr = 0.0.0.0
token = thisistoken

3.启动frps系统服务

systemctl start frps

4.配置docker镜像加速:部署下阿里云的docker加速器:https://help.aliyun.com/document_detail/60750.html
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
5.编辑frpc.ini
修改/etc/frp/frpc.ini的配置文件

vim /etc/frp/frpc.ini
[common]
server_addr = 172.17.0.1
server_port = 7897
token=thisistoken

再修改/frp_0.29.0_linux_amd64/frpc.ini

[common]
server_addr = 172.17.0.1 # 这里填写宿主机ifconfig之后docker0的ip,因人而异,不要一模一样填
server_port = 7897
token=thisistoken
admin_addr = 172.17.0.2 #这里首先指定IP地址
admin_port = 7400
log_file = ./frps.log

6.创建网络并启动frpc容器并配置frpc.ini

docker network create ctfd_frp-containers
docker run  -d -v ~/frp_0.29.0_linux_amd64/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp" 

在这里插入图片描述
7.创建网络frpcadmin用于ctfd容器和frpc容器通信

docker network create frpcadmin 
docker network connect frpcadmin id # <frpc容器名或者ID> 
#将frpc和ctfd容器单独连接到网络frpcadmin,注意要等容器创建好之后再连接,因此ctfd将在稍后连接

8.docker ps查看刚刚创建的frp容器id,将frp容器加入frpcadmin,重启docker服务

docker network connect frpcadmin b05cafb1b224 
systemctl restart docker

在这里插入图片描述

9.查看frpcadmin网络的连接情况并记录frpc容器的网络IP

docker network inspect frpcadmin 

在这里插入图片描述

四、下载安装CTFd和CTFd-whale插件

1.下载靶场和插件

git clone https://github.com/CTFd/CTFd.git
cd CTFd/
git reset 6c5c63d667a17aec159c8e26ea53dccfbc4d0fa3 --hard #回滚到当前教程适合的版本
cd CTFd/plugins #打开ctfd插件目录
git clone https://github.com/glzjin/CTFd-Whale.git ctfd-whale #确保插件文件夹小写
cd ctfd-whale
git reset 5b32f457e9f56ee9b2b29495f4b3b118be3c57bd --hard #回滚到当前教程适合的版本
cd ../.. #返回ctfd主目录
vim docker-compose.yml

在这里插入图片描述
2.配置docker-compose.yml

version: '2.2'

services:
  ctfd:
    build: .
    user: root
    restart: always
    ports:
      - "8000:8000" #第一个是访问ctfd的端口,第二个是docker端口映射出去的端口
    environment:
      - UPLOAD_FOLDER=/var/uploads
      - DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd
      - REDIS_URL=redis://cache:6379
      - WORKERS=1
      - LOG_FOLDER=/var/log/CTFd
      - ACCESS_LOG=-
      - ERROR_LOG=-
    volumes:
      - .data/CTFd/logs:/var/log/CTFd
      - .data/CTFd/uploads:/var/uploads
      - .:/opt/CTFd:ro
      - /var/run/docker.sock:/var/run/docker.sock #添加这句即可,别的基本按照官方的不用动
    depends_on:
      - db
    networks:
        default:
        internal:

  db:
    image: mariadb:10.4.12 #这里改成10.4.12,10.4.13会出错
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=ctfd
      - MYSQL_USER=ctfd
      - MYSQL_PASSWORD=ctfd
      - MYSQL_DATABASE=ctfd
    volumes:
      - .data/mysql:/var/lib/mysql
    networks:
        internal:
    # This command is required to set important mariadb defaults
    command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]

  cache:
    image: redis:4
    restart: always
    volumes:
    - .data/redis:/data
    networks:
        internal:

networks:
    default:
    internal:
        internal: true

3.改Dockerfile为以下来使用豆瓣源or阿里源:
进入CTFd目录 vim Dockerfile ,复制以下内容

FROM python:3.6-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&\
    apk update && \
    apk add python3 python3-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev g++
RUN adduser -D -u 1001 -s /bin/bash ctfd
WORKDIR /opt/CTFd
RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
RUN pip3 config set global.index-url https://pypi.doubanio.com/simple
RUN pip3 config set install.trusted-host pypi.doubanio.com
COPY requirements.txt .
RUN pip install -r requirements.txt -i  https://pypi.doubanio.com/simple
COPY . /opt/CTFd
RUN for d in CTFd/plugins/*; do \
      if [ -f "$d/requirements.txt" ]; then \
        pip install -r $d/requirements.txt -i  https://pypi.doubanio.com/simple; \
      fi; \
    done;
RUN chmod +x /opt/CTFd/docker-entrypoint.sh
RUN chown -R 1001:1001 /opt/CTFd
RUN chown -R 1001:1001 /var/log/CTFd /var/uploads
USER 1001
EXPOSE 8000
ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]

4.在CTFd目录qiurements.txt添加:banal==0.4.2
在这里插入图片描述~~

5.构建启动镜像

docker-compose build

在这里插入图片描述
在这里插入图片描述
6.启动镜像

docker-compose up -d

在这里插入图片描述

7.将ctfd连接frpcadmin网络
docker ps查看ctfd的ID
在这里插入图片描述

docker network connect frpcadmin 8fc7550bc51f 

在这里插入图片描述
8.查看是否加入成功docker network inspect frpcadmin
在这里插入图片描述
9.访问公网ip:8000端口即可
在这里插入图片描述

五、配置平台

1.注册完admin账号之后点击
在这里插入图片描述
2.填写相关参数,注意要在template里面写上frpc.ini的内容,里面domain填写自己的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.配置完添加题目
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
5.测试,创建完点击,不出意外点击创建环境就能访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述6.靶机管理,查看flag
在这里插入图片描述

7.docker查看部署实例
在这里插入图片描述

四、问题报错以及解决办法

  1. frpc日志报错:
    如果日志像下方这样,那么就是网络没有配置好
    在这里插入图片描述

解决方案:
仔细配置网络,网络配置的要求如下:
● 将ctfd_frpc_1,frp-docker-for-ctfd-whale_frps_1,ctfd_ctfd_1这三个容器加入到ctfd_frp网络中
● 这三个容器对应的IP如下:
○ ctfd_ctfd_1:172.1.0.2
○ ctfd_frpc_1:172.1.0.3
○ frp-docker-for-ctfd-whale_frps_1:172.1.0.4

docker network connect --ip 172.1.0.3 ctfd_frp ctfd_frpc_1
docker network connect --ip 172.1.0.4 ctfd_frp frp-docker-for-ctfd-whale_frps_1
docker restart ctfd_frpc_1 frp-docker-for-ctfd-whale_frps_1

重启完成之后再查看一下ctfd_frp网络

docker network inspect ctfd_frp

如果还是不行,灵活使用docker 的logs功能,查看是什么问题报错
docker logs <容器ID或名称>

2.Dockerfile的gevent报错
如果是以下报错,可以通过修改版本号解决
在这里插入图片描述在这里插入图片描述

解决方案:
其他Dockerfile在构建的时候可能会出现gevent构建不成功的问题,有以下几种解决办法:

  1. 将镜像源替换为清华源
  2. 替换gevent版本
  3. 不指定gevent版本号
    在CTFd目录下,修改requirements.txt的gevent
    然后 docker-compose down 再启动 docker-compose up -d 不出意外应该就能解决问题

3.Dockerfile的world模块报错
在这里插入图片描述
解决方案:
将Dockerfile中的python和python-dev删掉,或者修改成python2或python3,python2-dev或python3-dev都可以

4.构建的时候,ctfd镜像无法启动
在这里插入图片描述

解决方案:
将docker-entrypoint.sh第一行修改为:
#!/bin/bash
在这里插入图片描述

修改后重新docker-compose up -d即可

4.ctfd_ctfd_1容器一直在重启:
ctfd_ctfd_1日志报错如下
在这里插入图片描述
解决方法:
出现时区问题,因此在requirements.txt中添加如下:
tzlocal==2.1

5.ctf_frpc_1容器一直重启

解决方案:
仔细配置网络,网络配置的要求如下:
● 将ctfd_frpc_1,frp-docker-for-ctfd-whale_frps_1,ctfd_ctfd_1这三个容器加入到ctfd_frp网络中
● 这三个容器对应的IP如下:
○ ctfd_ctfd_1:172.1.0.2
○ ctfd_frpc_1:172.1.0.3
○ frp-docker-for-ctfd-whale_frps_1:172.1.0.4

docker network connect --ip 172.1.0.3 ctfd_frp ctfd_frpc_1
docker network connect --ip 172.1.0.4 ctfd_frp frp-docker-for-ctfd-whale_frps_1
docker restart ctfd_frpc_1 frp-docker-for-ctfd-whale_frps_1

重启完成之后再查看一下ctfd_frp网络

docker network inspect ctfd_frp

如果还是不行,灵活使用docker 的logs功能,查看是什么问题报错
docker logs <容器ID或名称>
如果是以下报错
在这里插入图片描述

则重新配置frpc,编辑/CTFd/frpc/frpc.ini

[common]
token = randomme
server_addr = 172.1.0.4
server_port = 6490
pool_count = 200
tls_enable = true

admin_addr = 172.1.0.3 #这里千万千万别忘加,之前要被搞气死
admin_port = 7400

然后运行

docker restart ctfd_frpc_1

6.MySQL容器反复重启
在这里插入图片描述

解决方法:
因为当前目录下的.data文件中的MySQL日志与容器版本不匹配
解决方法是将.data文件删除,重新构建镜像

7.docker容器无法启动或者frp端口无法映射
如果docker容器无法启动或者frp端口无法映射可以进容器检查,确保docker api填写正确,如docker-compose.yml中写的unix:///var/run/docker.sock
你也可以使用端口形式的api如官方示例:可以用IP:端口指定API
docker容器无法启动问题
进入容器检查:
docker exec -it <ctfd容器id> sh
/opt/CTFd# python

>>>import docker
>>>client=docker.DockerClient(base_url="unix:///var/run/docker.sock")
>>>client.images.list()

如果api正确会列出所有镜像
frp端口无法映射问题
其实检查可以顺便检查一下上面的,因为都在ctfd容器内 docker exec -it <ctfd容器id> sh

docker exec -it <ctfd容器id> sh
/opt/CTFd# python
>>>import requests
>>>requests.get("http://172.1.0.3:7400/api/reload")//即frp api的地址

返回
<Response [200]> #表示成功
如果frpc还是出现如下问题

requests.exceptions.ConnectionError: HTTPConnectionPool(host='172.1.0.3', port=7400): Max retries exceeded with url: /api/reload (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f8df919f850>: Failed to establish a new connection: [Errno 111] Connection refused'))

则重新配置frpc,编辑/CTFd/frpc/frpc.ini

[common]
token = randomme
server_addr = 172.1.0.4
server_port = 6490
pool_count = 200
tls_enable = true

admin_addr = 172.1.0.3 #这里千万千万别忘加,之前要被搞气死
admin_port = 7400

然后运行docker restart ctfd_frpc_1(这里再看frpc.ini会发现内容更新了,admin配置没了,不用担心)
再进容器检查requests.get("http://172.1.0.3:7400/api/reload")应该就可以了<Response [200]>

  • 23
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值