CTFd动态靶场环境部署笔记
前言
目前CTFd平台的搭建教程网上有很多,但也有部分写的水,不够详细,跟着那些教程部署完多多少少还是会出现不少问题,从而导致部署失败,既浪费了时间精力不说还多多少少影响了学习的进度,有这个功夫在这多折腾平台,还不如多做两道PWN题目呢~
由于学校社团内部学习交流的需要,本人在经过两天的折腾学习后,结合各位前辈所写的的教程,终于成功搭建了最新的版本的CTFd,同时使用CTFd-Whale支持动态靶场环境。
本教程基于 Debian 10 + Docker + Docker Compose部署(CentOS 系统也可以参考,安装完Docker的步骤都是一样的),采用最新的CTFd v3.3.1安装,文章最后更新日期为 2021.08.04
如遇到网络环境不佳,导致下载安装速度过慢,请尝试换源、科学上网(自行搜索,禁止在评论区讨论)等。
博主 @Oliver 已经对CTFd v3.3.1官方源码进行了更换国内镜像源、添加CTFd-Whale子模块、配置frp网络、设置静态文件CDN加速等工作,可前往使用作者修改的版本进行安装部署。请前往获取:https://github.com/ollyhsu/CTFd.git
注意:本文已开启版权信息复制,复制相关代码,请在文本编辑器里手动删除,谢谢配合!
文章图片均已添加水印,转载请注明原出处:https://ollyhsu.github.io/posts/ctfd/
环境配置
系统换源
由于本人的环境为Debian10,故只针对此系统进行换源。
阿里源
直接编辑 /etc/apt/sources.list
文件(需要使用 root 权限)。
1 | # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 |
更改完 sources.list
文件后请运行 sudo apt-get update
更新索引以生效。
中科大源
一般情况下,将 /etc/apt/sources.list
文件中 Debian 默认的源地址 http://deb.debian.org/
替换为 http://mirrors.ustc.edu.cn
即可;对于Debian Security 源,将默认的源地址 http://security.debian.org/debian-security/
替换为 http://mirrors.ustc.edu.cn/debian-security/
即可。
可以使用如下命令:
1 | sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list |
当然也可以直接编辑 /etc/apt/sources.list
文件(需要使用 root 权限)。
以下是 Debian Stable (当前 Stable 为 Debian 10,代号为 Buster)参考配置内容:
1 | deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free |
更改完 sources.list
文件后请运行 sudo apt-get update
更新索引以生效。
清华源
直接编辑 /etc/apt/sources.list
文件(需要使用 root 权限)。
1 | # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 |
更改完 sources.list
文件后请运行 sudo apt-get update
更新索引以生效。
安装Git
1 | sudo apt-get install git -y |
Docker环境安装
本教程使用的是DaoCloud安装脚本,如果需要使用手动安装请移步官方教程、国内请参考各镜像站的教程。
在 Linux上 安装 Docker
Docker 的 安装资源文件 存放在Amazon S3,会间歇性连接失败。所以安装Docker的时候,会比较慢。你可以通过执行下面的命令,高速安装Docker。
1 | curl -sSL https://get.daocloud.io/docker | sh |
适用于Ubuntu,Debian,Centos等大部分Linux,会3小时同步一次Docker官方资源
安装 Docker Compose
Docker Compose 存放在Git Hub,不太稳定。你可以也通过执行下面的命令,高速安装Docker Compose。
1 | curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose |
你可以通过修改URL中的版本,可以自定义您的需要的版本
启动Docker服务并设置为开机启动
1 | sudo systemctl start docker |
Docker Hub加速(可选)
为避免docker pull
拉取镜像的速度过慢,我们可以选择配置镜像站进行加速。
请先前往DaoCloud官网获取类似下面的加速脚本,复制官网上的加速脚本。博主使用的加速地址已经使用“xxx”隐藏,请使用最新官方地址,请注意修改。
1 | curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://xxxxxxxx.m.daocloud.io |
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。
手动修改:
修改/etc/docker/daemon.json
文件(若不存在则自行创建),加入如下内容:
1 | { |
里面更换为想要的镜像地址即可。
本文采用的是DaoCloud镜像站,整体体验效果及速度都还不错!你也可以选择其他加速服务。
- DaoCloud:https://www.daocloud.io/mirror
- 阿里云容器镜像服务(使用自己的阿里云账户申请):https://cr.console.aliyun.com/#/accelerator
- 网易:https://hub-mirror.c.163.com/
修改文件后,执行命令重启docker服务:
1 | sudo systemctl daemon-reload |
查看版本信息
通过docker --version
来验证Docker安装是否成功
通过docker-compose --version
来验证Docker Compose安装是否成功
如果能正常返回版本信息,那么恭喜你现在已经完成了环境准备环节,加油!
安装准备
本文针对的是最新版CTFd 3.3.1及CTFd-whale的教程,若不需要配置CTFd-Whale,请移步官方教程。
Docker集群设置
1、启用Docker Swarm,并为生成的Manager节点取一个别名
1 | docker swarm init # 初始化 |
下载CTFd修改版
博主 @Oliver 已经对CTFd v3.3.1官方源码进行了更换国内镜像源、添加CTFd-Whale子模块、配置frp网络、设置静态文件CDN加速等工作,可前往使用作者修改的版本进行安装部署。
1 | git clone -b frp https://github.com/ollyhsu/CTFd.git # 修改版(根目录不建议修改名字) |
手动配置修改(可选)
如果你不想使用本人上面修改并集成CTFd-Whale版本,也可以参考下面的步骤进行手动修改~
下载官方CTFd与CTFd-Whale
1 | git clone https://github.com/CTFd/CTFd.git # 官方Git源码 |
大家在这里一定要注意插件放置的路径,插件名称要确保是小写
配置frp
首先,需要在CTFd目录
下创建frp目录
用于放置配置文件
1 | mkdir frp |
接下来,使用命令 vim frp/frps.ini
在frp
目录下添加下面的配置文件,token值要修改成随机值,其他保持默认即可,保存退出。
1 | [common] |
容器节点自定义域名的请请修改域名
使用命令 vim frp/frpc.ini
在frp
目录下添加下面的配置文件,token值需要与frps.ini的值一样,其他保持默认即可,保存退出。
1 | [common] |
最后我们使用cat
命令查看一下配置文件
1 | cat frp/frps.ini |
修改Dockerfile
由于CTFd默认使用的环境服务器在国外,对于国内用户部署过程非常不友好,因此我们需要使用命令vim Dockerfile
修改,添加国内镜像源。此文件一共需要修改三个地方,如图所示。
1、添加容器的默认源,由于原镜像的默认源为Debian,我们将其修改为中科大的源。
只需要在apt-get update \
和RUN
之间添加两行命令即可,但一定要注意每行后面的换行符不要丢了~
修改后:
参考代码如下:
1 | # hadolint ignore=DL3008 |
2、为pip添加阿里云的源,在requirements.txt
后加上-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
,即可。
修改后
参考代码:
1 | RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com --no-cache-dir |
3、同为修改pip源,参考第二处的方法即可
修改后
参考代码:
1 | RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com --no-cache-dir |
三处修改完毕,英文输入状态下先按ESC
再输入:wq
保存退出。
附:Dockerfile
完整配置文件(非CTFd 3.3.1版本的可能不能直接使用下面的完整文件,请手动修改)
1 | FROM python:3.7-slim-buster |
修改docker-compose
使用下面的命令修改docker-compose.yml
配置文件,具体操作请往下看。
1 | vim docker-compose.yml |
1、在ctfd服务下的volumes
的- .:/opt/CTFd:ro
添加下面一行,通过它与Docker守护进程进行通信。
1 | - /var/run/docker.sock:/var/run/docker.sock |
在networks下的internal下方添加下面的内容
1 | frp: |
修改后如图:
2、在cache下方及networks上方添加frpc和frps服务,网上有部分教程这个文件中没有加上frps,这会导致最后还要手动配置docker网络,属实麻烦,本文frps这里采用的是host模式的网络连接方式。
修改内容(这里可以直接复制,不需要进行任何修改):
1 | frpc: |
修改后如图所示,一定要注意格式缩进,否则后面会报错。
3、配置网络
在networks的internal: true
下面添加frp的网络配置信息(直接复制即可,不需要修改)
1 | frp: |
修改后如图:
修改完毕记得保存退出。
附:docker-compose.yml
完整配置文件(非CTFd 3.3.1版本的可能不能直接使用下面的完整文件,请手动修改)
1 | version: '2' |
构建镜像
运行 docker-compose build
命令,等待
如果修改的各配置文件没有错误的话,那么应该就会返回 Successfully tagged ctfd_ctfd:latest
~
部署容器
运行 docker-compose up -d
部署容器,耐心等待~
不出意外的话,等全部显示done就成功啦~
我们再来使用docker ps -a
查看一下当前正在运行的容器是否都正常。
访问你的服务器的公网IP就能打开平台界面啦,由于CTFd最新版启用了nginx端口转发,我们直接访问80
端口即可,当然CTFd的默认端口8000
也可以访问。
Hint: 对于Docker的两条命令docker-compose build
和 docker-compose up -d
,我们可以将它们合起来写成一句命令 docker-compose up -d --build
后续配置
进入平台后的账号主题相关配置请自行设置,这里我们主要提一下根据本教程安装的CTFd-Whale的配置(别的教程可能不能保证完全适用)如果你使用的是本人修改集成CTFd-Whale插件的CTFd版本,那么插件设置处只需要修公网IP和HTTP域名即可。
进入后台CTFd-Whale插件的Frp标签下
第一处:Http Domain Suffix(HTTP模式域名)
此处填写的域名为Frp容器的节点域名,并非为CTFd平台的域名,(请先将该节点域名泛解析到本服务器的IP上)
例如 *.node.vixxxx.com | A | 39.111.11.111
,不同DNS服务商操作或许不一样。
然后在CTFd-Whale插件设置里设置node.vixxxx.com
,这里填写的域名不需要填写 *.
第二处:Direct IP Address(服务器公网IP)
如果你修改了其他配置,例如CTFd根目录的文件夹名称可能会导致容器名称变化,或是Swarm节点别名,导致无法正常启动靶场,请参照CTFd-Whale完整配置信息表自行修改。
附:CTFd-Whale完整配置信息表
属性 | 参考配置 | 备注 |
---|---|---|
Docker API URL | unix:///var/run/docker.sock | Docker API 链接(保持默认即可) |
Credentials | Docker Hub用户名和密码,以“:”分隔。用于拉取私人镜像 | |
Swarm Nodes | linux-1 | 前面Swarm 集群设置标记的节点别名 |
Use SSL | 高级功能,暂不用管 | |
Auto Connect Network | ctfd_frp_containers | 与 frpc 所在容器相连接的网络 |
Dns Setting | 114.114.114.114 | 靶机内网有DNS可写DNS地址,没有则直接写一个外部DNS |
Auto Connect Containers | ctfd_frpc_1 | frpc所对应的容器名称 |
Multi-Container Network Subnet | 174.1.0.0/16 | 内网题大子网IP/CIDR |
Multi-Container Network Subnet New Prefix | 24 | 每个内网题实例的GIDR |
API URL | http://frpc:7400 | 需要要连接的 Frp API |
Http Domain Suffix | node.vixxxx.com | 已经泛解析的子域名(不用加*) |
Http Port | 8080 | frps http开放的端口 |
Direct IP Address | 39.111.11.111 | 机器的公网IP |
Direct Minimum Port | 10000 | 容器最小的端口值 |
Direct Maximum Port | 10100 | 容器最大的端口值 |
Frpc config template | [common] token = randomme server_addr = 172.1.0.1 server_port = 6490 pool_count = 200 tls_enable = true admin_addr = 172.1.0.3 admin_port = 7400 |
frp目录下frpc.ini文件内容,记得修改token |
Frps config template [generated] | 自动生成的frps配置模板(不用管) | |
Max Container Count | 100 | 最多允许容器数量 |
Max Renewal Times | 5 | 单个容器最多允许续期的次数 |
Docker Container Timeout | 3600 | 实例存活的时间,单位为秒 |
Subdomain Template | {{ container.uuid }} | 设置生成容器的子域 |
Flag Template | {{"flag{"+uuid.uuid4()\|string+"}"}} | 自定义flag的前缀() |
题目测试
这里我们使用 ctftraining/qwb_2019_supersqli 进行测试,添加题目后进行访问。
添加题目过程参考下图:
HTTP模式:
Direct模式:
如果两种模式下都能正常访问容器,那么恭喜你现在CTFd最新版本你已经成功部署啦~
避坑指南
1、安装完Docker,如遇使用 apt update
命令时在 Docker源处更新缓慢
请删除/etc/apt/sources.list.d/docker.list
文件,如果不更新或安装Docker无需此文件
1 | rm -rf /etc/apt/sources.list.d/docker.list |
由于使用的是我改良集成版本的CTFd,目前来看可以一气呵成的的部署成功~
后面有机会再更新赵师傅的CTFd v2.3.2版的安装教程,这个版本的安装时坑较多,后续更新再写~
参考文章
https://www.zhaoj.in/read-6333.html
https://hujiekang.top/2020/04/26/CTFd-conf/index.html
https://err0r.top/article/CTFD/
转载请务必注明来源:https://ollyhsu.github.io/posts/ctfd/
如果有问题,请在个人Hexo博客 文章下面的评论区留言或私信联系我,不足之处敬请谅解!