记一次GZCTF作为校赛平台以及实现动态flag的部署全过程

本文详细描述了如何在Ubuntu22.04上部署GZCTF开源CTF平台,包括安装Docker和docker-compose,配置必要的环境变量和文件,以及设置初始管理员密码。

        GZCTF作为一个新上的开源ctf平台,对比以前的众多平台有着美观易于管理的优点,但是今年校赛平台准备启这个平台的时候,除了官方的文档,搜不到几个中文的教程,所以在这记一下自己部署平台的全过程,也算是个成功部署的教程吧,那么下面咱们开始

        这次的环境部署在Ubuntu上,版本是22.04,安装过程不再赘述,由于已经成功部署过一遍,所以不做远程shell链接,直接虚拟机图形化管理安装了

        没有科学上网的同学们安装完成第一步就是换源,也不再赘述,具体教程可以参考别的帖子

首先安装好必备的工具:

Docker:

sudo apt install docker.io docker-compose

vim:

sudo apt install vim

然后验证安装

        回显版本号即为安装正常

        我这里使用的官方快速部署,参考文档:快速上手,使用docker-compose来快速部署(绝对不是因为懒),有其他需求的可以参考官方文档

在根目录下创建GZCTF目录,进入目录需要创建两个文件

sudo touch appsettings.json
sudo touch docker-compose.yml
ls

然后编辑appsettings.josn

sudo vim appsettings.josn
{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=<Your POSTGRES_PASSWORD>"
  },
  "EmailConfig": {
    "SendMailAddress": "a@a.com",
    "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"
    }
  },
  "RequestLogging": false,
  "DisableRateLimit": true,
  "RegistryConfig": {
    "UserName": "",
    "Password": "",
    "ServerAddress": ""
  },
  "CaptchaConfig": {
    "Provider": "None", // or "CloudflareTurnstile" or "GoogleRecaptcha"
    "SiteKey": "<Your SITE_KEY>",
    "SecretKey": "<Your SECRET_KEY>",
    // optional
    "GoogleRecaptcha": {
      "VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify",
      "RecaptchaThreshold": "0.5"
    }
  },
  "ForwardedOptions": {
    "ForwardedHeaders": 5,
    "ForwardLimit": 1,
    "TrustedNetworks": ["192.168.12.0/8"]
  }
}

这个文件中必须修改的参数如下:

POSTGRES_PASSWORD: 数据库密码

XOR_KEY: 用于加密比赛私钥的随机字符串

PUBLIC_ENTRY: 外部访问地址,可以是 IP 或域名

TrustedNetworks:修改成自己的对应ip,防止网段冲突问题

然后编辑docker-compose.yml

sudo vim docker-compose.yml
version: "3.0"
services:
  gzctf:
    image: gztime/gzctf:latest
    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/data"

 这个文件中必须修改的参数如下:

GZCTF_ADMIN_PASSWORD:初始管理员密码,在数据库未初始化时生效,需要在第一次启动时进行设置

POSTGRES_PASSWORD: 数据库密码

然后直接运行 docker compose up -d 来启动 GZCTF

sudo docker-compose up -d

看到这个界面就是部署完成了

然后查看docker正在运行的实例

sudo docker ps

然后访问ip端口

到这GZ平台的快速部署就算是告一段落了,接下来简单讲解一下web题的动态flag实现,为什么没有pwn题?因为我也不会做hahahah

### 3.1 动态 Flag 的生成机制 在 CTF 比中,为 Pwn 题目部署动态 Flag 是保障比公平性和安全性的重要手段。通常采用随机字符串生成器结合数据库录的方式实现。例如,可以使用 Python 中的 `secrets` 模块生成高强度随机字符串作为每个选手的唯一 Flag: ```python import secrets def generate_flag(): random_part = secrets.token_hex(8) # 生成16字节的随机值 return f"flag{{{random_part}}}" ``` 该方式能够确保每位选手获得的 Flag 唯一且不可预测[^1]。 ### 3.2 将 Flag 注入 Pwn 程序 将生成的 Flag 写入目标程序的内存空间或文件系统中,是实现动态 Flag 的关键步骤。以 Linux 下的 ELF 可执行文件为例,可以通过修改程序源码,在启动时读取环境变量或特定文件中的 Flag 值: ```c #include <stdio.h> #include <stdlib.h> int main() { char *flag = getenv("CTF_FLAG"); if (flag == NULL) { flag = "flag{default}"; } printf("Welcome to the challenge!\n"); printf("The flag is: %s\n", flag); return 0; } ``` 也可以通过容器或虚拟机初始化脚本注入 Flag 到服务运行环境中[^1]。 ### 3.3 自动化部署到云服务器 利用云计算平台(如 AWS、阿里云)提供的 API 接口,可以实现批量创建实例并注入自定义配置信息的功能。以下是一个使用 AWS EC2 和 User Data 脚本部署 Flag 的示例: ```bash #!/bin/bash FLAG="flag{example_flag_value}" echo "FLAG=$FLAG" > /etc/ctf.conf # 启动服务 cd /root/pwn_challenge/ ./pwn_service ``` 在调用 AWS CLI 创建实例时指定上述脚本: ```bash aws ec2 run-instances \ --image-id ami-xxxxxx \ --instance-type t2.micro \ --key-name my-key-pair \ --user-data file://deploy.sh ``` 这样每个选手的实例都会在启动时自动设置唯一的 Flag 并运行服务。 ### 3.4 安全与隔离策略 为了防止选手之间互相访问,应为每个实例分配独立的安全组,并限制其仅允许来自指定 IP 或端口的连接。此外,可结合 IAM 角色机制,为每个实例赋予最小权限,避免因提权漏洞导致整个比环境被破坏。 对于容器化部署场景,可以使用 Docker Compose 或 Kubernetes 来实现更高效的资源管理和调度。例如,为每位选手启动一个独立的容器实例,并绑定不同的端口和服务地址: ```yaml version: '3' services: pwn-challenge: image: ctf_pwn:latest ports: - "10001:1337" environment: - FLAG=flag{dynamic_flag_here} restart: always ``` ### 3.5 监控与回收机制 比结束后需要对所有实例进行统一回收,避免资源浪费和潜在安全风险。可通过定时脚本或云平台 API 实现自动销毁操作。例如使用 AWS SDK 删除指定标签的实例: ```python ec2 = boto3.client('ec2') response = ec2.describe_instances(Filters=[{'Name': 'tag:Challenge', 'Values': ['pwn']}]) for reservation in response['Reservations']: for instance in reservation['Instances']: ec2.terminate_instances(InstanceIds=[instance['InstanceId']]) ``` 同时建议启用日志收集系统(如 ELK Stack 或 AWS CloudWatch),用于审计用户行为和排查异常操作。 ---
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值