【CTFd】靶场安装与配置

CTFd是githbu上开源的ctf靶场之一,配合上whale等插件,可以快速搭建一个靶场

CTFd

以下测试环境均为Ubuntu20.04,Python3.8
CTFd官网
CTFd-Github仓库
CTFd中文汉化
由于本人更喜欢汉化风格,所以使用的均为CTFd_chinese_CN下3.4.1版本的CTFd

  1. 克隆CTFd代码并安装相关依赖
    #如果空白环境
    sudo ./prepare.sh
    #如果是在宝塔环境下安装(bt自带的python会产生冲突)
    sudo apt-get --fix-broken install
    #如果已经安装好python环境(建议使用3.7)
    sudo pip install -r requirements.txt
  2. 下载CTFd_chinese_CN-v3.4.1并将CTFd目录覆盖到你的项目目录
  3. 运行,默认运行在http://127.0.0.1:4000,你可以通过更改配置文件使其监听0.0.0.0,或者使用nginx反代,此处使用后者
    #配置文件CTFd/config.ini
    python serve.py

CTFd-whale

CTFd-whale是CTFd的动态靶机,依赖Docker集群实现

  1. 安装Docker与Docker-compose并且启用 Docker Swarm
    apt-get install docker docker-compose -y
  2. 给你的Docker换源,不然会龟速下载
  3. 在插件目录下,克隆frankli0324修改过的ctfd-whale
    #打开ctfd插件目录
    cd CTFd/plugins 
    #确保插件文件夹小写
    git clone https://github.com/frankli0324/ctfd-whale
    #安装一些缺少的组件
    pip3 install flask_apscheduler flask_redis
  4. 由于插件使用的是集群的模式,所以这里要创建一个单个服务器的集群,然后将这个服务器加入集群
    docker swarm init
    docker node update --label-add='name=linux-1' $(docker node ls -q)
  5. 安装启动Frps,Frps为目前最好用的内网代理之一,通过这个将容器映射出去
    请访问Frps-Github获取目前最新的版本

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

    修改/etc/frp/frpc.ini,YOUR_TOKEN请自己随机设置一个

    #frps.ini
    [common]
    bind_port = 7000 #防火墙记得开放相应端口
    bind_addr = 0.0.0.0
    vhost_http_port = 10000 #如果是http动态域名需要这个。80端口开启需要systemmd使用root权限启用frp
    token = YOUR_TOKEN
    subdomain_host = ctfd-node.hz2016.cn

    修改之后重启frps

    service frps restart

    创建FrpAdmin容器

    docker network create --driver overlay ctfd_frp-containers
    docker run -d -v /etc/frp/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp" 

    创建网络frpcadmin用于ctfd容器和frpc容器通信

    docker network create frpcadmin
    docker ps #查看容器ID

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

    docker network connect frpcadmin <frpc容器名或者ID>

    根据上方回显,修改/etc/frp/frpc.ini,此处TOKEN与PORT应该与frps.ini一致
    file
    file

    #frpc.ini
    [common]
    server_addr = 172.17.0.1 # 这里填写宿主机ifconfig之后docker0的ip,因人而异,不要一摸一样填
    server_port = 7000
    token = YOUR_TOKEN
    admin_addr = 172.21.0.2 #这里填写frpc容器在frpcadmin网络里的ip,因人而异,不要一摸一样填,而且要和后续下图插件配置界面中️的一样。
    admin_port = 7400

    最后记得重启frpc容器

    docker restart <frpc容器的ID> 

    由于莫名其妙报错Unable to access frpc admin api
    但是反复排查又是没有问题的,于是看源码!

    #修改CTFd/plugins/ctfd-whale/utils/routers/frp.py第125行
    resp = self.ses.get(f'http://{self.url}/api/status')
  6. 完成Whale相关设置
内容 注释
Http Domain Suffix ctf-node.hz2016.cn 这里填写使用http方式访问靶机的泛解析域名
Http Port 10000 这里填写frps中的vhost_http_port,该端口为http方式靶机访问的端口
Direct IP Address ctf-direct.hz2016.cn 这里填写服务器ip,用于显示Direct方式访问的题目的IP
Direct Minimum Port 10001 这里填写用于动态靶机Direct方式的开始端口
Direct Maximum Port 10010 这里填写结束端口

参考文献

CTFd+CTFd-whale动态靶机环境搭建
ctfd使用ctfd-whale动态靶机插件搭建靶场指南
手把手教你如何建立一个支持ctf动态独立靶机的靶场(ctfd+ctfd-whale)
记载一次CTFd平台搭建及运维

发布者

正汰

永远是这样,山前面是山,天空上面是天空,道路前面还是道路,迷茫之后还有迷茫。

发表评论

您的电子邮箱地址不会被公开。