简介
GZ::CTF 是一个基于 ASP.NET Core 的开源 CTF 平台,采用 Docker 或 K8s 作为容器部署后端,提供了可自定义的题目类型、动态容器和动态分值功能。
GZ::CTF 基于 AGPLv3 协议开源,使用和修改均需遵守开源协议。
官网
![图片[1]-【CTF靶场搭建】GZ-CTF平台-松鼠博客](https://squirrelblog.com/wp-content/uploads/2024/12/image-9-1024x482.png)
服务器系统目前最好用: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
#!/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平台-松鼠博客](https://squirrelblog.com/wp-content/uploads/2024/12/image-10-1024x158.png)
会看到容器的状态
然后访问你填的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平台-松鼠博客](https://squirrelblog.com/wp-content/uploads/2024/12/image-12.png)
改完gzctf里面内容可以重载compose
docker compose down && docker compose up -d
最重要是改caddyfile文件里面这个文件默认安装在/etc/caddy/Caddyfile
vim /etc/caddy/Caddyfile
就会看到
![图片[4]-【CTF靶场搭建】GZ-CTF平台-松鼠博客](https://squirrelblog.com/wp-content/uploads/2024/12/image-13.png)
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平台-松鼠博客](https://squirrelblog.com/wp-content/uploads/2024/12/image-14.png)
看它有没有爆红报错的提示如果没有就代表成功了
GZ后台用户管理ip显示教程
先到后台查看:172.xxx.xxx.xx/17然后只要把你管理员的那个在后台显示改下面的地方
![图片[6]-【CTF靶场搭建】GZ-CTF平台-松鼠博客](https://squirrelblog.com/wp-content/uploads/2024/12/image-15.png)
![图片[7]-【CTF靶场搭建】GZ-CTF平台-松鼠博客](https://squirrelblog.com/wp-content/uploads/2024/12/image-16.png)
把他替换管理员就能显示用户ip了











暂无评论内容