【CTFd搭建&虚拟机版本下载】CTFd动态靶机搭建(详细总结&虚拟机版本提供下载)By:Lxxx

交流群:

文章首发于:https://www.xiinnn.com/article/33b63ea2.html

搭建动态靶机的CTFd中间需要踩得坑挺多,因此我这里创建了一个群聊用于交流。

加群方式:

群号:950951985

CTFd动态靶机搭建教程 - 图1

成品展示:

CTFd动态靶机搭建教程 - 图2

CTFd动态靶机搭建教程 - 图3

CTFd动态靶机搭建教程 - 图4

环境:

  • 主机:Ubuntu 20.10
    • 本篇文章使用的机器的IP:192.168.2.151
  • Docker版本:20.10.2
  • Docker-compose版本:1.25.0

搭建步骤:

系统环境配置:

安装vim:

  1. apt-get install vim

CTFd动态靶机搭建教程 - 图5

因为是官方源,所以会比较慢,后面会进行换源。

切换镜像源:

这里以Ubuntu20.10为例:ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

  1. vim /etc/apt/sources.list

将原有的内容删除,往source.list里面加入以下内容,加完之后保存退出。

  1. # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
  2. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy main restricted universe multiverse
  3. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy main restricted universe multiverse
  4. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy-updates main restricted universe multiverse
  5. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy-updates main restricted universe multiverse
  6. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy-backports main restricted universe multiverse
  7. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy-backports main restricted universe multiverse
  8. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy-security main restricted universe multiverse
  9. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy-security main restricted universe multiverse
  10. # 预发布软件源,不建议启用
  11. # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy-proposed main restricted universe multiverse
  12. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ groovy-proposed main restricted universe multiverse

注意:一定要更新一下镜像源!!(不然后面没法安装包)

  1. apt-get update

安装docker:

  1. apt-get install docker.io

CTFd动态靶机搭建教程 - 图6

输入y后回车

安装docker-compose:

  1. apt-get install docker-compose

CTFd动态靶机搭建教程 - 图7

同样按y后回车

安装git:

  1. apt-get install git

CTFd动态靶机搭建教程 - 图8

一般来说,安装过docker之后,git也已经安装好了,不过我们还是再确认一下。

docker镜像加速:

进入阿里云镜像服务官网:容器镜像服务 (aliyun.com)

根据下方教程配置自己的Docker静态加速器。

CTFd动态靶机搭建教程 - 图9

镜像地址每个人都不一样,根据每个人的情况设置。

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

下载CTFd:

这一个CTFd是赵师傅改写的,链接在下方。之所以要使用赵师傅改写的CTFd,是因为官方CTFd可能会与动态靶机插件ctf-whale冲突。

  1. git clone https://github.com/glzjin/CTFd.git

CTFd动态靶机搭建教程 - 图10

如果clone的过程中卡住了,可以尝试Ctrl+C将命令掐断,然后重新执行,实在不行的话,可以挂代理。

CTFd动态靶机搭建教程 - 图11

下载frpc:

下载frpc:

  1. wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz

同样的,如果clone的过程中卡住了,可以尝试Ctrl+C将命令掐断,然后重新执行,实在不行的话,可以挂代理。

将下载下来的frpc解压:

  1. tar -zxvf frp_0.29.0_linux_amd64.tar.gz

下载ctfd-whale:

地址:https://github.com/glzjin/CTFd-Whale

  1. git clone https://github.com/glzjin/CTFd-Whale.git

CTFd动态靶机搭建教程 - 图12

注意:这个时候要将CTFd-Whale文件夹重命名为小写。

  1. mv CTFd-Whale/ ctfd-whale

CTFd动态靶机搭建教程 - 图13

下载docker版本的frps:

地址:https://github.com/glzjin/Frp-Docker-For-CTFd-Whale

  1. git clone https://github.com/glzjin/Frp-Docker-For-CTFd-Whale

注意:将Frp-Docker-For-CTFd-Whale也重命名为小写

  1. mv Frp-Docker-For-CTFd-Whale/ frp-docker-for-ctfd-whale

CTFd动态靶机搭建教程 - 图14

CTFd环境配置:

接下来就开始配置CTFd的一些文件了!

Docker集群设置:

先初始化:

  1. docker swarm init

