`ctfd`+CTFd-Whale环境搭建详细过程(图文)

1.ctfd环境搭建

1.在home目录下建立ctfd文件

mkdir ctfd

注意所有的文件下载解压都需要注意文件的目录!一方面后面的指令我已经写好,路径已经确定,另一方面,有些配置文件里面路径也是配置好的。每操作一步都比较一下文件路径,避免出现千奇百怪的问题

2.下载ctfd

网上赵师傅的版本,带有动态靶机的插件效果。切换ctfd目录下,执行下面下载的指令。

cd ctfd
git clone https://github.com/glzjin/CTFd.git

如图所示:

如果有卡顿,就ctrl+c中断,之后多执行几次。

可以尝试在github.com.cnpmjs.org基本上所有的GitHub里面加这个后缀下载速度都很快

3.在下载frcp

ctfd一级目录下面继续下载

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

如果下载很慢,中间有下载的包,需要删掉再重新下载,一定要一次性下载完成的那个tar包。

解压也在ctfd目录里面

rm -rf xxx(包名称)

下载完成之后当前目录下再解压,如图所示:

tar -zxvf frp_0.29.0_linux_amd64.tar.gz

4.下载插件ctfd-whale

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

下载的目录也放到ctfd目录下

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

注意: 文件名称改为小写,统一小写,后面配置小写的

mv CTFd-Whale/ ctfd-whale

5.下载docker版本的frps:

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

继续在ctfd目录下执行:

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

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

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

2.ctfd环境配置

1.Docker集群设置:

先初始化:

docker swarm init

注意: 如果出现一下界面,说明环境里面初始过集群指令。重装或者误操作都会出现,这时候需要武力删除,执行完指令之后再执行初始化指令。

武力删除指令:

docker swarm leave --force

删除之后重新初始化docker集群,正确的结果如图:

将刚刚初始化的这个集群加入到节点当中,命令执行后,返回的就是节点ID了,暂时不用管这个节点ID。注意这个linux-1在后面的插件配置地方有,名称不能错。

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

2. 将ctfd-whale插件放到Ctfd的插件下面

在目录ctfd

mv ctfd-whale/ CTFd/CTFd/plugins/

如图是执行完的ctfd目录:

移动到目标位置:

3.启动docker版本的frpsfrps配置:

ctfd的目录下进入该目录:

cd frp-docker-for-ctfd-whale/

进入目录下启动docker,初次下载界面可能不一样,是因为会去拉下载内容,不影响。

docker-compose up -d

如图所示就是启动完成。我们也可以通过指令去看下运行的docker状态

接下来在当前目录下进入到frp看看frp里面的文件信息,建议不要随便改,后面配置有呼应。

4.将frpc传入CTFd中:

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

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

mkdir frpc

再进入cd ../frp_0.29.0_linux_amd64无论从那个文件夹都可以进去,这指令只是在当前文件夹下面。要理解指令的意思。

cd ../frp_0.29.0_linux_amd64

将上述下载并且解压的文件里面这四个文件移动到刚刚新建的frpc文件夹中

mv frpc.ini ../CTFd/frpc/
mv frpc_full.ini ../CTFd/frpc/
mv frpc ../CTFd/frpc/
mv LICENSE ../CTFd/frpc/

进入到刚刚新建的frpc目录下,修改frpc.ini目录下内容,直接替换

[common]
token = randomme
server_addr = 172.1.0.4
server_port = 6490
pool_count = 200
tls_enable = true
​
admin_addr = 172.1.0.3
admin_port = 7400

返回上一级

5.编辑Dockerfile文件

FROM python:3.7-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
    apk update && \
    apk add linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev   #这里注意1
