CTFD支持动态靶机的搭建笔记(docker:ctfd+ctf-whale)2021.2.5

news/2024/11/18 13:43:23/

CTFD支持动态靶机的搭建笔记(docker:ctfd+ctf-whale)

本篇文章最后更新于2021年2月25日

转载请注明来源:https://err0r.top/article/CTFD/

文章目录

  • CTFD支持动态靶机的搭建笔记(docker:ctfd+ctf-whale)
    • 本篇文章最后更新于2021年2月25日
    • 前言
        • 强调!
    • 事前准备
    • 安装步骤
      • 1.docker集群设置
      • 2.放入ctfd-whale
      • 3.安装frps(这里有其他教程写的是不对的)
      • 4.配置ctfd
      • 5.配置Dockerfile
      • 6.准备完毕
      • 配置CTFD
      • 设置docker网络
      • 坑点注意
            • docker容器无法启动问题
            • frp端口无法映射问题
    • 2021.2.25 更新

前言

ctfd可以说是如今最方便的ctf靶场搭建平台,支持各种插件与二次开发,赵师傅早前写了一款插件ctf-whale非常方便,但本人在搭建的过程中遇到了不少问题,经过不断研究终于完成,特此记录,以防后期忘记,也供大家交流学习。
赵师傅开发的插件是为了适合 buu 的架构,本篇文章采用完整流程+填坑讲解的格式。
我修改了一份CTFd,已上传github:https://github.com/Err0rCM/CTFd_with_CTFd-whale,启动后仍需按照教程后半部分配置,省去前半部分时间,如有问题请提issue或者从头自行配置。

强调!

由于国内git clone实在太慢,本人采用的方法是科学上网下载zip解压的方式,可自行百度git clong与Download zip的区别。本篇文章是用本地下载zip解压上传的方式完成在服务器上搭建

如果阅读中操作出现问题请自行百度,翻到文末查看坑点讲解或者查看其它搭建文章

这里感谢赵师傅zhaoj,fjh1997等前辈写的文章指导,读者遇到问题或有不足或缺陷的地方请私信我添加改正

事前准备

注意:本机为CentOS7
要求:

  1. 已安装基础环境,熟悉linux基本操作
  2. 已安装好 Docker 和 Docker-Compose,并且启用 Docker Swarm,完成换源等操作
  3. 科学上网
  4. 有绝对的耐心

需求:

  1. 下载赵师傅改写的ctfd,赵师傅已经完成了镜像换源等操作
https://github.com/glzjin/CTFd.git ->赵师傅仓库
  1. 下载frp
wget 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.gz

也可以直接访问链接下载然后解压上传

  1. 下载ctf-whale
https://github.com/glzjin/CTFd-Whale
  1. 下载docker的frps
    这里在赵师傅仓库里扒拉发现的
https://github.com/glzjin/Frp-Docker-For-CTFd-Whale

以上除ctfd解压后请确保字母小写,并只有一级文件夹


安装步骤

1.docker集群设置

输入命令

docker swarm initdocker node lsdocker node update --label-add name=linux-1 <节点 ID>

docker集群设置

具体原理等可以查看其它ctfd搭建文章,文末会贴出,这里不做过多阐述

2.放入ctfd-whale

将解压的ctfd-whale改小写后放入/CTFd/CTFd/plugins

3.安装frps(这里有其他教程写的是不对的)

这里注意下,frp不是装在服务器机子上的,简单来说,frps与frpc都是在docker里的。(大坑在这里)
frpc是在ctfd里的,frps是在docker机里的

上传赵师傅的Frp-Docker-For-CTFd-Whale,进入目录后运行docker-compose up -d即可,然后docker ps可看到frps的容器运行中
frps

这里看到frps有28000-28100,这是在Frp-Docker-For-CTFd-Whale里的docker-compose.yml,可更改配置后compose

version: '2'services:frps:image: glzjin/frp:latestrestart: alwaysvolumes:- ./frp:/conf/entrypoint:- /usr/local/bin/frps- -c- /conf/frps.iniports:- "28000-28100:28000-28100"     #可更改开放端口- "6490:6490"    #此处必须与frps.ini配置一致networks:default:networks:default:

再看一下/frp/frps.ini