CTFd动态靶机搭建教程 - 图15

将刚刚初始化的这个集群加入到节点当中,命令执行后,返回的就是节点ID了,暂时不用管这个节点ID。

  1. docker node update --label-add='name=linux-1' $(docker node ls -q)

CTFd动态靶机搭建教程 - 图16

将ctfd-whale放入CTFd的插件目录中:

如下图所示:

CTFd动态靶机搭建教程 - 图17

  1. mv ctfd-whale/ CTFd/CTFd/plugins/

CTFd动态靶机搭建教程 - 图18

CTFd动态靶机搭建教程 - 图19

启动docker版本的frps及frps配置:

进入该目录:

  1. cd frp-docker-for-ctfd-whale/

启动该docker:

  1. docker-compose up -d

CTFd动态靶机搭建教程 - 图20

耐心等待镜像构建。

CTFd动态靶机搭建教程 - 图21

完成以后,可以使用docker ps查看是否正在运行。

这个时候我们查看一下frps的配置。

frps/frps.ini文件如下:

  1. [common]
  2. bind_port = 6490
  3. token = randomme

这里的token可以改也可以不改,一般也就不改了。

将frpc传入CTFd中:

这一步骤实际上就是:将frpc,frpc.ini,frpc_full.ini,LICENSE这四个文件放在CTFd/frpc文件夹中。

进入CTFd目录中,新建一个frpc文件夹

  1. cd CTFd/
  2. mkdir frpc

CTFd动态靶机搭建教程 - 图22

进入frpc的目录(frp_0.29.0_linux_amd64)

  1. cd ../frp_0.29.0_linux_amd64

将上述四个文件移动到frpc文件夹中

  1. mv frpc.ini ../CTFd/frpc/
  2. mv frpc_full.ini ../CTFd/frpc/
  3. mv frpc ../CTFd/frpc/
  4. mv LICENSE ../CTFd/frpc/

CTFd动态靶机搭建教程 - 图23

修改frpc.ini文件:

进入frpc目录中,修改frpc.ini文件

  1. [common]
  2. token = randomme
  3. server_addr = 172.1.0.4
  4. server_port = 6490
  5. pool_count = 200
  6. tls_enable = true
  7. admin_addr = 172.1.0.3
  8. admin_port = 7400

配置Dockerfile:

