【CTF靶场搭建】GZ-CTF平台

简介

GZ::CTF 是一个基于 ASP.NET Core 的开源 CTF 平台,采用 Docker 或 K8s 作为容器部署后端,提供了可自定义的题目类型、动态容器和动态分值功能。

GZ::CTF 基于 AGPLv3 协议开源,使用和修改均需遵守开源协议。

官网

GZ::CTF官网

图片[1]-【CTF靶场搭建】GZ-CTF平台-松鼠博客

服务器系统目前最好用:ubuntu的22.04的版本目前我是使用这个,应为它是自带docker的省去搭建docker的环节,如果需要更大的集群官网有k8s搭建方法。

国内服务器docker换源

如果你是用ubuntu的22.04直接换源

详细换源教程在这篇文章:【Docker换源】Docker更换镜像源教程

{
    "registry-mirrors": [
        "https://ustc-edu-cn.mirror.aliyuncs.com/",
        "https://ccr.ccs.tencentyun.com/",
        "https://docker.m.daocloud.io/",
  "https://dockerhub.azk8s.cn",
  "https://mirror.baidubce.com",
  "https://docker.nju.edu.cn",
  "https://mirror.iscas.ac.cn",
  "https://dockerhub.icu",
  "https://docker.anyhub.us.kg",
  "https://hub.gog.email",
  "https://dockerpull.com",
  "https://atomhub.openatom.cn"
    ]
}
//这是新的源我也不知道好用不好用你们尝试一下

GZCTF的安装

有脚本我自己写的如果想直接的用我脚本

gzctf.zip
zip文件
2.6K

自动化脚本代码安装GZCTF

#!/bin/bash

# 检查是否有 root 权限
if [[ $EUID -ne 0 ]]; then
  echo "请以 root 权限运行此脚本。" >&2
  exit 1
fi

# 创建 GZCTF 文件夹
mkdir -p GZCTF

# 提示用户输入初始化参数
echo "为了后续的配置,请准备好如下的初始化参数:"
read -p "请输入初始管理员密码: " GZCTF_ADMIN_PASSWORD
read -p "请输入数据库密码: " POSTGRES_PASSWORD
read -p "请输入加密比赛私钥的随机字符串: " XOR_KEY
read -p "请输入外部访问地址,例如 IP 或域名: " PUBLIC_ENTRY

# 生成 appsettings.json
cat <<EOF > appsettings.json
{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=$POSTGRES_PASSWORD"
  },
  "EmailConfig": {
    "SenderAddress": "",
    "SenderName": "",
    "UserName": "",
    "Password": "",
    "Smtp": {
      "Host": "localhost",
      "Port": 587
    }
  },
  "XorKey": "$XOR_KEY",
  "ContainerProvider": {
    "Type": "Docker",
    "PortMappingType": "Default",
    "EnableTrafficCapture": false,
    "PublicEntry": "$PUBLIC_ENTRY",
    "DockerConfig": {
      "SwarmMode": false,
      "Uri": "unix:///var/run/docker.sock"
    }
  },
  "CaptchaConfig": {
    "Provider": "None",
    "SiteKey": "<Your SITE_KEY>",
    "SecretKey": "<Your SECRET_KEY>"
  },
  "ForwardedOptions": {
    "ForwardedHeaders": 7,
    "ForwardLimit": 1,
    "TrustedNetworks": ["192.168.12.0/8"]
  }
}
EOF

echo "appsettings.json 文件已生成!"
mv appsettings.json ./GZCTF

# 生成 compose.yml
cat <<EOF > compose.yml
services:
  gzctf:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:develop
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=$GZCTF_ADMIN_PASSWORD"
      # choose your backend language \`en_US\` / \`zh_CN\` / \`ja_JP\` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "80:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      # - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db

  db:
    image: postgres:alpine
    restart: always
    environment:
      - "POSTGRES_PASSWORD=$POSTGRES_PASSWORD"
    volumes:
      - "./data/db:/var/lib/postgresql"

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.12.0/24
EOF

echo "compose.yml 文件已生成!"
mv compose.yml ./GZCTF

# 输出成功信息并自动启动服务
echo "配置已完成!以下文件已生成:"
echo "1. GZCTF/appsettings.json"
echo "2. GZCTF/compose.yml"
echo ""
echo "即将启动服务..."

# 自动执行启动服务命令
cd GZCTF || exit
docker compose up -d

echo "服务已启动!可以通过 http://$PUBLIC_ENTRY 访问 GZCTF。"

自动化删除GZCTF脚本

#!/bin/bash

# 检查是否有 root 权限
if [[ $EUID -ne 0 ]]; then
  echo "请以 root 权限运行此脚本。" >&2
  exit 1
fi

echo "=========================================="
echo "      GZCTF 卸载脚本"
echo "      此脚本将完全删除 GZCTF 及其数据"
echo "=========================================="
echo ""

# 确认用户真的想要删除
read -p "警告:此操作将删除所有 GZCTF 的数据和容器!继续吗?(y/n): " CONFIRM
if [[ "$CONFIRM" != "y" && "$CONFIRM" != "Y" ]]; then
  echo "操作已取消。"
  exit 0
fi

# 再次确认
read -p "再次确认:您确定要删除 GZCTF 及其所有数据吗?(yes/no): " CONFIRM_AGAIN
if [[ "$CONFIRM_AGAIN" != "yes" ]]; then
  echo "操作已取消。"
  exit 0
fi

echo "开始卸载 GZCTF..."

# 停止并删除容器
if [ -d "./GZCTF" ]; then
  cd ./GZCTF || exit
  echo "停止并删除 Docker 容器..."
  sudo docker compose down -v
  cd ..
fi

# 删除 GZCTF 目录及其数据
echo "删除 GZCTF 文件夹及其所有数据..."
sudo rm -rf ./GZCTF

echo "删除 Docker 镜像..."
# 尝试删除 GZCTF 相关的 Docker 镜像
sudo docker rmi gztime/gzctf:latest postgres:alpine 2>/dev/null || true

echo "===================================="
echo "      GZCTF 已成功卸载!"
echo "====================================" 

1.先创建一个GZCTF的文件夹,用来存放配置相关文件

mkdir GZCTF

2.创建 appsettings.json文件(在GZCTF文件夹下)

vim  appsettings.json

将以下内容输入到文件中记得替换初始参数之类的内容,删除掉所有注释,不然可能会报错

{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=<Your POSTGRES_PASSWORD>"
  },
  "EmailConfig": {
    "SenderAddress": "",
    "SenderName": "",
    "UserName": "",
    "Password": "",
    "Smtp": {
      "Host": "localhost",
      "Port": 587
    }
  },
  "XorKey": "<Your XOR_KEY>",
  "ContainerProvider": {
    "Type": "Docker", // or "Kubernetes"
    "PortMappingType": "Default", // or "PlatformProxy"
    "EnableTrafficCapture": false,
    "PublicEntry": "<Your PUBLIC_ENTRY>", // or "xxx.xxx.xxx.xxx"
    // optional
    "DockerConfig": {
      "SwarmMode": false,
      "Uri": "unix:///var/run/docker.sock"
    }
  },
  "CaptchaConfig": {
    "Provider": "None", // or "CloudflareTurnstile" or "HashPow"
    "SiteKey": "<Your SITE_KEY>",
    "SecretKey": "<Your SECRET_KEY>"
  },
  "ForwardedOptions": {
    "ForwardedHeaders": 7,
    "ForwardLimit": 1,
    "TrustedNetworks": ["192.168.12.0/8"]
  }
}

3.在当前文件夹下继续创建docker-compose.yml文件

vim docker-compose.yml

在文件里输入以下内容,记得替换初始参数之类的内容,删除掉所有注释

services:
  gzctf:
    image: registry.cn-shanghai.aliyuncs.com/gztime/gzctf:develop
    restart: always
    environment:
      - "GZCTF_ADMIN_PASSWORD=<Your GZCTF_ADMIN_PASSWORD>"
      # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
      - "LC_ALL=zh_CN.UTF-8"
    ports:
      - "80:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      # - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db

  db:
    image: postgres:alpine
    restart: always
    environment:
      - "POSTGRES_PASSWORD=<Your POSTGRES_PASSWORD>"
    volumes:
      - "./data/db:/var/lib/postgresql"

在构建并启动GZCTF

在当前文件夹下(GZCTF),执行命令,成功构建并启动GZCTF

docker-compose up -d

后续修改配置文件的时候要停止docker,并再此运行上述命令。

第一次安装的时候会有点慢,后面会快很多

查看GZCTF启动状态:

docker ps
图片[2]-【CTF靶场搭建】GZ-CTF平台-松鼠博客

会看到容器的状态

然后访问你填的ip或者域名即可

https配置

需要先下载caddy

caddy v2官网:欢迎 — Caddy v2中文文档

Debian、Ubuntu、Raspbian安装命令在下面

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

安装完之后caddy先查看它的状态

service caddy status

应为caddyv2不需要配置证书什么基本上是自动化所以我们重新到GZCTF文件夹下编辑compose.yml

默认一般是ports:80:8080,要把80改成127.0.0.1:8081或者127.0.0.1:8080

图片[3]-【CTF靶场搭建】GZ-CTF平台-松鼠博客

改完gzctf里面内容可以重载compose

docker compose down && docker compose up -d

最重要是改caddyfile文件里面这个文件默认安装在/etc/caddy/Caddyfile

vim /etc/caddy/Caddyfile

就会看到

图片[4]-【CTF靶场搭建】GZ-CTF平台-松鼠博客
ctf.squirrelblog.com {
    reverse_proxy 127.0.0.1:8081 #这里输入你想反代的服务器IP和端口

}

把这个reverse_proxy 后面改成之前在compose.yml中配置的代码我在上面已经截图过了要一样

然后将ctf.squirrelblog.com改成自己域名,切记域名要确保解析自己服务器了否则不会有效果

caddy run
systemctl status caddy

caddy一些指令

# 启动Caddy
systemctl start caddy

# 开机自启
systemctl enable caddy

# 重启Caddy2
systemctl restart caddy

# 停止Caddy2
systemctl stop caddy

# 重载配置Caddy配置文件(修改配置文件后执行)
systemctl reload caddy

# 查看Caddy2运行状态
systemctl status caddy
图片[5]-【CTF靶场搭建】GZ-CTF平台-松鼠博客

看它有没有爆红报错的提示如果没有就代表成功了

GZ后台用户管理ip显示教程

先到后台查看:172.xxx.xxx.xx/17然后只要把你管理员的那个在后台显示改下面的地方

图片[6]-【CTF靶场搭建】GZ-CTF平台-松鼠博客
图片[7]-【CTF靶场搭建】GZ-CTF平台-松鼠博客

把他替换管理员就能显示用户ip了

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容