[common]
bind_port = 6490
token = randomme

4.配置ctfd

直接上ctfd的docker-compose.yml配置

version: '2.2'services:ctfd-nginx:image: nginx:1.17volumes:- ./nginx/http.conf:/etc/nginx/nginx.conf   #这里注意user: rootrestart: alwaysports:#- "85:80"     #我将这里注释掉了,这里通过nginx转发感觉速度访问速度会变慢,多次尝试之后直接开8000端口访问不会对服务造成影响- "443:443"networks:default:internal:depends_on:- ctfdcpus: '1.00'  #可改mem_limit: 150M     #可改ctfd:build: .user: rootrestart: alwaysports:- "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=truevolumes:- .data/CTFd/logs:/var/log/CTFd- .data/CTFd/uploads:/var/uploads- .:/opt/CTFd:ro- /var/run/docker.sock:/var/run/docker.sock     #这里是添加的depends_on:- dbnetworks:default:internal:frp:ipv4_address: 172.1.0.2cpus: '1.00'     #可改mem_limit: 450M     #可改db:image: mariadb:10.4restart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=ctfd- MYSQL_USER=ctfd- MYSQL_PASSWORD=ctfdvolumes:- .data/mysql:/var/lib/mysqlnetworks:internal:# This command is required to set important mariadb defaultscommand: [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:4restart: alwaysvolumes:- .data/redis:/datanetworks:internal:cpus: '1.00'     #可改mem_limit: 450M     #可改frpc:    image: glzjin/frp:latest     #赵师傅tqlrestart: alwaysvolumes:- ./frpc:/conf/     #这里注意entrypoint:- /usr/local/bin/frpc- -c- /conf/frpc.ininetworks:frp:ipv4_address: 172.1.0.3  #记住此处frp-containers:cpus: '1.00'     #可改mem_limit: 250M     #可改networks:default:internal:internal: truefrp:driver: bridgeipam:config:- subnet: 172.1.0.0/16frp-containers:driver: overlayinternal: trueipam:config:- subnet: 172.2.0.0/16

然后注意!注意!注意!

  1. 在docker-compose.yml同目录下建nginx文件夹,即与第一个#这里注意相应,然后建http.conf文件写入以下内容

2021年2月25日更新目前最新版本的CTFd已经有此配置了,不需要再另加了。

转载请注明来源:https://err0r.top/article/CTFD/

worker_processes 4;events {worker_connections 1024;
}http {# Configuration containing list of application serversupstream app_servers {server ctfd:8000;}server {listen 80;client_max_body_size 4G;# Handle Server Sent Events for Notificationslocation /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 serverslocation / {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;}}
}
  1. 在docker-compose.yml同目录下建frpc文件夹,即与第二个#这里注意相应,然后进入解压的/frp_0.29.0_linux_amd64文件夹,或直接上传,将
frpc
frpc.ini
frpc_full.ini
LICENSE

放入frpc文件夹
接着配置frpc.ini,直接上配置

[common]
token = randomme
server_addr = 172.1.0.4
server_port = 6490     #此处必须与frpc.ini配置一致
pool_count = 200
tls_enable = trueadmin_addr = 172.1.0.3 #一定要加!!与后面相应
admin_port = 7400

此处非常重要,之前本人在这里踩了好多次坑。

5.配置Dockerfile

还是直接上配置,Dockerfile。注意,最新版本的CTFd已经更换了Dockerfile的写法,可以参考一下apt换源(文章最后)

FROM python:3.7-alpine  #如果出现问题可尝试更换python,一般不需要
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 ctfdWORKDIR /opt/CTFd
RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploadsCOPY requirements.txt .RUN pip install -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/   #这里注意2COPY . /opt/CTFdRUN 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;RUN chmod +x /opt/CTFd/docker-entrypoint.sh
RUN chown -R 1001:1001 /opt/CTFd
RUN chown -R 1001:1001 /var/log/CTFd /var/uploadsUSER 1001
EXPOSE 8000
ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]

注意点:

  1. 第一处的镜像源可百度更换其它源,例如

sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
注意如果出现问题检查下最后有没有&& \

  1. python版本一般不需要换
  2. RUN第三行我将python和python-dev删掉了,如果要加上则会报错python requires by world之类的,请加上python2python3python2-devpython3-dev.即可解决。删掉后没有发现对服务有什么影响
  3. 所有-i "url"都是指定源,如果下载失败则可更换源再试
  4. 第二处注意即我更换了源,因为之前看其他教程下载失败了

6.准备完毕

运行docker-compose build
静待完成
build

然后运行docker-compose up -d

up

如图所示,有WARNING即为在集群网络类,是正常情况
运行docker ps查看容器情况

ps

访问 http://ip:8000 即可访问ctfd

配置CTFD

进入后随便设置,然后进Admin Panel进行设置

属性配置
Docker API URLunix://var/run/docker.sock
Frp API IPfrpc的ip配置
Frp API Portfrpc的端口配置
Frp Http Domain SuffixDocker API URL to connect(可填None)
Frp Http Port80
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 Containersctfd_frpc_1
Docker Dns Setting可填机器内DNS,没有可填个外网DNS
Docker Swarm Nodeslinux-1 与前面swarm集群呼应
Docker Multi-Container Network Subnet内网题大子网ip配置/CIDR
Docker Multi-Container Network Subnet New Prefix每个内网题实例的CIDR
Docker Container Timeout单位为秒

最后附上我的配置图片
配置1

配置2

配置3

设置docker网络

这个时候运行docker ps
发现frpc在无限重启,因为我们还没有配置网络
运行docker network ls

容器

显示ctfd_frp-containers

运行docker network inspect ctfd_frp

ctfd_frp

这个是docker-compose里compose后创建的网络,我们将frps加入此网络,例如我的frp容器id为12345,则运行docker network connect ctfd_frp 12345<即frp容器id>。再运行docker network inspect ctfd_frp,如下在这里插入图片描述

这里可以看到ip与我们之前设置的相应。

此时运行docker restart ctfd_frpc_1 frp_frps_1

然后docker ps

最终如下ps

成功完成。

最后设置道题目选择(我做了汉化)
题目1

题目2

在这里插入图片描述

docker ps里可以看到容器成功启动,地址正常访问

坑点注意

  1. 如果frpc重复出现retrying,请返回检查docker-compose.yml。找到frpc设置,检查ip设置是否正确。再检查ctfd的Admin Panel里ctfd-whale设置是否正确。
  2. 如果出现安装某个文件失败问题,请更换源,很多都是源里没有指定文件造成的。可以自行访问一下网站,查看一下要下载的文件名,再进行配置。
  3. 似乎docker和系统的版本会有影响,本机为CentOS7.4 64位,腾讯云,docker配置如下

版本

  1. python的问题,上面提到的,可以删除,是因为没有指定版本的原因,也可以指定版本再下载

  2. ctfd运行docker-compose up -d后有可能提示docker-entrypoint.sh没有权限,手动加个权限即可。在CTFd文件夹下运行chmod a+x docker-entrypoint.sh(docker-compose.yml里其实写了加权限,但是最后并没有加上去?)

  3. 如果docker容器无法启动或者frp端口无法映射可以进容器检查

    确保docker api填写正确,如docker-compose.yml中写的unix:///var/run/docker.sock
    你也可以使用端口形式的api如官方示例:可以用IP:端口指定API

    docker容器无法启动问题

    进入容器检查:

    docker exec -it <ctfd容器id> sh
    /opt/CTFd# python
    >>>import docker
    >>>client=docker.DockerClient(base_url="unix:///var/run/docker.sock")
    >>>client.images.list()
    

    如果api正确会列出所有镜像

    frp端口无法映射问题

    进入容器检查:

    //其实检查可以顺便检查一下上面的,因为都在ctfd容器内
    docker exec -it <ctfd容器id> sh
    /opt/CTFd# python
    >>>import requests
    >>>requests.get("http://172.1.0.3:7400/api/reload")//即frp api的地址返回
    <Response [200]> #表示成功
    

    如果frpc还是出现如下问题

    requests.exceptions.ConnectionError: HTTPConnectionPool(host='172.1.0.3', port=7400): Max retries exceeded with url: /api/reload (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f8df919f850>: Failed to establish a new connection: [Errno 111] Connection refused'))

    则重新配置frpc。编辑/CTFd/frpc/frpc.ini

    [common]
    token = randomme
    server_addr = 172.1.0.4
    server_port = 6490
    pool_count = 200
    tls_enable = trueadmin_addr = 172.1.0.3 #这里千万千万别忘加,之前要被搞气死
    admin_port = 7400
    

    然后运行docker restart ctfd_frpc_1(这里再看frpc.ini会发现内容更新了,admin配置没了,不用担心)

    再进容器检查requests.get("http://172.1.0.3:7400/api/reload")应该就可以了<Response [200]>

  4. 遇事不决请重启

  5. 如果发现frp端口冲突,请检查本地frpc或者frps服务,frp是在docker上不是在本地的!

    systemctl stop frpc
    systemctl stop frps
    
  6. 活用查看log

    docker logs <ctfd容器id>
    docker logs <frp容器id>
    
  7. 如果修改了任意配置,请跟着修改系列配置,很多就是因为漏改造成的

11.docker ps显示正常但是无法访问

可以使用 docker logs ctfd_ctfd_1 查看输出,如果发现输出类似:

/usr/local/lib/python3.7/site-packages/tzlocal/unix.py:158: UserWarning: Can not find any timezone configuration, defaulting to UTC.warnings.warn('Can not find any timezone configuration, defaulting to UTC.')
Starting CTFd
/usr/local/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObjectreturn f(*args, **kwds)
/usr/local/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObjectreturn f(*args, **kwds)
/usr/local/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObjectreturn f(*args, **kwds)
[2020-10-11 12:31:30 +0000] [1] [INFO] Starting gunicorn 19.9.0
[2020-10-11 12:31:30 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2020-10-11 12:31:30 +0000] [1] [INFO] Using worker: gevent
[2020-10-11 12:31:30 +0000] [21] [INFO] Booting worker with pid: 21
[2020-10-11 12:31:31 +0000] [23] [INFO] Booting worker with pid: 23
[2020-10-11 12:31:32 +0000] [25] [INFO] Booting worker with pid: 25
[2020-10-11 12:31:34 +0000] [27] [INFO] Booting worker with pid: 27
[2020-10-11 12:31:35 +0000] [29] [INFO] Booting worker with pid: 29
[2020-10-11 12:31:36 +0000] [31] [INFO] Booting worker with pid: 31
[2020-10-11 12:31:37 +0000] [33] [INFO] Booting worker with pid: 33
[2020-10-11 12:31:39 +0000] [35] [INFO] Booting worker with pid: 35
[2020-10-11 12:31:40 +0000] [37] [INFO] Booting worker with pid: 37(一直在加)

则问题为这篇文章中所提到的问题,只需要删除 requirements.txt 中的 gevent 版本号即可,结果类似下面这样

/requirements.txt
...
redis==3.3.11
datafreeze==0.1.0
gevent
python-dotenv==0.10.3
flask-restplus==0.13.0
...

然后 docker-compose down 再启动 docker-compose up -d --build 不出意外应该就能解决问题

12.出现如下问题可参考此issue提出的问题,则在ctfd的docker-compose.yml添加/var/run/docker.sock:/var/run/docker.sock,上面配置中已提过

str

如下
配置

2021.2.25 更新

最新的CTFd改了部分代码,由于兼容性问题,需要重新编辑一些东西,例如Dockerfile

FROM python:3.7-slim-buster
WORKDIR /opt/CTFd
RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads# hadolint ignore=DL3008
RUN echo 'deb http://mirrors.aliyun.com/debian/ buster main non-free contrib \deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib \deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib \deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib \deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib \deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib \deb http://mirrors.aliyun.com/debian-security/ buster/updates main non-free contrib \deb-src http://mirrors.aliyun.com/debian-security/ buster/updates main non-free contrib'> /etc/apt/sources.list && \apt-get update \&& apt-get install -y --no-install-recommends \build-essential \default-mysql-client \python3-dev \libffi-dev \libssl-dev \git \&& apt-get clean \&& rm -rf /var/lib/apt/lists/*COPY requirements.txt /opt/CTFd/RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --no-cache-dirCOPY . /opt/CTFd# hadolint ignore=SC2086
RUN for d in CTFd/plugins/*; do \if [ -f "$d/requirements.txt" ]; then \pip install -r $d/requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --no-cache-dir; \fi; \done;RUN adduser \--disabled-login \-u 1001 \--gecos "" \--shell /bin/bash \ctfd
RUN chmod +x /opt/CTFd/docker-entrypoint.sh \&& chown -R 1001:1001 /opt/CTFd /var/log/CTFd /var/uploadsUSER 1001
EXPOSE 8000
ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]

其他pip源

清华:https://pypi.tuna.tsinghua.edu.cn/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/

build
up

我整合了一下CTFd+ctfd-whale+frp,可以参考一下,已上传github

参考文章

CTFd-Whale 推荐部署实践(赵师傅官方)

手把手教你如何建立一个支持ctf动态独立靶机的靶场(ctfd+ctfd-whale)

ctfd使用ctfd-whale动态靶机插件搭建靶场指南

转载请注明来源:https://err0r.top/article/CTFD/
如果有问题请私信联系我,不足之处敬请谅解


http://www.ppmy.cn/news/258158.html

相关文章

Hex文件的学习

Hex文件格式 hex文件、bin文件都是可以烧录到MCU中的16进制文件&#xff0c;mcu可执行的文件格式。 文件格式以行为单位记录&#xff0c;每行以16进制一个字节为单位记录数据。 hex文件行格式&#xff1a; x: 行(: ) A:字节数&#xff0c;数据长度1byte B:数据起始地址&#xf…

从零用Docker搭建CTFd动态靶场(CTFd+CTFd-whale)2023/04/01

目录 一.前言 二.服务器 三.搭建 1.安装Docker和Docker-compose并配置 (1)修改国内源 (2)更新yum包 (3)卸载旧版本 (4)安装必要工具 (5)添加docker的存储库 (6)安装docker-ce (7)设置开机启动并启动docker (8)安装docker-compose,不行就去GitHub上手动下载并改名放…

matlab中的rand ,randn,和randi函数

1. rand(m,n) 生成m行n列均匀分布在&#xff08;0~1&#xff09;之间的伪随机数。 rand(1,5)ans 0.6797 0.6551 0.1626 0.1190 0.4984 2. randn (m,n) 生成m行n列标准正态分布的伪随机数&#xff08;均值为0&#xff0c;方差为1&#xff09; randn(1,5)ans 1.532…

netsh int ip 添加/删除 TCP 协议 excludedportrange 的方法

本文参考Many excludedportranges how to delete - hyper-v is disabled。 以管理员身份运行命令提示符&#xff0c;运行&#xff1a; netsh int ip show excludedportrange protocoltcp查看当前协议为 TCP 的 excludedportrange 为&#xff1a; 协议 tcp 端口排除范围 开始端…

6410

“手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动 上一篇文章我们介绍了字符设备驱动程序的框架&#xff0c;本篇文章我们将操作真实的硬件---LED。 一、实验环境 开发机环境 操作系统&#xff1a;ubuntu 9.10 交叉编译环境&#xff1a;arm-linux-gcc 4.2.2 …

网友畅谈:柯达 DX6490实际使用感受

柯达DX6490是其旗下EasyShare系列的产品,这款新品数码相机并非柯达EasyShare系列中像素最高的产品&#xff0c;它采用的是400万像素CCD&#xff0c;不过DX6490的杀手锏是其配置的10X光学变焦的德国施耐德镜头&#xff0c;这是全球第二款具备400万像素及10X光学变焦的数码相机。…

QCM6490 QUDTT测试

前言&#xff1a; 基于最新版 QDUTT&#xff08;QCOM DDR USB TEST TOOL&#xff09; 2.0.2 介绍了如何使用 QDUTT 对 QCM6490运行 DDR 调试映像 (DDI) 测试。本文对这些设备进行内存测试的软件工程师有用。 QCM6490中引入了 DDI&#xff0c;以提供 XML 绑定语言 (XBL) 的 DD…

QCM6490 SSR 记述(一)

项目场景&#xff1a; modem 子系统crash导致系统crash&#xff0c;偶现。且SSR已经关闭。 如果disable_restart_work 设置为DISABLE_SSR&#xff0c;那么不管什么&#xff08;wlan adsp-audio/sensor modem etc&#xff09;触发了SSR&#xff0c;都不会重启 #define DISABL…