CTFd环境搭建指南

前言

  • 学校要承办市赛的网络安全赛项,要求要稳定的平台,所以这一次我选择了CTFd作为本次比赛的环境。(以前内部比赛用过H1v1,偶尔会出现500的报错。)之前看到过赵师傅写的CTFd-Whale动态容器插件,创建独立靶机+快速部署,非常让人心动。所以本次平台搭建就采用了CTFd+CTFd-Whale模式。

  • 赵师傅原文链接:https://www.zhaoj.in/read-6333.html?tdsourcetag=s_pctim_aiomsg

  • 特别感谢:https://www.tattooo.top/2020/07/28/%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BACTF%E5%8A%A8%E6%80%81%E9%9D%B6%E5%9C%BA/

搭建环境

Ubuntu-server: 20.04

docker: 19.03.12

docker-compose: 1.26.2

搭建步骤

一、安装docker

方式一:脚本安装

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyuncurl -sSL https://get.daocloud.io/docker | sh

方式二:通过版本库安装

1. 更新系统包索引sudo apt-get update2. 添加HTTPS协议,允许apt从HTTPS安装软件包sudo apt-get install  apt-transport-https  ca-certificates curl  software-properties-common3. 添加Docker公共密钥 Docker 官方源curl -fsSL  https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add4. 设置版本库类型,软件版本包括三种:stable、edge、testsudo add-apt-repository "deb [arch=amd64]  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"5. 安装最新版docker-cesudo apt-get install docker-ce6. 设置开机自启动并启动dockersudo systemctl enable dockersudo systemctl start docker

二、安装docker-compose

方式一:GitHub安装

1. 进入https://github.com/docker/compose/releases 查看最新版本 sudo curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose2. 设置权限sudo chmod +x /usr/local/bin/docker-compose3. 查看是否安装成功docker-compose --version出现docker-compose version 1.26.2即安装成功

方式二:二进制安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composesudo docker-compose --version

方式三:pip安装

因为20.04版本自带默认python版本为3.*,所以直接安装pip即可。

1.安装pipsudo apt install python3-pip2.更新库sudo apt-get update3.更新pip(一定要更新,不然后面建立容器项目会报错)sudo pip3 install --upgrade pip4.安装docker-composesudo pip3 install docker-compose

三、设置docker镜像加速

访问https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

