Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Manuální nastavení a nasazení A/D CTF na vlastním serveru

Úvod

Tento dokument popisuje kroky potřebné k manuálnímu nastavení a nasazení A/D CTF (Capture The Flag) na vlastním serveru. A/D CTF je soutěžní platforma určená pro kybernetické bezpečnostní soutěže, která umožňuje organizátorům snadno spravovat soutěže a účastníkům řešit různé bezpečnostní výzvy.

Požadavky

Před zahájením instalace se ujistěte, že máte následující požadavky splněny:

  • Server s operačním systémem Linux s administrátorským přístupem(root).
  • Nainstalovaný Docker, Docker Compose, WireGuard, libguestfs-tools a QEMU.
  • Přístup k internetu pro stažení potřebných závislostí.
  • Služby a checkery pro A/D CTF (můžete použít vlastní nebo předpřipravené).

Konfigurace serveru

Vše co je označeno jako TBD je potřeba upravit podle vašich potřeb. Server jinak nebude fungovat správně. Je důležité konfiguraci projít v tomto pořadí, protože některé části konfigurace na sebe navazují.

.env

V základu .env soubor obsahuje následující proměnné prostředí, které je potřeba upravit podle vašich potřeb:

CTF_DBHOST=gameserver-postgres
CTF_DBNAME=ctf-gameserver
CTF_DBUSER=ctf-gameserver
CTF_DBPASSWORD=TBD
CTF_FLAGSECRET=TBD
CTF_METRICS_LISTEN=0.0.0.0:9100
CTF_IPPATTERN="10.200.%s.1"
CTF_TEAMREGEX="^\d+\.\d+\.(\d+)\.\d+$"

WG_HOST=0.0.0.0
WG_PORT=51820

Co je potřeba změnit

  • CTF_DBPASSWORD: Heslo pro přístup k databázi CTF serveru. Změňte na silné heslo.
  • CTF_FLAGSECRET: Tajný klíč používaný pro generování a ověřování vlajek. Změňte na silný náhodný řetězec.
  • WG_HOST: Veřejná IP adresa nebo doménové jméno vašeho WireGuard serveru.
  • WG_PORT: Port, na kterém bude WireGuard server naslouchat. Výchozí je 51820, nejspíše není potřeba měnit.

init/ansible/group_vars/all.yml

Tento soubor obsahuje základní konfiguraci pro inicializaci A/D CTF serveru. Upravte následující hodnoty podle vašich potřeb:

---
competition_name: "TBD A/D | Attack-Defense"
services_public: '2025-12-10 12:00:00+00'
event_start:     '2025-12-10 12:00:00+00'
event_freeze:    '2025-12-10 13:00:00+00'
event_end:       '2025-12-10 13:25:00+00'
tick_duration: 60
valid_ticks: TBD
flag_prefix: 'TBD_'

gamedb_host: gameserver-postgres
pgpassword: TBD

game_servicegroups:
- {id: 1, name: "TBD1", slug: "tbd1"}
- {id: 2, name: "TBD2", slug: "tbd2"}

game_services:
- {id:  1, group: 1, name: "TBD1 checker", slug: "tbd1_checker"}
- {id:  1, group: 2, name: "TBD2 checker", slug: "tbd2_checker"}
- {id:  2, group: 2, name: "TBD2 checker", slug: "tbd2_checker2"}

teams:
  - {id: 1337, name: 'admin'   , email: 'admin@example.com',      pass: 'TBD', logo: '', admin: True}
  - {id:    0, name: 'nop'     , email: 'nop@example.com',        pass: 'TBD', logo: '', nop: True}
  - {id:    1, name: 'TBD'     , email: 'team01@example.com',     pass: 'TBD', logo: ''}
  - {id:    2, name: 'TBD'     , email: 'team02@example.com',     pass: 'TBD', logo: ''}

Co je potřeba změnit

  • competition_name: Název vaší CTF soutěže.
  • tick_duration: Délka jednoho kola (ticku) v sekundách.
  • valid_ticks: Počet kol(ticků), jak dlouho je platná vlajka.
  • flag_prefix: Prefix pro generování vlajek. Měl by být unikátní pro vaši soutěž, např. CTF2025_.
  • pgpassword: Heslo pro přístup k databázi CTF serveru. Musí odpovídat hodnotě v .env souboru.
Služby(services)
  • game_servicegroups: Definice skupin služeb. Upravte názvy a slugy podle vašich potřeb.
    • id: Unikátní identifikátor skupiny služby.
    • name: Název skupiny služby.
    • slug: Krátký identifikátor skupiny služby.
  • game_services: Definice jednotlivých checkerů služeb - jedna služba může mít více checkerů. Upravte názvy, skupiny a slugy podle vašich potřeb.
    • id: Unikátní identifikátor služby.
    • group: ID skupiny služby, do které služba patří.
    • name: Název služby.
    • slug: Krátký identifikátor služby.
Týmy(teams)
  • teams: Definice týmů, které se zúčastní soutěže. Upravte názvy, e-maily a hesla podle vašich potřeb.
    • id: Unikátní identifikátor týmu.
    • name: Název týmu.
    • email: E-mailová adresa týmu - nepoužívá se, protože není implementováno zasílání e-mailů.
    • pass: Heslo pro přihlášení týmu.
    • logo: Cesta k logu týmu (může být prázdná).
    • admin: Pokud je nastaveno na True, tým má administrátorská práva.
    • nop: Pokud je nastaveno na True, tým je označen jako NOP (NO Player).

