在Docker中部署CTFd+CTF-Whale动态靶机+题库以及常见问题解决方案

前言

我这几天一直在研究CTFd的靶场搭建,因为我不是很熟悉Docker的正确食用方法,所以在安装路上遇到很多问题,好在我勤奋好学,通过不懈努力,我终于搭建好CTFd平台,同时使得CTF-Whale插件正确运作,实现答题动态flag。

注:CTFd项目地址CTF-Whale插件项目地址CTFTraining题库

部署

本次将引用另一位博主已经打包好并上传至仓库的版本,以方便部署,主要是因为我懒,懒得打包

  • VaalaCat/ctfd_whale
  • VaalaCat/CTFd

    前期准备

    环境安装

    该项目基本都是通过Docker实现,首先安装Docker
    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    sudo usermod -aG docker 用户名
    准备Docker-Compose
    sudo pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple

    环境配置

    动态靶机模式需要服务器集群,所以在此我们得创建一个单个的服务器集群
    docker swarm init
    然后将此服务器加入到该集群中
    docker node update --label-add='name=linux-1' $(docker node ls -q)
    最后要准备的是给Docker更换镜像源,否则接下来在部署的时候速度很慢,在/etc/docker/daemon.json中更改源,推荐中科大的源,改完之后像下面这样
    {

      "registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"]

    }
    最后重启Docker使其生效
    sudo systemctl daemon-reload
    sudo systemctl restart docker

安装

下载

GitHub上克隆下项目文件

git clone https://github.com/VaalaCat/CTFd.git --depth=1

配置

cd CTFd
vim conf/frp/frps.ini # token自己设置
vim conf/frp/frpc.ini # token自己设置

一定要保证frps.ini和frpc.ini中的token一定要一致!!
给出frp中两个文件的参考内容,基本上只需要修改token和域名

  • frps.ini
    [common]
    bind_port = 7000
    vhost_http_port = 9123
    token = 填入你的token
    subdomain_host = 你的域名
  • frpc.ini
    [common]
    token = 填入你的token
    server_addr = 172.1.0.3
    server_port = 7000
    admin_addr = 172.1.0.4
    admin_port = 7400

安装插件并重新启动

git submodule update --init
docker-compose up -d

不出意外应该可以成功,接着查看已经启动的镜像

docker ps -a

平台插件设置

通过浏览器访问你的域名:9124进入平台,先完成平台的基本设置,进入平台后台之后,右上角点击进入Whale的设置

Docker

在左侧的Docker面板中,Auto Connect Network中填入ctfd_frp_containersDns Setting中填入223.5.5.5,这是阿里云的公共DNS,在Auto Connect Containers中填入ctfd_frpc_1

Frp

在左侧的Frp面板中,Http Domain Suffix填写以http方式访问靶机的泛解析域名,Http Port中填入9123,在Direct IP Address中填入服务器IP,一般用于PWN题,以Direct方式访问,在Direct Minimum Port填入9125,在Direct Maximum Port中填入9129即可完成插件Whale的设置

用一张表格来总结上述设置

Docker

选项内容
Auto Connect Networkctfd_frp_containers
Dns Setting223.5.5.5这是阿里云的公共DNS
Auto Connect Containersctfd_frpc_1

Frp

选项内容
Http Domain Suffix填写以http方式访问靶机的泛解析域名
Http Port9123填写frps中的vhost_http_port,该端口为http方式靶机访问的端口
Direct IP Address填入服务器IP,一般用于PWN题,以Direct方式访问
Direct Minimum Port9125填写用于动态靶机Direct方式的开始端口
Direct Maximum Port9129填写用于动态靶机Direct方式的结束端口

填写完成之后记得保存,可以新建题目来测试是否成功,按下表新建题目,表中没提则默认

选项内容
Choose Challenge TypeDynamic docker
Nametest
Categorytest
Docker Image题目的Docker镜像名
Frp Redirect TypeDirect 或者 Http
Frp Redirect Port80
Initial Value1
Decay Limit1
Minimum Value1
Score Typedynamic score

ps:web题及其他为http类型,pwn题为direct类型
题目新建完成后点击启动,等待靶机创建,可在服务器中输入docker ps -a查看靶机是否启动

总结

  • 9123:
    默认 http 模式靶机访问端口,需要修改 frps.ini、后台中的 Http Portdocker-compose.yml
  • 9124:
    默认为 ctfd 端口,需要修改 docker-compose.yml
  • 9125-9129"
    动态靶机 Direct 模式端口,需要修改 docker-compose.yml、后台中的端口范围

完成以上文件的修改即可完成对平台用到端口的修改

最后千万别忘了在防火墙中开启允许访问以上提到的端口哟~

关于平台汉化

https://github.com/Gu-f/CTFd_chinese_CN

下载好汉化包之后,选择版本,将里面的admincore文件复制,粘贴在/CTFd/CTFd/themes下,并覆盖即可完成汉化。

题目包

题库:CTFTraining

现在/CTFd目录下创建CTFTraining目录,再进入CTFTraining目录中,有选择性的一个一个拉取题目,以拉去第一个题目为例

mkdir CTFTraining
cd CTFTraining
git clone https://github.com/CTFTraining/0ctf_2016_unserialize.git

然后在CTFd后台创建此题目即可

参考: