简介

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

本项目缘起于作者认为 CTFd 的实现不优雅,动态容器配置需要采用插件的方式,且前端不好看,同时为了办校赛和帮助其他学校的同学办赛,于是自己动手写了一个。

GZ::CTF 基于 AGPLv3 协议开源,使用和修改均需遵守开源协议。开始部署请参考 快速上手

WARNING

升级和迁移注意事项:

  1. 如需升级平台,只需拉取最新的镜像并重新启动,数据库迁移会自动进行。
  2. 一般情况下,不支持 降级 操作,时间跨度过大的版本升级可能会导致数据不兼容,请做好数据备份。
  3. 升级后可能会有新的配置项和文件结构变更,建议查看官方文档或咨询社区。
  4. 如迁移到其他分支项目,请注意数据库结构是否存在变更,变更后的数据库不支持回退到原始版本
  5. 社区及官方不对数据丢失、数据不兼容等问题负责,分支项目问题请联系对应项目维护者。

特性 🛠️

  • 创建高度可自定义的题目

    • 题目类型:静态附件、动态附件、静态容器、动态容器

      • 静态附件:共用附件,任意添加的 flag 均可提交。
      • 动态附件:需要至少满足队伍数量的 flag 和附件,附件及 flag 按照队伍进行分发。
      • 静态容器:共用容器模版,不下发 flag,任意添加的 flag 均可提交。
      • 动态容器:自动生成并通过容器环境变量进行 flag 下发,每个队伍 flag 唯一。
    • 动态分值

      • 分值曲线:

        f(S,r,d,x)=S×[r+(1r)×exp(1xd)]f(S, r, d, x) = \left \lfloor S \times \left[r + ( 1- r) \times \exp\left( \dfrac{1 - x}{d} \right) \right] \right \rfloor

        其中 SS 为原始分值、 rr 为最低分值比例、 dd 为难度系数、 xx 为提交次数。前三个参数可通过自定义实现绝大部分的动态分值需求。

      • 三血奖励: 平台对一二三血分别奖励 5%、3%、1% 的当前题目分值

    • 比赛进行中可启用、禁用题目,可多次放题

    • 动态 flag 中启用作弊检测,可选的 flag 模版,leet flag 功能

  • 分组队伍得分时间线、分组积分榜

  • 基于 Docker 或 K8s 的动态容器分发、管理、多种端口映射方式

  • 基于 SignalR 的实时比赛通知、比赛事件和 flag 提交监控及日志监控

  • SMTP 邮件验证功能、基于 Google ReCaptchav3 的恶意注册防护

  • 用户封禁、用户三级权限管理

  • 可选的队伍审核、邀请码、注册邮箱限制

  • 平台内 Writeup 收集、查阅、批量下载

  • 可下载导出积分榜、可下载全部提交记录

  • 比赛期间裁判监控、提交和主要事件日志

  • 题目流量 TCP over WebSocket 代理转发、可配置流量捕获

  • 基于 Redis 的集群缓存、基于 PGSQL 的数据库存储后端

  • 面向 Prometheus / OpenTelemetry 的监控和数据追踪

  • 全局配置项自定义、平台标题、备案信息

  • 以及更多……

Stars ✨

Stargazers over time

Grafana 📊

grafana.webp

Demo 🗿

index.webp

game.challenges.webp

game.scoreboard.webp

admin.settings.webp

admin.challenges.webp

admin.challenge.info.webp

admin.challenge.flags.webp

admin.game.info.webp

admin.game.review.webp

admin.teams.webp

admin.instances.webp

monitor.game.events.webp

monitor.game.submissions.webp