Docker Compose soubor

V docker-compose.yml je nastavená základní konfigurace ctf-gameserveru. Důležité v tomto souboru je přidávání checkerů pro jednotlivé služby. Pro každý checker je potřeba vytvořit nový kontejner podobně jako je to udělané pro checker1-tbd-service. Tedy je potřeba na konci upravit:

...
  checker1-tbd-service:
    image: gameserver-checkerrunner
    build:
      context: .
      dockerfile: Dockerfile
      target: checkerbase
    depends_on:
      - gameserver-postgres
    restart: on-failure
    networks:
      gameserver: {}
      outside: {}
    volumes:
      - ../TBD/checker:/etc/ctf-gameserver

    user: ctf-checkermaster
    environment:
      - CTF_LOGLEVEL=INFO
      - CTF_DBHOST=${CTF_DBHOST}
      - CTF_DBNAME=${CTF_DBNAME}
      - CTF_DBUSER=${CTF_DBUSER}
      - CTF_DBPASSWORD=${CTF_DBPASSWORD}
      - CTF_SUDOUSER=ctf-checkerrunner
      - CTF_IPPATTERN=${CTF_IPPATTERN}
      - CTF_FLAGSECRET=${CTF_FLAGSECRET}
      # Service specific
      - CTF_SERVICE=tbd_checker
      - CTF_CHECKERSCRIPT=/etc/ctf-gameserver/checker.py
      - CTF_CHECKERCOUNT=1
      - CTF_INTERVAL=10

Co je potřeba změnit

  • checker1-tbd-service: Název kontejneru musí být unikátní pro každý checker, např. checker2-tbd-service, checker1-xdf-service, atd.
  • volumes: Cestu k adresáři s checkerem je potřeba upravit podle umístění vašeho checkeru, např. ../XDF/checker:/etc/ctf-gameserver. Environment proměnné:
  • CTF_SERVICE: Název služby, který musí odpovídat slugu checkeru definovaném v init/ansible/group_vars/all.yml.
  • CTF_CHECKERSCRIPT: Cestu k souboru s checker skriptem uvnitř kontejneru, závisí na tom, kam jste namapovali váš checker do kontejneru.
  • CTF_CHECKERCOUNT: Počet instancí checkeru pro tuto službu, 1 je většinou dostačující.
  • CTF_INTERVAL: Interval v sekundách, jak často bude checker spuštěn.

Generace wireguard konfigurace

Pro generaci wireguard konfigurace použijte následující příkaz:

./generate-wg.sh <počet_týmů> <počet_hračů_na_tým>

Zbytek informací si skript vezme z .env souboru. Tento skript vytvoří potřebné konfigurační soubory pro WireGuard VPN server a klienty ve složce wireguard.

Generace vulnboxů

Pro generaci vulnboxů použijte následující příkaz:

./vulnbox-gen/generate-vulnboxes.sh <počet_týmů> <cesta_k_wg_config> <služba1> <služba2> ...
  • <počet_týmů>: Počet týmů, pro které chcete vytvořit vulnboxy.
  • <cesta_k_wg_config>: Cesta k adresáři s WireGuard konfiguracemi vygenerovanými v předchozím kroku (např. ./wireguard).
  • <služba1> <služba2> ...: Seznam cest k adresářům se službami, které chcete nainstalovat do vulnboxů (např. ../TBD/service, ../XDF/service). výstupem budou soubory vulnbox_team<číslo_týmu>.qcow2 pro každý tým, společně s password_vulnbox_team<číslo_týmu>.txt obsahující heslo pro přihlášení do vulnboxu přes ssh na uživatele root. Dále bude vytvořen soubor pass, kde bude uloženo heslo pro zip archivy se službami.

Soubory pro přizpůsobení vzhledu A/D CTF

  • Scoreboard pozadí: saarctf-gameserver/scoreboard/src/assets/img/background.jpg
  • Scoreboard logo:
    • saarctf-gameserver/scoreboard/src/assets/img/logo.png
    • src/ctf_gameserver/web/static/logo.png

Spuštění serveru

Inicializace

Pro inicializaci A/D CTF serveru spusťte následující příkaz:

docker compose run --rm --build gameserver-web-init

Tento příkaz vytvoří potřebné databázové tabulky a inicializuje základní nastavení serveru na základě hodnot v init/ansible/group_vars/all.yml.

Spuštění ctf-gameserveru

Po dokončení konfigurace spusťte A/D CTF server pomocí Docker Compose:

docker-compose up -d --build

Tento příkaz sestaví a spustí všechny potřebné kontejnery pro A/D CTF server na pozadí.

Spuštění wireguard serveru

Pro spuštění WireGuard serveru použijte následující příkaz:

sudo wg-quick up ./wireguard/wg0.conf

Tento příkaz spustí WireGuard VPN server s konfigurací vytvořenou v předchozím kroku.

Spuštění vulnboxů

Pro spuštění vulnboxů použijte následující příkaz:

qemu-system-x86_64 \
   -enable-kvm \
   -m 4096 -smp 4 -cpu host \
   -drive file=vulnbox_team<číslo týmu>.qcow2,if=virtio,cache=writeback,format=qcow2 \
   -netdev user,id=net0\
   -device virtio-net-pci,netdev=net0 \
   -nographic

Tento příkaz spustí virtuální stroj s vulnboxem pro daný tým. Ujistěte se, že nahradíte <číslo týmu> odpovídajícím číslem týmu.