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.envsouboru.
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 naTrue, tým má administrátorská práva.nop: Pokud je nastaveno naTrue, 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 vinit/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 souboryvulnbox_team<číslo_týmu>.qcow2pro každý tým, společně spassword_vulnbox_team<číslo_týmu>.txtobsahující heslo pro přihlášení do vulnboxu přes ssh na uživateleroot. Dále bude vytvořen souborpass, 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.