クイックスタート

GZCTF は Docker イメージを通じて提供され、docker-compose を通じて完全に機能する CTF プラットフォームを迅速にデプロイできます。 これが唯一のデプロイ方法ではないことに注意してください。Kubernetes の使用をお勧めします。 関連するデプロイメント方法については、デプロイメント を参照してください。

WARNING

GZCTF のセキュリティとフロントエンド機能 (クリップボードの操作など) は HTTPS に依存しています。このセクションで説明するデプロイ方法は HTTPS サポートを提供していないため、運用環境での使用には適していません、ローカルテストだけのためにで使用してください。

本ドキュメントではHTTPSの設定方法については説明しておりません。nginx、traefik、その他のソフトウェアの設定方法や使用方法についてはご自身でお問い合わせください。GZCTFのWebSocket機能も別途設定が必要な場合がありますのでご了承ください。ゲーム通知をプッシュできない場合は、まずリバース プロキシの設定を確認してください。

インストレーション

INFO

GZCTF の使用をすぐに開始するには、Docker と docker-compose をインストールする必要があります。関連するインストール手順は、Docker 公式 Web サイト まで参照してください。

  1. 構成を円滑に進められるために、次の初期化パラメータを準備してください。

    • GZCTF_ADMIN_PASSWORD:初期管理者パスワード。 データベースが初期化されていない状態で有効となり、初回起動時に設定する必要があり、compose.yml で設定する必要があります。
    • POSTGRES_PASSWORD: データベースのパスワード。compose.ymlappsettings.json で設定する必要があります。
    • XOR_KEY: ゲーム秘密鍵の暗号化に使用されるランダムな文字列。appsettings.json で設定する必要があります。
    • PUBLIC_ENTRY: 外部アクセス アドレス。IP アドレスまたはドメイン名であり、プロジェクト コンテナにアクセスするためのアドレスを参加者に提供するために使用されます。appsettings.json で設定する必要があります。
  2. 次のコンテンツを appsettings.json ファイルとして保存し、初期化パラメーターに置き換えってください。具体的な構成手順については、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"
        }
      },
      "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": 7,
        "ForwardLimit": 1,
        "TrustedNetworks": ["192.168.12.0/8"]
      }
    }
  3. 次のコンテンツを compose.yml ファイルとして保存し、初期化パラメーターに置き換えってください

    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=ja_JP.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"
INFO

ネットワーク セグメントの競合が発生する可能性があります。その場合は compose.yml のサブネット構成 または /etc/docker/daemon.json のネットワーク セグメント構成を変更してください。

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.12.0/24
  1. docker compose up -d を実行して GZCTF を起動して、ブラウザから GZCTF にアクセスできるようになります。

初期管理者

生産環境にはデフォルトで管理者権限を持つユーザーが存在しないため、初回起動時に環境変数 GZCTF_ADMIN_PASSWORD を設定して初期管理者パスワードを設定し、Admin アカウントでログインする必要があります。

データベースエントリを手動で変更することで、現在登録されているユーザーを管理者として設定することもできます。管理者アカウントが登録を完了し、正常にログインしたら、選択したデータベース テーブルに入り、次を実行します。

UPDATE "AspNetUsers" SET "Role"=3 WHERE "UserName"='your_admin_user_name';

次のコマンドが使用される場合もあります:

docker compose exec db psql -U postgres
psql (15.2)
Type "help" for help.

postgres=# \c gzctf
You are now connected to database "gzctf" as user "postgres".
gzctf=# #do your sql query

Redisをキャッシュとして使用する

Redis をキャッシュとして使用して、よりシームレスなバージョンの切り替えとサーバーの再起動エクスペリエンスを実現する場合は、上記の構成に次のコンテンツを追加してください:

  1. ファイル compose.yml

    services:
      gzctf:
        # ...
        depends_on:
          - db
          - cache
    
      cache:
        image: redis:alpine
        restart: always
    
      db:
        # ...
  2. ファイル appsettings.json

    {
      "AllowedHosts": "*",
      "ConnectionStrings": {
        // ...
        "RedisCache": "cache:6379,abortConnect=false"
      }
      // ...
    }

そして、docker compose up -d を実行して GZCTF をリスタートすればよいです。

コンテナイメージ

GZCTF は、Docker イメージとして事前に構築およびパッケージ化されており、Docker Hub で見つけることができます。

イメージを取得するには、次の 2 つのコンテナー レジストリを使用してください。

gztime/gzctf:latest ghcr.io/gztimewalker/gzctf/gzctf:latest

テスト版と開発版には develop イメージタグを使用してください。

チャレンジ構成

チャレンジの構成と例については、GZCTF-Challenges をご覧ください。

また、W4terCTF 2023 の公開チャレンジを参照することもできます。ここでのチャレンジはすべて、Docker イメージのサイズが確実に小さくなるように設計されています。チャレンジが正常に機能している場合は十分ですが、ゲーム中に迅速にデプロイするには十分です。

GZCTF は、GZCTF_FLAG 環境変数をコンテナに挿入することで動的なフラッグ配布が実装されています。そのため、この環境変数のテキストがチャレンジのコンテナ初期化スクリプト内の適切な場所に配置されていることを確認してください。 この環境変数は、コンテナー イメージのビルド時ではなく、コンテナーの起動時に初期化されることに注意してください。