进入ctfd目录,将下方内容复制到Dockerfile中

  1. FROM python:3.7-alpine
  2. RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
  3. apk update && \
  4. apk add linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev #这里注意1
  5. RUN adduser -D -u 1001 -s /bin/bash ctfd
  6. WORKDIR /opt/CTFd
  7. RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
  8. COPY requirements.txt .
  9. RUN apk add gcc
  10. RUN apk add musl-dev
  11. RUN apk add libxslt-dev
  12. RUN apk add g++
  13. RUN apk add make
  14. RUN apk add libffi-dev
  15. RUN apk add openssl-dev
  16. RUN apk add libtool
  17. RUN pip install -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ #这里注意2
  18. COPY . /opt/CTFd
  19. RUN for d in CTFd/plugins/*; do \
  20. if [ -f "$d/requirements.txt" ]; then \
  21. pip install -r $d/requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ ; \
  22. fi; \
  23. done; #同样注意2
  24. RUN chmod +x /opt/CTFd/docker-entrypoint.sh
  25. RUN chown -R 1001:1001 /opt/CTFd
  26. RUN chown -R 1001:1001 /var/log/CTFd /var/uploads
  27. USER 1001
  28. EXPOSE 8000
  29. ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]

配置docker-compose.yml文件:

  1. version: '2.2'
  2. services:
  3. ctfd-nginx:
  4. image: nginx:1.17
  5. volumes:
  6. - ./nginx/http.conf:/etc/nginx/nginx.conf #这里注意
  7. user: root
  8. restart: always
  9. ports:
  10. #- "85:80" #我将这里注释掉了,这里通过nginx转发感觉速度访问速度会变慢,可能因为我的配置问题,多次尝试之后直接开8000端口访问不会对服务造成影响
  11. - "443:443"
  12. networks:
  13. default:
  14. internal:
  15. depends_on:
  16. - ctfd
  17. cpus: '1.00' #可改
  18. mem_limit: 150M #可改
  19. ctfd:
  20. build: .
  21. user: root
  22. restart: always
  23. ports:
  24. - "8000:8000" #这里原本没开端口,直接打开访问网站速度会加快
  25. environment:
  26. - UPLOAD_FOLDER=/var/uploads
  27. - DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd
  28. - REDIS_URL=redis://cache:6379
  29. - WORKERS=1
  30. - LOG_FOLDER=/var/log/CTFd
  31. - ACCESS_LOG=-
  32. - ERROR_LOG=-
  33. - REVERSE_PROXY=true
  34. volumes:
  35. - .data/CTFd/logs:/var/log/CTFd
  36. - .data/CTFd/uploads:/var/uploads
  37. - .:/opt/CTFd:ro
  38. - /var/run/docker.sock:/var/run/docker.sock #这里是添加的
  39. depends_on:
  40. - db
  41. networks:
  42. default:
  43. internal:
  44. frp:
  45. ipv4_address: 172.1.0.2
  46. cpus: '1.00' #可改
  47. mem_limit: 450M #可改
  48. db:
  49. image: mariadb:10.4
  50. restart: always
  51. environment:
  52. - MYSQL_ROOT_PASSWORD=ctfd
  53. - MYSQL_USER=ctfd
  54. - MYSQL_PASSWORD=ctfd
  55. volumes:
  56. - .data/mysql:/var/lib/mysql
  57. networks:
  58. internal:
  59. # This command is required to set important mariadb defaults
  60. command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]
  61. cpus: '1.00' #可改
  62. mem_limit: 750M #可改
  63. cache:
  64. image: redis:4
  65. restart: always
  66. volumes:
  67. - .data/redis:/data
  68. networks:
  69. internal:
  70. cpus: '1.00' #可改
  71. mem_limit: 450M #可改
  72. frpc:
  73. image: glzjin/frp:latest #赵师傅tql
  74. restart: always
  75. volumes:
  76. - ./frpc:/conf/ #这里注意
  77. entrypoint:
  78. - /usr/local/bin/frpc
  79. - -c
  80. - /conf/frpc.ini
  81. networks:
  82. frp:
  83. ipv4_address: 172.1.0.3 #记住此处
  84. frp-containers:
  85. cpus: '1.00' #可改
  86. mem_limit: 250M #可改
  87. networks:
  88. default:
  89. internal:
  90. internal: true
  91. frp:
  92. driver: bridge
  93. ipam:
  94. config:
  95. - subnet: 172.1.0.0/16
  96. frp-containers:
  97. driver: overlay
  98. internal: true
  99. ipam:
  100. config:
  101. - subnet: 172.2.0.0/16

配置requirements.txt

这里主要是修改gevent的版本号,原本是1.4.0的,我这边修改成了20.9.0

  1. Flask==1.1.1
  2. Werkzeug==0.16.0
  3. Flask-SQLAlchemy==2.4.1
  4. Flask-Caching==1.4.0
  5. Flask-Migrate==2.5.2
  6. Flask-Script==2.0.6
  7. SQLAlchemy==1.3.11
  8. SQLAlchemy-Utils==0.36.0
  9. passlib==1.7.2
  10. bcrypt==3.1.7
  11. six==1.13.0
  12. itsdangerous==1.1.0
  13. requests>=2.20.0
  14. PyMySQL==0.9.3
  15. gunicorn==19.9.0
  16. normality==2.0.0
  17. dataset==1.1.2
  18. mistune==0.8.4
  19. netaddr==0.7.19
  20. redis==3.3.11
  21. datafreeze==0.1.0
  22. python-dotenv==0.10.3
  23. flask-restplus==0.13.0
  24. pathlib2==2.3.5
  25. flask-marshmallow==0.10.1
  26. marshmallow-sqlalchemy==0.17.0
  27. boto3==1.10.39
  28. marshmallow==2.20.2
  29. gevent==20.9.0
  30. tzlocal==2.1
  31. jinja2<3.1.0

配置nginx:

在docker-compose.yml的目录下,新建一个nginx文件夹

  1. mkdir nginx

进入nginx文件夹

  1. cd nginx

创建一个文件http.conf,输入以下内容:

  1. worker_processes 4;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. # Configuration containing list of application servers
  7. upstream app_servers {
  8. server ctfd:8000;
  9. }
  10. server {
  11. listen 80;
  12. client_max_body_size 4G;
  13. # Handle Server Sent Events for Notifications
  14. location /events {
  15. proxy_pass http://app_servers;
  16. proxy_set_header Connection '';
  17. proxy_http_version 1.1;
  18. chunked_transfer_encoding off;
  19. proxy_buffering off;
  20. proxy_cache off;
  21. proxy_redirect off;
  22. proxy_set_header Host $host;
  23. proxy_set_header X-Real-IP $remote_addr;
  24. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  25. proxy_set_header X-Forwarded-Host $server_name;
  26. }
  27. # Proxy connections to the application servers
  28. location / {
  29. proxy_pass http://app_servers;
  30. proxy_redirect off;
  31. proxy_set_header Host $host;
  32. proxy_set_header X-Real-IP $remote_addr;
  33. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  34. proxy_set_header X-Forwarded-Host $server_name;
  35. }
  36. }
  37. }

保存后退出。

开始构建:

进入docker-compose.yml所在的文件目录下

  1. docker-compose up -d

CTFd动态靶机搭建教程 - 图24

耐心等待。。。

完成后应该是这个样子

CTFd动态靶机搭建教程 - 图25

配置网络:

我们先看一下现在的容器状态:

  1. docker ps -a

CTFd动态靶机搭建教程 - 图26

可以看到ctfd_frpc_1这个容器的状态是退出状态。

我们再看一下现在docker的网络:

  1. docker network ls

CTFd动态靶机搭建教程 - 图27

一会我们需要将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

查看一下ctfd_frp网络

  1. docker network inspect ctfd_frp

CTFd动态靶机搭建教程 - 图28

这个时候只有ctfd_ctfd_1这个容器是在ctfd_frp网络里的。

注意要指定IP:

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

然后重启一下这两个容器:

  1. docker restart ctfd_frpc_1 frp-docker-for-ctfd-whale_frps_1

CTFd动态靶机搭建教程 - 图29

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

  1. docker network inspect ctfd_frp

CTFd动态靶机搭建教程 - 图30

可以看到,这个时候,ctfd_frpc_1,frp-docker-for-ctfd-whale_frps_1,ctfd_ctfd_1这三个容器已经加入到ctfd_frp网络中

查看ctfd_frpc_1容器日志:

  1. docker logs ctfd_frpc_1

CTFd动态靶机搭建教程 - 图31

这样就算已经配置好了。

接下来就是ctfd-whale配置。

ctfd-whale配置:

在浏览器中访问IP:8000

我这台机器就是http://192.168.2.151:8000

CTFd动态靶机搭建教程 - 图32

这一块就是ctfd的前置配置,按照自己的需求配置一下就好了

网站初步配置完成之后,开始配置ctfd-whale插件。

设置方面,就按照赵总的配置就好了,我这边参考error师傅的。

属性 配置
Docker API URL unix://var/run/docker.sock
Frp API IP frpc的ip配置
Frp API Port frpc的端口配置
Frp Http Domain Suffix Docker API URL to connect(可填None)
Frp Http Port 80
Frp Direct IP Address 你的公网ip,本机即为127.0.0.1
Frp Direct Minimum Port 与之前frps最小端口呼应
Frp Direct Minimum Port 与之前frps最大端口呼应
Max Container Count 不超过最大-最小
Max Renewal Times 最大实例延时次数
Frp config template 填入frps的配置,只需填[common]
Docker Auto Connect Containers ctfd_frpc_1
Docker Dns Setting 可填机器内DNS,没有可填个外网DNS
Docker Swarm Nodes linux-1 与前面swarm集群呼应
Docker Multi-Container Network Subnet 内网题大子网ip配置/CIDR
Docker Multi-Container Network Subnet New Prefix 每个内网题实例的CIDR
Docker Container Timeout 单位为秒

其中Frp config template配置内容如下:

  1. [common]
  2. token = randomme
  3. server_addr = 172.1.0.4
  4. server_port = 6490
  5. pool_count = 200
  6. tls_enable = true
  7. admin_addr = 172.1.0.3
  8. admin_port = 7400

其他的按照下面这张图片配置就好

注意:

Frp Direct IP Address这个一定要修改成自己的IP,如果是云服务器就输入公网IP,如果是虚拟机那就输入虚拟机的IP。

CTFd动态靶机搭建教程 - 图33

添加一道题目:

添加的题目如下:

CTFd动态靶机搭建教程 - 图34

其中Docker image里就输入题目的tag就好了

测试开启题目:

CTFd动态靶机搭建教程 - 图35

CTFd动态靶机搭建教程 - 图36

可以看到,已经正确分配IP了

第一次获取题目要等一会,因为要拉题目镜像,等一会后就可以访问题目了。

CTFd动态靶机搭建教程 - 图37

在Docker里也可以看到相应的题目容器。

CTFd动态靶机搭建教程 - 图38

问题报错以及踩坑:

frpc日志报错:

报错:

如果日志像下方这样,那么就是网络没有配置好

CTFd动态靶机搭建教程 - 图39

解决方案:

仔细配置网络,网络配置的要求如下:

  • 将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的日志功能:

  1. docker logs <容器ID或名称>

活用docker的网络配置功能:

查看网络

  1. docker network ls

给容器分配指定IP

  1. docker network connect --ip 172.1.0.4 <网络名称> <容器ID或名称>

Dockerfile的gevent报错:

报错:

CTFd动态靶机搭建教程 - 图40

CTFd动态靶机搭建教程 - 图41

解决方案:

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

  1. 将镜像源替换为清华源
  2. 替换gevent版本
  3. 将Dockerfile文件中添加以下内容
    CTFd动态靶机搭建教程 - 图42

(这篇文章的搭建方法,已经把坑都踩了,所以前面的教程是没有问题的)

Dockerfile的world模块报错:

报错:

CTFd动态靶机搭建教程 - 图43

解决方案:

将Dockerfile中的python和python-dev删掉,或者修改成python2或python3,python2-dev或python3-dev都可以。

构建的时候,ctfd镜像无法启动:

报错:

CTFd动态靶机搭建教程 - 图44

解决方案:

将docker-entrypoint.sh第一行修改为:

  1. #!/bin/bash

CTFd动态靶机搭建教程 - 图45

修改后,重新build即可

ctfd_ctfd_1容器一直在重启:

现象:

ctfd_ctfd_1日志报错如下

TypeError: Only timezones from the pytz library are supported

CTFd动态靶机搭建教程 - 图46

解决方法:

出现时区问题,因此在requirements.txt中添加如下:

  1. tzlocal==2.1

MySQL容器反复重启:

现象:

  1. 2021-11-01 11:20:22 0 [ERROR] InnoDB: Unsupported redo log format. The redo log was created with MariaDB 10.6.4.
  2. 2021-11-01 11:20:22 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
  3. 2021-11-01 11:20:23 0 [Note] InnoDB: Starting shutdown...
  4. 2021-11-01 11:20:23 0 [ERROR] Plugin 'InnoDB' init function returned error.
  5. 2021-11-01 11:20:23 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
  6. 2021-11-01 11:20:23 0 [ERROR] Unknown/unsupported storage engine: InnoDB
  7. 2021-11-01 11:20:23 0 [ERROR] Aborting

CTFd动态靶机搭建教程 - 图47

解决方法:

因为当前目录下的.data文件中的MySQL日志与容器版本不匹配

解决方法是将.data文件删除,重新构建镜像

2021年11月1日更新docker-compose.yml:

注意:只有当前面的方法不能搭建的时候再使用该docker-compose.yml

因为目前还没有测试过其他机器,不确保是否通用

  1. version: '2.2'
  2. services:
  3. ctfd-nginx:
  4. image: nginx:1.17
  5. volumes:
  6. - ./nginx/http.conf:/etc/nginx/nginx.conf #这里注意
  7. user: root
  8. restart: always
  9. ports:
  10. #- "85:80" #我将这里注释掉了,这里通过nginx转发感觉速度访问速度会变慢,可能因为我的配置问题,多次尝试之后直接开8000端口访问不会对服务造成影响
  11. - "443:443"
  12. networks:
  13. default:
  14. internal:
  15. ipv4_address: 172.24.0.2
  16. depends_on:
  17. - ctfd
  18. cpus: '1.00' #可改
  19. mem_limit: 150M #可改
  20. ctfd:
  21. build: .
  22. user: root
  23. restart: always
  24. ports:
  25. - "8000:8000" #这里原本没开端口,直接打开访问网站速度会加快
  26. environment:
  27. - UPLOAD_FOLDER=/var/uploads
  28. - DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd
  29. - REDIS_URL=redis://cache:6379
  30. - WORKERS=1
  31. - LOG_FOLDER=/var/log/CTFd
  32. - ACCESS_LOG=-
  33. - ERROR_LOG=-
  34. - REVERSE_PROXY=true
  35. volumes:
  36. - .data/CTFd/logs:/var/log/CTFd
  37. - .data/CTFd/uploads:/var/uploads
  38. - .:/opt/CTFd:ro
  39. - /var/run/docker.sock:/var/run/docker.sock #这里是添加的
  40. depends_on:
  41. - db
  42. networks:
  43. default:
  44. internal:
  45. ipv4_address: 172.24.0.5
  46. frp:
  47. ipv4_address: 172.1.0.2
  48. cpus: '1.00' #可改
  49. mem_limit: 450M #可改
  50. db:
  51. image: mariadb:10.4
  52. restart: always
  53. environment:
  54. - MYSQL_ROOT_PASSWORD=ctfd
  55. - MYSQL_USER=ctfd
  56. - MYSQL_PASSWORD=ctfd
  57. volumes:
  58. - .data/mysql:/var/lib/mysql
  59. networks:
  60. internal:
  61. ipv4_address: 172.24.0.4
  62. # This command is required to set important mariadb defaults
  63. command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]
  64. cpus: '1.00' #可改
  65. mem_limit: 750M #可改
  66. cache:
  67. image: redis:4
  68. restart: always
  69. volumes:
  70. - .data/redis:/data
  71. networks:
  72. internal:
  73. ipv4_address: 172.24.0.3
  74. cpus: '1.00' #可改
  75. mem_limit: 450M #可改
  76. frpc:
  77. image: glzjin/frp:latest #赵师傅tql
  78. restart: always
  79. volumes:
  80. - ./frpc:/conf/ #这里注意
  81. entrypoint:
  82. - /usr/local/bin/frpc
  83. - -c
  84. - /conf/frpc.ini
  85. networks:
  86. frp:
  87. ipv4_address: 172.1.0.3 #记住此处
  88. frp-containers:
  89. cpus: '1.00' #可改
  90. mem_limit: 250M #可改
  91. networks:
  92. default:
  93. internal:
  94. driver: bridge
  95. internal: true
  96. ipam:
  97. config:
  98. - subnet: 172.24.0.0/16
  99. gateway: 172.24.0.1
  100. frp:
  101. driver: bridge
  102. ipam:
  103. config:
  104. - subnet: 172.1.0.0/16
  105. frp-containers:
  106. driver: overlay
  107. internal: true
  108. ipam:
  109. config:
  110. - subnet: 172.2.0.0/16

虚拟机版本:

下载地址:

【CTFd 2.3虚拟机版本】链接:https://pan.baidu.com/s/11FLyPOKHzpLNBUfuxwJmag
提取码:flag
【CTFd 3.4.0 虚拟机版本】链接: https://pan.baidu.com/s/1AQGQV18GMBJWIs7AP88WDQ
提取码: kbqj

链接如果挂了,可以到我的个人博客联系我:https://www.xiinnn.com

虚拟机相关信息:

  • 虚拟机用户:
    • 用户名:ctf
    • 密码:root
    • 用户名:root
    • 密码:root
  • CTFd后台管理员:
    • 用户名:admin
    • 密码:password

使用方法:

导入虚拟机后启动

选中ctf用户,输入密码root后登陆

打开终端,切换为root用户,密码为root

  1. su root

配置自己的网络(这里看自己的情况)

进入CTFd文件夹

  1. cd CTFd

启动docker

  1. docker-compose up -d

CTFd动态靶机搭建教程 - 图48

进入frp-docker-for-ctfd-whale文件夹:

  1. cd ../frp-docker-for-ctfd-whale/

启动docker

  1. docker-compose up -d

CTFd动态靶机搭建教程 - 图49

查看自己的IP:

  1. ifconfig

CTFd动态靶机搭建教程 - 图50

一般是ens33或者eth0网卡

访问ip:8000即可

CTFd动态靶机搭建教程 - 图51

参考资料: