CTFd动态靶机搭建笔记
CTFd是一个Capture The Flag框架,侧重于易用性和可定制性。它提供了运行CTF所需的一切,并且可以使用插件和主题轻松进行自定义。
- 官方网站:https://ctfd.io/
- 下载ctfd:https://github.com/glzjin/CTFd.git
- 下载frp:https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
- 下载ctf-whale:https://github.com/glzjin/CTFd-Whale
复制代码
01
安装部署frps服务
步骤1. 安装启动frps
- wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
- tar -zxvf frp_0.36.2_linux_amd64.tar.gz
- cd frp_0.36.2_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
复制代码
步骤2. 编辑frps.ini
- sudo vim /etc/frp/frps.ini
- [common]
- bind_port = 7897
- bind_addr = 0.0.0.0
- token =thisistoken
- vhost_http_port=80 #如果是http动态域名需要这个。80端口开启需要systemmd使用root权限启用frp
复制代码
步骤3. 启动frps服务
- sudo systemctl start frps
复制代码
步骤4. 创建网络并启动frpc容器
- sudo docker network create ctfd_frp-containers
- sudo docker network ls
复制代码
- sudo docker run -d -v ~/frp_0.36.2_linux_amd64/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp"
复制代码
注意:如果执行上述命令行,产生的frpc容器一直循环启动,通过指令docker logs <frpc容器ID> 查看报错内容为缺少配置文件,则可以将根目录的frp_0.36.2_linux_amd64文件夹删除(注意是系统生成的空文件夹),在下载的frp_0.36.2_linux_amd64文件夹目录执行(本次操作在opt目录下) - sudo docker run -d -v frp_0.36.2_linux_amd64/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp"
复制代码
步骤5. 创建网络frpcadmin用于ctfd容器和frpc容器通信
- sudo docker network create frpcadmin
- sudo docker network connect frpcadmin <frpc容器名或者ID> #将frpc和ctfd容器单独连接到网络frpcadmin,注意要等容器创建好之后再连接,因此ctfd将在稍后连接
- docker network inspect frpcadmin #查看frpcadmin网络的连接情况并记录frpc容器的网络IP
复制代码
步骤6. 编辑frpc.ini
- vim ~/frp_0.36.2_linux_amd64/frpc.ini
- [common] server_addr = 172.17.0.1 # 这里填写宿主机ifconfig之后docker0的ip,因人而异,不要一摸一样填
- server_port = 7897
- token=thisistoken
- admin_addr = 172.19.0.2 #这里填写frpc容器在frpcadmin网络里的ip,因人而异,不要一摸一样填,而且要和后续下图插件配置界面中️的一样。
- admin_port = 7400
- log_file = ./frpc.log
复制代码
编辑完之后记得重启frpc容器
02
安装靶场与插件
步骤1. 下载靶场与插件 将插件ctfd-whale 下载到CTFd/plugins目录: - git clone https://github.com/CTFd/CTFd.git
- cd CTFd/
- git reset 6c5c63d667a17aec159c8e26ea53dccfbc4d0fa3 --hard #回滚到当前教程适合的版本
- cd CTFd/plugins #打开ctfd插件目录
- git clone https://github.com/glzjin/CTFd-Whale.git ctfd-whale #确保插件文件夹小写
- cd ctfd-whale
- git reset 5b32f457e9f56ee9b2b29495f4b3b118be3c57bd --hard #回滚到当前教程适合的版本 cd ../.. #返回ctfd主目录 vim docker-compose.yml
复制代码
步骤2. 配置docker-compose.yml - version: '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:
- external:
- name: frpcadmin
- internal:
- internal: true
复制代码
步骤3. 重新build后启动ctfd - FROM python:3.6-alpine
- RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&\
- apk update && \
- apk add python3 python3-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev g++
- RUN adduser -D -u 1001 -s /bin/bash ctfd
- WORKDIR /opt/CTFd
- RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
- RUN pip3 config set global.index-url https://pypi.doubanio.com/simple
- RUN pip3 config set install.trusted-host pypi.doubanio.com
- COPY requirements.txt .
- RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple
- COPY . /opt/CTFd
- RUN 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.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"]
复制代码
步骤4. 构建启动镜像。
- docker-compose build docker-compose up -d
复制代码
步骤5. 将ctfd连接frpcadmin网络
- docker network connect frpcadmin <ctfd容器名或者ID>
复制代码
03
CTFd部署及插件配置
步骤1. 启动ctfd后进入管理页面选择插件
步骤2. 填写相关参数 进入后随便设置,然后进Admin Panel进行设置 属性 | 配置 | 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 | 单位为秒 |
最后附上我的配置图片
示例:接下来带领大家创建一个web容器:
首先通过命令行,下载容器镜像,记录好镜像名称,然后在challenge进行配置:
|