找到镜像加速器,按照指示修改daemon配置文件

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <'EOF'{"registry-mirrors": ["https://******.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker

四、安装frps

cdwget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gztar -zxvf frp_0.29.0_linux_amd64.tar.gzcd frp_0.29.0_linux_amd64sudo cp systemd/* /etc/systemd/system/sudo mkdir /etc/frpsudo cp frpc.ini  frps.ini /etc/frp/sudo cp frpc  frps /usr/bin/sudo chmod a+x /usr/bin/frpc /usr/bin/frpssudo systemctl enable frps

注意:一定要在/root目录下执行,否则后面的文件编辑位置会出错。

编辑frps.ini

sudo vim /etc/frp/frps.ini[common]bind_port = 7897bind_addr = 0.0.0.0token = thisistoken

启动frps系统服务

sudo systemctl start frps

注意:frps与后面要配置的frpc文件的token、port值一定要一样。不然容器会一直保持重启状态。

五、创建FRP网络

启动frpc容器

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

创建frpcadmin网络并将frpc容器接入网络

1. sudo docker network create frpcadmin2. docker ps //查看frpcadmin容器ID3. sudo docker network connect frpcadmin ID>

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

docker network inspect frpcadmin

注意:如果初次执行没有发现地址,多执行几次上面的命令,容器处于up状态时才可以加入。

编辑frpc.ini

vim ~/frp_0.29.0_linux_amd64/frpc.ini[common]server_addr = 172.17.0.1 //docker0的ipserver_port = 7897token = thisistoken  //与前面frps.ini的token一致admin_addr = 172.19.0.2  //frpc容器的网络IP,上面记录的IPadmin_port = 7400log_file = ./frps.log

重启frpc容器

docker restart <frpc容器ID>

六、安装平台与插件

下载靶场与插件

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

配置docker-compose.yml文件

version: '2.2'services:  ctfd:    build: .    user: root    restart: always    ports:      - "8000:8000"    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

修改Dockerfile

FROM python:3.7-alpineRUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&    apk upate && \    apk add python3 python3-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-devRUN adduser -D -u 1001 -s /bin/bash ctfdWORKDIR /opt/CTFdRUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploadsRUN pip config set global.index-url https://pypi.doubanio.com/simpleRUN pip config set install.trusted-host pypi.doubanio.comCOPY requirements.txt .RUN pip install -r requirements.txt -i  https://pypi.doubanio.com/simpleCOPY . /opt/CTFdRUN 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.shRUN chown -R 1001:1001 /opt/CTFdRUN chown -R 1001:1001 /var/log/CTFd /var/uploadsUSER 1001EXPOSE 8000ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]

修改requirements.txt

在最后一行添加banal==0.4.2

构建并启动镜像

docker-compose builddocker-compose up //挂后台可加-d选项

将ctfd容器连接frpcadmin网络

docker network connect frpcadmin <ctfd容器ID>

访问IP:8000即可

第一次进入会要求设置管理员账号密码,按步骤设置即可。

七、动态容器参数设置

进入管理界面并选择插件

填写相关参数

Frp API IP填frpc容器网络的IP

domain没有就填None

Frp Direct IP Address填自己的服务器IP

template里面写上frpc.ini的内容,其他照着填就行

八、题目设置

>Challenge Type题目类型选择dynamic_docker

>Name题目名字

>Category题目分类

>Initial Value初始分值

>Decay Value递减分值

>Minimum Value最小分值

>Docker Image支持动态flag的镜像

>Frp Http Portfrps http开放的端口

>Frp Redirect Type没有域名选择Direct

>Frp Redirect Port转发到靶机容器的端口

>Score Type是否启用动态分数

九、使用NGINX修改网页端口

安装Nginx

apt install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev makemkdir nginxcd nginxwget http://nginx.org/download/nginx-1.19.2.tar.gztar -zxvf nginx-1.19.2.tar.gzcd nginx-1.19.2.tar.gz./configuremakemake install

启动nginx

cd /usr/local/nginx/sbin/./nginx设置开机自启vi /etc/rc.local/usr/local/nginx/sbin/nginx (根据whereis nginx实际的位置为准)设置执行权限:chmod 755 rc.local

配置nginx

配置之前需要先运行一下nginxcd /usr/local/nginx/sbin/./nginx./nginx -s quit然后再修改配置文件 vim /usr/local/nginx/conf/nginx.conf(whereis nginx 实际情况)server下的location替换为location /{proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_redirect off;}

十、利用docker制作可持续利用题目

拉取符合题目要求的lamp环境容器

docker search lampdocker pull 

制作题目容器

1.运行一个集成lamp环境的容器docker run -d --name  -p :80 2.讲制作好的题目php或html文件放入容器/var/www/html目录下docker cp  :/var/www/html/

打包题目上传到dockerhub

1.若未有dockerhub账号,先去注册一个:hub.docker.com2.登录到dockerhubdocker login3.打包镜像docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]-a :提交的镜像作者;-c :使用Dockerfile指令来创建镜像;-m :提交时的说明文字;-p :在commit时,将容器暂停。4.将打包好的镜像上传到dockerhubdocker push <cintainerID>

后续对题目的管理去dockerhub即可。搭建题目时docker image填写CONTAINER [REPOSITORY[:TAG]]即可。

平台搭建_记一次CTFd平台搭建相关推荐

  1. 记一次CTFd平台搭建

    CTFd平台搭建指南 前言 学校要承办市赛的网络安全赛项,要求要稳定的平台,所以这一次我选择了CTFd作为本次比赛的环境.(以前内部比赛用过H1v1,偶尔会出现500的报错.)之前看到过赵师傅写的CT ...

  2. 自建cdn搭建_自建CDN部署平台

    自建CDN部署平台 无标签 2019-01-24 阅读:4903 测试通过平台: CentOS 6.x.7.x(64位操作系统), 其它版本未经测试 注释:https://portal.cdnplus ...

  3. java环境搭建_记一次阿里云服务器Java相关环境搭建的过程

    Java在Web开发中有着不可或缺的地位,在我们通常开发中,为了使编写的demo或者项目能够让更多的朋友看到,我们通常会将项目打包发布到网络中的服务器上,以便让更多的人访问到我们的劳动成果上.想着我们 ...

  4. java 发卡平台支付_自建ZFAKA发卡平台详细教程,支持支付宝微信码支付等多接口...

    今天尝试开通支付宝当面付,比较成功,但是涉及手机网站支付和电脑网站支付功能开通的时候,审核就比较麻烦,理由是没有看到我提供网址需要支付功能. 于是想自己弄一个发卡网站吧,去网上搜了下,最终集中在知宇企 ...

  5. 全行业聚合支付平台接口_各类API聚合支付平台

    什么是聚合支付? 聚合支付,是指聚合所有主流的第三方支付通道.多个支付场景.多种支付方式,通过软硬件(SDK.API.POS)的承载形势,链接商户和第三方支付平台.银行系统的综合支付服务.聚合支付不进 ...

  6. fastdfs搭建_记一次生产环境FastDFS文件系统安装部署过程

    概述 因为前面在做FastDFS文件系统安装部署介绍时我们已经测试将文件上传成功了,但我们无法下载.因此安装Nginx作为服务器以支持Http方式访问文件.同时,后面安装FastDFS的Nginx模块 ...

  7. teamspeak3服务器搭建_教你快速便捷的搭建Teamspeak 3 服务器和基友开黑必备!

    Teamspeak 是一套专有的 VoIP 软件.所谓 VoIP 软件,就是基于网络协议的语音通话.而 Teamspeak 就是和现在市面上大多数即时通讯软件差不多,可以发送即时消息以及多人语音通话. ...

  8. teamspeak搭建_教你快速便捷的搭建Teamspeak 3 服务器和基友开黑必备!

    Teamspeak 是一套专有的 VoIP 软件.所谓 VoIP 软件,就是基于网络协议的语音通话.而 Teamspeak 就是和现在市面上大多数即时通讯软件差不多,可以发送即时消息以及多人语音通话. ...

  9. jenkins搭建_自动化测试系列之jenkins配置搭建环境

    今天来给大家讲解一下关于jenkins配置搭建环境~ 1.安装及运行 (1)下载 http://updates.jenkins-ci.org/latest/jenkins.war (2)运行 两种运行 ...

最新文章

  1. Swift 中使用 SQLite——新增数据
  2. 如何应対syn flood
  3. IromPython .Net 的简介和第一个例子
  4. Qt探索之路——各种类型变量的互相转换
  5. gradle不能下载最新依赖包问题
  6. 区块链学堂(2):最简单的智能合约
  7. GAN的理解与TensorFlow的实现
  8. [笔记][mooc]《程序设计入门—C语言》
  9. 经典MySQL语句大全和常用SQL语句命令的作用。
  10. Kettle常用的配置文件
  11. WPF使用中知识点总结一
  12. 人工智能 一种现代方法 第6章 约束满足问题
  13. Python获取最新省市区列表并绘制中国地图(含港澳台)
  14. 十二种不常见密码及部分实现脚本
  15. ABAP ALV详细教程(二)
  16. Matlab脚本运行
  17. ssm——整合,前端页面设计,分页
  18. Ant Deign Pro - ProTable - 高级表格 通用打印组件
  19. 解决Mac鼠标不好用的问题
  20. 某校2019专硕编程题-前10名学生成绩

热门文章

  1. 真正的端到端超像素网络——Superpixel Segmentation with Fully Convolutional Networks(CVPR2020)
  2. You called this URL via POST, but the URL doesn't end in a slash and you hav。。。
  3. GO + React + Axios Response to preflight request doesn't pass access control check: It does not hav
  4. IDEA官方有中文版啦
  5. 矩阵取数游戏(动态规划)
  6. PHP PDF内容识别 抓取信息 方法
  7. ORA-00937:不是单组分组函数 ORA-22818:这里不允许出现子查询表达式
  8. [机器学习]随机森林源码(python)
  9. CentOS之——Bringing up interface eth0: Determining if ip address 192.168.1.81 is already in use for de
  10. 【跨境电商】5个最佳WordPress插件推荐