题目管理

题库与比赛题目

CBCTF 采用两层题目管理:

层级说明
全局题库题目模板,不直接对选手可见
比赛题目(ContestChallenge)将全局题目关联到比赛,可覆盖部分字段

对全局题库的修改(如更新附件)会影响所有使用该题目的比赛。对比赛题目的覆盖配置(name、description 等)仅影响该场比赛。

创建题目

必填字段:name(题目名称)、type(题目类型)、category(分类)。

可选字段:

  • description:题目描述(Markdown)
  • generator_image:动态附件题的生成器容器镜像
  • network_policies:Kubernetes NetworkPolicy 配置(JSON)

上传附件

  • 静态/容器题:上传 attachment.zip,所有队伍共享下载
  • 动态附件题:上传 generator.zip,平台在生成时上传到生成器容器的 /root 目录(可选)

题目测试模式

需要 admin:challenge:test 权限。管理员可在题目加入比赛前,通过测试模式验证容器靶机配置:

  1. 访问题目详情,点击「测试」
  2. 平台以管理员身份启动靶机容器或 KubeVirt VM(不绑定任何队伍)
  3. 普通 Pod 题验证端口连通性和访问地址;VM 题验证 VM 启动、网络接入、Flag 注入和 cloud-init 写入
  4. 测试完成后停止靶机
Info

测试模式下不产生实际的 flag 和队伍记录。如果题目使用 x-kubevirt: true,测试前应确认集群已安装 KubeVirt,题目使用 VPC 网络并配置了每张网卡的 ipv4_addressmac_address。VM 模式的 ports 不会生成平台访问地址;普通环境变量和 x-volumes 不会注入到虚拟机,需改用 x-cloudinit.write_files 注入文件和 Flag。

加入比赛

通过 POST /admin/contests/:contestID/challengesadmin:contest_challenge:create)将题目加入比赛。

加入时可覆盖以下字段(仅对本场比赛生效):

字段说明
name比赛中显示的题目名称
description比赛中显示的题目描述
category分类
tags标签
hints提示列表(选手可查看)
hidden是否在比赛中隐藏该题目
attempt_limit提交次数限制(0 表示无限制)

管理比赛 Flag 分数

通过 PUT /admin/contests/:contestID/challenges/:challengeID/flags/:flagIDadmin:contest_challenge_flag:update)为每个 flag 独立配置计分:

{
  "score_type": 2,
  "score": 1000,
  "min_score": 100,
  "decay": 50
}

详见计分系统

NetworkPolicy

在题目的 network_policies 字段中配置 Kubernetes NetworkPolicy(JSON 格式),对该题目的所有靶机生效。

示例:禁止靶机出站访问互联网:

[
  {
    "policyTypes": [
      "Egress"
    ],
    "egress": [
      {
        "to": [
          {
            "ipBlock": {
              "cidr": "10.0.0.0/8"
            }
          }
        ]
      }
    ]
  }
]

文件管理

通过 GET /admin/filesadmin:file:list)查看所有已上传的题目附件,支持下载和删除。流量 pcap 文件和 Writeup 文件也在此处统一管理。