RUN adduser -D -u 1001 -s /bin/bash ctfd
​
WORKDIR /opt/CTFd
RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
​
COPY requirements.txt .
​
RUN apk add gcc
RUN apk add musl-dev
RUN apk add libxslt-dev
RUN apk add g++
RUN apk add make
RUN apk add libffi-dev
RUN apk add openssl-dev
RUN apk add libtool
​
RUN pip install -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/   #这里注意2
​
COPY . /opt/CTFd
​
RUN for d in CTFd/plugins/*; do \
      if [ -f "$d/requirements.txt" ]; then \
        pip install -r $d/requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ ; \
      fi; \
    done; #同样注意2
​
RUN chmod +x /opt/CTFd/docker-entrypoint.sh
RUN chown -R 1001:1001 /opt/CTFd
RUN chown -R 1001:1001 /var/log/CTFd /var/uploads
​
USER 1001
EXPOSE 8000
ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]
​
​

删除原来的数据,完全粘贴到文件里面。或者删掉文件新建一个文本内容是上面的同名文件。

在同一级目录下继续编辑docker-compose.yml。这里使用另一种方式,删除该文件,新建一个以下文件内容的同名文件。

6.修改docker-compose.yml

在当前目录下,删除指令

rm -rf docker-compose.yml

新建同名的文件名称

vim docker-compose.yml

注意!:set paste 然后回车,再按i

在linux下面,yml等特殊格式文件需要指令提醒,否则文件格式缩进乱七八糟。

version: '2.2'
​
services:
  ctfd-nginx:
    image: nginx:1.17
    volumes:
      - ./nginx/http.conf:/etc/nginx/nginx.conf   #这里注意
    user: root
    restart: always
    ports:
      #- "85:80"     #我将这里注释掉了,这里通过nginx转发感觉速度访问速度会变慢,可能因为我的配置问题,多次尝试之后直接开8000端口访问不会对服务造成影响
      - "443:443"
    networks:
        default:
        internal:
    depends_on:
      - ctfd
    cpus: '1.00'  #可改
    mem_limit: 150M     #可改
  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=-
      - REVERSE_PROXY=true
    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:
        frp:
            ipv4_address: 172.1.0.2
    cpus: '1.00'     #可改
    mem_limit: 450M     #可改
​
  db:
    image: mariadb:10.4
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=ctfd
      - MYSQL_USER=ctfd
      - MYSQL_PASSWORD=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]
    cpus: '1.00'     #可改
    mem_limit: 750M     #可改
​
  cache:
    image: redis:4
    restart: always
    volumes:
      - .data/redis:/data
    networks:
        internal:
    cpus: '1.00'     #可改
    mem_limit: 450M     #可改
​
  frpc:    
    image: glzjin/frp:latest     #赵师傅tql
    restart: always
    volumes:
      - ./frpc:/conf/     #这里注意
    entrypoint:
        - /usr/local/bin/frpc
        - -c
        - /conf/frpc.ini
    networks:
        frp:
            ipv4_address: 172.1.0.3  #记住此处
        frp-containers:
    cpus: '1.00'     #可改
    mem_limit: 250M     #可改
​
networks:
    default:
    internal:
        internal: true
    frp:
        driver: bridge
        ipam:
            config:
                - subnet: 172.1.0.0/16
    frp-containers:
        driver: overlay
        internal: true
        ipam:
            config:
                - subnet: 172.2.0.0/16
​
​
​
​

7.修改requirements.txt

这个文件直接替换就行了

Flask==1.1.1
Werkzeug==0.16.0
Flask-SQLAlchemy==2.4.1
Flask-Caching==1.4.0
Flask-Migrate==2.5.2
Flask-Script==2.0.6
SQLAlchemy==1.3.11
SQLAlchemy-Utils==0.36.0
passlib==1.7.2
bcrypt==3.1.7
six==1.13.0
itsdangerous==1.1.0
requests>=2.20.0
PyMySQL==0.9.3
gunicorn==19.9.0
normality==2.0.0
dataset==1.1.2
mistune==0.8.4
netaddr==0.7.19
redis==3.3.11
datafreeze==0.1.0
python-dotenv==0.10.3
flask-restplus==0.13.0
pathlib2==2.3.5
flask-marshmallow==0.10.1
marshmallow-sqlalchemy==0.17.0
boto3==1.10.39
marshmallow==2.20.2
gevent==20.9.0

8.nginx操作

创建nginx文件并且在下面新建http.conf文件赋值内容如下:

worker_processes 4;
events {
  worker_connections 1024;
}
http {
  # Configuration containing list of application servers
  upstream app_servers {
    server ctfd:8000;
  }
  server {
    listen 80;
    client_max_body_size 4G;
    # Handle Server Sent Events for Notifications
    location /events {
      proxy_pass http://app_servers;
      proxy_set_header Connection '';
      proxy_http_version 1.1;
      chunked_transfer_encoding off;
      proxy_buffering off;
      proxy_cache off;
      proxy_redirect off;
      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_set_header X-Forwarded-Host $server_name;
    }
    # Proxy connections to the application servers
    location / {
      proxy_pass http://app_servers;
      proxy_redirect off;
      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_set_header X-Forwarded-Host $server_name;
    }
  }
}
​

效果如图:

9.开始构建:

进入docker-compose.yml文件下执行:

docker-compose up -d

配置网络:

先来看看镜像的状态

docker ps -a

如上图所示可以看到ctfd_frpc_1这个容器的状态是退出状态。

先查看一下ctfd_frp网络

docker network inspect ctfd_frp

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

现在指定文件到指定目录下:

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

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

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

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

docker network inspect ctfd_frp

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

查看ctfd_frpc_1容器日志:

docker logs ctfd_frpc_1

login to server success说明成功

3.启动系统

这里面根据实际情况填入相关信息,之后就可以登录。这里面具体操作需要自己摸索。

image-20210809193930753

4.配置whale

1.配置

此图是网上复制的,参考意义,如果出现访问权限问题,那么你一定要检查重新配置,基本上都是配置或者添加题目出现问题。

属性 配置
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配置内容如下:

[common]
token = randomme
server_addr = 172.1.0.4
server_port = 6490
pool_count = 200
tls_enable = true
​
admin_addr = 172.1.0.3
admin_port = 7400

image-20210809194948251

2.添加第一题:

添加题目注意事项:Docker Image 写镜像名称;Frp Redietct Type 写镜像里面的指定端口号:

初次加载的时候会很慢,因为需要去仓库里面拉代码,可以通过docker images 看到历史的题目。第一次加载的时候看看容器状态,如果启动了,在系统里面销毁靶机,等容器结束之后再重新启动,这样再访问,大部分环境都是可以的

image-20210809195220878

5.最终结果展示

复制启动的地址到URL里面访问

此时再看看容器里面,题目只要填好镜像就行,不需要本地部署。现在已经自动启动改题目如图:

参考:

老赵原文的连接:CTFd-Whale 推荐部署实践 – glzjin

如果出现问题解决不了, docker images 删除对应的image再安装以上的流程,百试不爽

猜你喜欢

转载自blog.csdn.net/songchaofly/article/details/121966961