Obsah
Toto jsou doprovodné materiály k odborným seminářům(OSE) o kybernetické bezpečnosti(KB) vedené Šimonem Kimelem na SSPŠ.
Skripta
- V aktuálním stavu obsahují pouze část o webových stránkách, ale v plánu je rozšířit o další témata.
Webové stránky
- HTML
- CSS
- JavaScript
- HTTP
- Útoky
Praktické ukázky
Praktické ukázky kybernetické bezpečnosti formou CTF soutěží.
Pro účastníky
A/D CTF
- Informace o A/D CTF soutěžích obecně.
Jeopardy
- Informace o Jeopardy soutěžích obecně.
Pro organizátory
A/D CTF
- Instrukce pro nastavení A/D CTF serveru.
Jeopardy
- Instrukce pro nastavení Jeopardy serveru.
Bezpečnost webových stránek
Webové stránky jsou často cílem útoků, protože jsou veřejně přístupné, mohou obsahovat citlivé informace a používá je téměř každý. Zde si ukážeme, jak fungují, jaké jsou nejčastější zranitelnosti a jak se proti nim bránit.
Jak fungují webové stránky
Webové stránky jsou tvořeny HTML, CSS a JavaScriptem. Když navštívíte webovou stránku, váš prohlížeč odešle požadavek na server, který obsahuje kód stránky. Server zpracuje tento požadavek a vrátí vám HTML, které prohlížeč zobrazí. CSS a JavaScript se načítají samostatně a zajišťují vzhled a interaktivitu stránky.
HTML
- HyperText Markup Language(HTML) se často označuje jako “kostra” webové stránky, protože určuje strukturu a obsah. Může obsahovat text, odkazy, obrázky, formuláře a další prvky.
- HTML používá značky (tagy) podobně jako XML. Dokument je tvořen hierarchickou strukturou, kde jsou tagy vnořeny do sebe.
- Například:
<div>
<h1>Nadpis</h1>
<p>Odstavec textu.</p>
</div>
CSS
- Často se označuje jako „vzhled“ webové stránky, protože určuje, jak bude stránka vizuálně vypadat.
- Cascading Style Sheets(CSS) se často označuje jako “vzhled” webové stránky, protože určuje, jak bude stránka vizuálně vypadat.
- Umožňuje měnit barvy, písma, rozložení a další vizuální vlastnosti.
- Používá selektory k cílení na konkrétní prvky HTML.
- Například:
p {
color: red;
}
změní barvu všech tagů <p> na červenou.
JavaScript
- JavaScript se často označuje jako “mozek” webové stránky, protože umožňuje interaktivitu a dynamické chování.
- Je to programovací jazyk, který běží v prohlížeči.
- Může reagovat na uživatelské akce, měnit obsah stránky a komunikovat se serverem.
- Může být použit pro validaci formulářů, vytváření animací, načítání dat bez obnovení stránky (AJAX) a mnoho dalšího.
- Dnes se často používá i na serveru (Node.js) pro vytváření webových aplikací, které lehce propojují frontend(uživatelské rozhraní) a backend (serverová logika).
- Moderní webové stránky často používají JavaScriptové frameworky jako React, Angular nebo Vue.js pro usnadnění vývoje a zlepšení uživatelského zážitku.
HTTP(S)
- HyperText Transfer Protocol je základním protokolem pro komunikaci mezi klientem (např. prohlížečem) a serverem.
- Existuje i bezpečnější verze HTTPS, která používá šifrování pro ochranu dat během přenosu. Písmeno S zde znamená “Secure”(zabezpečený).
- Je to hlavní protokol používaný pro přenos dat na webu.
- HTTP funguje na principu požadavku(request) a odpovědi(response).
- Klient odešle požadavek a server odpoví s daty, například HTML, CSS, JavaScript nebo jinými soubory.
HTML
- HyperText Markup Language je značkovací jazyk používaný pro vytváření struktury webových stránek.
- Není to programovací jazyk, ale jazyk pro popis obsahu (text, obrázky, odkazy, formuláře…).
- HTML definuje strukturu, zatímco vzhled řeší většinou CSS a chování JavaScript.
- Aktuální standard je HTML5, který je spravován organizací World Wide Web Consortium (W3).
- Je podobný XML, ale na rozdíl od XML má předem definovanou sadu tagů a prohlížeče jsou tolerantní k chybám v syntaxi.
- Existují i tzv. self-closing tagy, tedy tagy co se samy uzavírají, nepotřebují žádný obsah a ani ukončující tag.
Základní struktura HTML dokumentu
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<title>Název stránky</title>
</head>
<body>
<h1>Moje první stránka</h1>
<p>Toto je odstavec textu.</p>
</body>
</html>
<!DOCTYPE html>: Deklarace typu dokumentu, která říká prohlížeči, že se jedná o HTML5.<html>: Kořenový element, který obaluje celý obsah stránky.<head>: Obsahuje metadata, jako je kódování, název stránky, odkazy na styly a skripty.<title>: Určuje název stránky, který se zobrazuje v záložce prohlížeče.<body>: Obsahuje viditelný obsah stránky, jako jsou nadpisy, odstavce, obrázky, odkazy a další prvky.<h1>: Nadpis první úrovně, používá se pro hlavní nadpisy.<p>: Odstavec textu, používá se pro běžný text.- Každý HTML element musí být správně uzavřen, například
<p>...</p>- text v...je obsah odstavce.
Základní HTML tagy
<a>: Odkaz, používá se pro vytváření hypertextových odkazů.<img>: Obrázek, používá se pro vkládání obrázků do stránky. Tento tag je self-closing.<div>: Blokový element, používá se pro seskupování a stylování obsahu.<span>: Inline element, používá se pro stylování části textu.<ul>,<ol>,<li>: Neuspořádaný a uspořádaný seznam, používají se pro vytváření seznamů položek.<form>,<input>,<button>: Formulářové elementy, používají se pro vytváření interaktivních formulářů.
Atributy
- HTML elementy mohou mít atributy, které poskytují další informace o elementu.
- Atributy jsou ve formátu
název="hodnota"a jsou umístěny uvnitř otevíracího tagu. - Jeden z nejdůležitějších atributů jsou
classaid, které se používají pro identifikaci a stylování elementů pomocí CSS a JavaScriptu. - Například:
<a href="https://www.example.com">Odkaz</a>
Toto bude vypadat následovně:
-
V tomto příkladu je
href(hypertext reference) atribut, který určuje cílovou URL odkazu. -
Třeba u
<img>tagu je důležitý atributsrc, který určuje zdroj obrázku, aalt, který poskytuje alternativní text pro případ, že se obrázek nenačte.
<img src="https://picsum.photos/id/237/536/354" alt="Pes">
<img src="neexistuje" alt="Kočka">
- V tomto příkladu první obrázek se načte správně, zatímco druhý obrázek se nenačte a místo něj se zobrazí alternativní text “Kočka”:
Komentáře
- V HTML lze používat komentáře pro vysvětlení kódu nebo pro dočasné zakomentování části kódu. Komentáře se píší pomocí
<!-- -->. Například:
<!-- Toto je komentář v HTML -->
<p>Toto je odstavec textu.</p>
Shrnutí
- HTML je základní jazyk pro tvorbu webových stránek, který definuje strukturu a obsah.
- Používá tagy pro označení různých částí obsahu, jako jsou nadpisy, odstavce, odkazy a obrázky.
- Atributy poskytují další informace o elementech a umožňují jejich stylování a interaktivitu.
- Komentáře v HTML pomáhají vysvětlit kód a mohou být použity pro dočasné zakomentování části kódu.
Reference
CSS
- Cascading Style Sheets je jazyk používaný pro popis vzhledu a formátu v HTML dokumentech.
- Určuje barvy, velikosti, rozložení a další vizuální aspekty webových stránek.
- Odděluje obsah (HTML) od vzhledu (CSS), což umožňuje lepší organizaci a údržbu kódu.
- Fun fact! V CSS na základě rozšířených podmínek a další funkcí v Chromu postavil x86 emulátor. Je dostupný zde.
Syntaxe
- CSS se skládá z pravidel, která se skládají z selektoru a deklarace.
- Selektor určuje, které HTML elementy budou stylovány, například
ppro všechny odstavce nebo.classpro všechny elementy s danou třídou. - Deklarace se skládá z vlastnosti a hodnoty, které určují, jak bude element stylován, například
color: red;pro nastavení barvy textu na červenou. - Pravidla jsou uzavřena v složených závorkách
{}a jednotlivé deklarace jsou odděleny středníkem;. - Například:
p {
color: red;
font-size: 16px;
}
- Toto pravidlo říká, že všechny odstavce (
<p>) budou mít červenou barvu textu a velikost písma 16 pixelů.
Způsoby použítí CSS
- CSS může být zahrnuto do HTML dokumentu třemi způsoby:
- Inline styl: Přímo v HTML elementu pomocí atributu
style, například<p style="color: red;">Toto je červený text.</p>. - Interní styl: V hlavičce HTML dokumentu pomocí
<style>tagu, například:
<head>
...
<style>
p {
color: blue;
}
</style>
</head>
...
- Externí styl: V samostatném CSS souboru, který je propojen s HTML dokumentem pomocí
<link>tagu, například:
<head>
...
<link rel="stylesheet" href="styles.css">
</head>
Komentáře
- V CSS lze používat komentáře pro vysvětlení kódu nebo pro dočasné zakomentování části kódu. Komentáře se píší pomocí
/* */. Například:
/* Toto je komentář v CSS */
p {
color: red; /* Nastaví barvu textu na červenou */
}
Shrnutí
- Slouží k definování vzhledu HTML.
- Používá selektory a pravidla.
- Funguje na principu kaskády (Cascading).
- Umožňuje responzivní design.
- Odděluje strukturu (HTML) od prezentace (CSS).
Reference
JavaScript
HTTP
- HyperText Transfer Protocol je základním protokolem pro komunikaci mezi klientem (např. prohlížečem) a serverem.
- Funguje na 7. vrstvě OSI modelu (aplikační vrstva) a používá se pro přenos dat na webu.
- Až do 3. verze protokolu se používal pouze TCP protokol pro přenos dat, ale s příchodem HTTP/3 se začal používat protokol QUIC, který je založen na UDP.
- Je to hlavní protokol používaný pro přenos dat na webu.
- HTTP funguje na principu požadavku(request) a odpovědi(response).
- Skládá se ze dvou hlavních částí: hlavičky(header) a těla(body) - to platí jak pro požadavky, tak pro odpovědi.
header
- Hlavička(header) zprávy, která obsahuje metadata o požadavku nebo odpovědi, například typ obsahu, délku obsahu, kódování a další informace.
- Tato část zprávy je psaná v textovém formátu a je oddělena od těla zprávy prázdným řádkem.
první řádek hlavičky
- První řádek hlavičky obsahuje metodu (např. GET, POST) a URL pro požadavky, nebo stavový kód pro odpovědi.
- Pokud je to požadavek, první řádek obsahuje metodu, cestu a verzi HTTP.
- Pokud je to odpověď, první řádek obsahuje verzi HTTP, stavový kód a zprávu.
- Například:
Klient odešle požadavek:
GET /index.html HTTP/1.1
...
Server odpoví:
HTTP/1.1 200 OK
...
<data>
metody
- GET: Používá se pro získání dat ze serveru. Je to nejběžnější metoda a dle standardu se její tělo ignoruje. Zároveň by neměla mít žádné vedlejší efekty na serveru, což znamená, že by neměla měnit žádná data na serveru.
- POST: Používá se pro odesílání dat na server, například při odesílání formulářů. Tato metoda může mít tělo zprávy, které obsahuje data, která se odesílají na server.
- PUT: Používá se pro aktualizaci nebo vytvoření zdroje na serveru. Tato metoda může mít tělo zprávy, které obsahuje data, která se odesílají na server.
- DELETE: Používá se pro odstranění zdroje na serveru.
- HEAD: Používá se pro získání hlavičky odpovědi bez těla zprávy. Je užitečná pro získání informací o zdroji, aniž by bylo nutné stahovat celý obsah.
- OPTIONS: Používá se pro získání informací o podporovaných metodách a dalších možnostech serveru pro daný zdroj(cestu).
headery
- Následují další řádky hlavičky, které obsahují klíč-hodnota páry s dalšími informacemi - cookies, typ obsahu, délku obsahu, kódování a další.
- Tyto řádky jsou ve formátu
Klíč: Hodnotaa mohou být různé v závislosti na požadavku nebo odpovědi. - Používají se pro přenos důležitých informací mezi klientem a serverem, například pro autentizaci, nastavení cookies, určení typu obsahu, jazykové preference a další.
- Například:
Klient odešle požadavek:
Get /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Server odpoví:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 12
Hello World!
body
- Tělo zprávy, které obsahuje samotný obsah, například HTML, CSS, JavaScript nebo jiná data, ať už textová nebo binární.
- Objevuje se jak v požadavcích, tak v odpovědích, ale není povinné. Například GET požadavky obvykle nemají tělo zprávy, zatímco POST požadavky často obsahují data v těle zprávy.
HTTPS
- Bezpečnější verze HTTP, která používá šifrování pro ochranu dat během přenosu. Písmeno S zde znamená “Secure”(zabezpečený).
- Používá protokol TLS (Transport Layer Security) pro zabezpečení komunikace.
- Zajišťuje důvěrnost, integritu a autentizaci dat během přenosu.
- K ověření identity serveru se používají certifikáty, které jsou vydávány důvěryhodnými certifikačními autoritami (CA).
Ukázková HTTP komunikace
-
Navštívíte webovou stránku, například
http://www.example.com. -
Váš prohlížeč odešle HTTP GET požadavek na server
www.example.compro získání obsahu stránky. -
GET požadavek může vypadat takto:
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
- Server zpracuje tento požadavek a vrátí HTTP odpověď, která může vypadat takto:
HTTP/1.1 200 OK
Date: Sun, 01 Mar 2026 12:31:45 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip
Last-Modified: Wed, 25 Feb 2026 07:22:28 GMT
Allow: GET, HEAD
Age: 7405
cf-cache-status: HIT
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 9d59e5a63d9887f2-PRG
<!doctype html><html lang="en"><head><title>Example Domain</title><meta name="viewport" content="width=device-width, initial-scale=1"><style>body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}</style></head><body><div><h1>Example Domain</h1><p>This domain is for use in documentation examples without needing permission. Avoid use in operations.</p><p><a href="https://iana.org/domains/example">Learn more</a></p></div></body></html>
Nástroje
- devtools - nástroje pro vývojáře, které jsou součástí moderních webových prohlížečů a umožňují sledovat a analyzovat HTTP komunikaci mezi klientem a serverem.
- curl - nástroj pro interakci s nejen webovými servery pomocí různých protokolů, včetně HTTP, a umožňuje odesílat požadavky a zobrazovat odpovědi.
- burpsuite - komplexní nástroj pro testování bezpečnosti webových aplikací, který umožňuje zachytit, analyzovat a modifikovat HTTP(S) komunikaci mezi klientem a serverem.
- Wireshark - nástroj pro analýzu síťového provozu, kter, mimo jiné, umožňuje zachytit a analyzovat HTTP komunikaci na nižší úrovni.
Shrnutí
- HTTP (HyperText Transfer Protocol) je základní komunikační protokol webu.
- Slouží k výměně dat mezi klientem (např. prohlížečem) a serverem.
- Funguje na principu request (požadavek) -> response (odpověď).
- Každá zpráva se skládá z:
- hlavičky (header) - metadata (typ obsahu, délka, cookies, kódování…)
- těla (body) - samotná přenášená data (HTML, JSON, obrázky…)
- Nejčastější metody jsou: GET, POST, PUT, DELETE, HEAD, OPTIONS.
- Pro bezpečný přenos se používá HTTPS, které šifruje komunikaci pomocí TLS.
- Moderní verze jako HTTP/3 používá protokol QUIC (nad UDP) pro rychlejší přenos.
Reference
Devtools
- V dnešní době jsou v moderních prohlížečích vestavěny nástroje pro ladění webových stránek - DevTools(developer tools).
- Mají nástroje pro zkoumání a upravování elementů, webového provozu, debugování JavaScriptu, přístupu k lokálním datům a dalších částí webových stránek.
- Jednotlivé nástroje jsou rozděleny do záložek. Například
Inspector,Console,Network,Storage,Applicationapod.. - Lze otevřít na většině prohlížečů pomocí klávesové zkratky
Ctrl+Shift+I(Cmd+Option+Ina MacOS) - Níže je uvedeno několik míst, kde jsou často přistupovaná data, které se hodí znát:
Cookies
- Cookies jsou jedna z mála věcí, ke kterým se přistupuje odlišně ve Firefoxu a Chromu - toto zahrnuje i Chromium based browsery, jako třeba Vivaldi, Edge, Brave, Opera a další.
- Ve Firefoxu se k cookies přistupuje přes
Storagezáložku.
Ukázka cookies v prohlížeči Firefox
- V prohlížečích založených na Chromiu
Applicationzáložku. V té je podzáložkaStorage, kde se nacházejí cookies.
Ukázka cookies v prohlížeči Chromium
Network
- Network tab umožňuje procházet jednotlivé HTTP požadavky a odpovědi
- Umožňuje posílat znovu požadavky na server s upravenými parametry
- Je možné si zde zobrazit jednotlivé headery a body requestu
Ukázka provozu v prohlížeči Firefox
Inspektor
- V inspektoru lze procházet a upravovat HTML a CSS stránky.
- Zároveň se zde ukazuje velikosti elementů, padding, margin apod.
Ukázka inspektoru v prohlížeči Firefox
Útoky na webové aplikace
Injekční zranitelnosti
- Skupina injekčních zranitelností(injection flaws) je založená na nedostatečné sanitizaci uživatelských vstupů.
- Často
Příklady injekčních zranitelností
SQL injection
- Útok na Structured Query Language (SQL) databáze, která je často používána pro ukládání dat nejen pro webové aplikace. Útočník může vložit škodlivý SQL kód do vstupního pole, které je následně zpracováno databází. To může vést k neoprávněnému přístupu k datům, jejich úpravě nebo dokonce smazání.
XSS
- Cross Site Scripting je zranitelnost, která umožňuje útočníkovi vložit škodlivý skript do webové stránky, kterou navštěvují ostatní uživatelé. Tento skript může být použit k krádeži citlivých informací, jako jsou cookies nebo přihlašovací údaje, nebo k provedení neautorizovaných akcí jménem oběti.
Shell injection
- Útok, při kterém útočník vloží škodlivý příkaz do vstupního pole, které je následně zpracováno operačním systémem. To může vést k neoprávněnému přístupu k systému, krádeži dat nebo dokonce k úplnému převzetí kontroly nad systémem.
Ostatní zranitelnosti
CSRF
- Cross Site Request Forgery je zranitelnost, která umožňuje útočníkovi provést neautorizované akce na webové aplikaci, na kterou je oběť přihlášena. Útočník může například odeslat škodlivý požadavek jménem oběti, což může vést k nežádoucím změnám v účtu oběti nebo k neoprávněnému přístupu k citlivým informacím.
SQLi
- SQL injection je zranitelnost, která umožňuje útočníkovi vložit škodlivý SQL kód do vstupního pole, které je následně zpracováno databází. To může vést k neoprávněnému přístupu k datům, jejich úpravě nebo dokonce smazání.
- Může nastat, když aplikace nevaliduje nebo nesanitizuje vstupní data správně, což umožňuje útočníkovi vložit škodlivý SQL kód do dotazu, který je následně proveden databází.
Co je SQL?
- Structured Query Language (SQL) je jazyk používaný pro správu a manipulaci s relačními databázemi - tyto databáze se nazývají často SQL databáze. SQL umožňuje uživatelům vytvářet, upravovat a dotazovat se na data uložená v databázi.
- SQL se používá pro různé účely, včetně:
- Vytváření a správy databází a tabulek
- Vkládání, aktualizace a mazání dat
- Dotazování se na data pomocí příkazů SELECT
- Nastavení oprávnění pro uživatele a role
- Bližší informace o SQL a jeho příkazech naleznete v sekci o SQL.
Jak útok funguje?
- Útočník vloží škodlivý SQL kód do vstupního pole, které je následně zpracováno databází. Příklad v Pythonu:
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
user_input = "admin"
password_input = "password"
cursor.execute(f"SELECT * FROM users WHERE username = '{user_input}' AND password = '{password_input}'")
V tomo příkladu, pokud user_input nebo password_input obsahuje škodlivý SQL kód, může útočník získat neoprávněný přístup k datům nebo dokonce převzít kontrolu nad databází.
Jak databáze uvidí query
- Dejme tomu, že útočník vloží do
user_inputnásledující škodlivý SQL kód:admin' --. Výsledný SQL dotaz, který bude odeslán do databáze, bude vypadat takto:
SELECT * FROM users WHERE username = 'admin' --' AND password = 'password';
Takže databáze vykoná co vidí - to je vybere všechny uživatele s uživatelským jménem admin a ignoruje zbytek dotazu (včetně kontroly hesla) kvůli komentáři --. To může vést k neoprávněnému přístupu k datům nebo dokonce k převzetí kontroly nad databází.
Následky SQL injection
- SQL injection útoky mohou mít vážné důsledky pro bezpečnost a integritu dat.
- Pomocí složitých SQL injection útoků může útočník získat přístup k citlivým informacím, jako jsou uživatelská jména, hesla, osobní údaje nebo finanční informace. Může také upravovat nebo mazat data, což může vést k poškození databáze a ztrátě důležitých informací.
Ochrana proti SQL injection
- Pro ochranu proti SQL injection útokům je důležité správně validovat a sanitizovat vstupní data, používat parametrizované dotazy (prepared statements), nebo používat ORM (Object-Relational Mapping) knihovny, které automaticky zabraňují SQL injection útokům. Dále je důležité pravidelně aktualizovat software a používat bezpečnostní záplaty pro databázové systémy a webové servery.
- Příklad použití parametrizovaných dotazů v Pythonu s knihovnou
sqlite3:
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
user_input = "admin"
password_input = "password"
cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (user_input, password_input))
V tomto příkladu jsou vstupní data user_input a password_input předána jako parametry do SQL dotazu a až databáze je zpracovává. Toto zabraňuje útočníkovi vložit škodlivý SQL kód a tím zajišťuje bezpečnost aplikace proti SQL injection útokům.
sqlmap
- sqlmap je open-source nástroj na automatizované vyhledávání a exploataci SQL injection zranitelností v primárně webových aplikacích. Umožňuje testerům bezpečnosti a vývojářům identifikovat a opravit SQL injection zranitelnosti ve svých aplikacích.
- sqlmap podporuje různé databázové systémy, včetně MySQL, PostgreSQL, Oracle, Microsoft SQL Server a dalších. Nástroj nabízí širokou škálu funkcí, včetně detekce zranitelností, získávání dat z databáze, získávání informací o databázovém serveru a dalších.
- Ukázkové použití sqlmap pro testování SQL injection zranitelnosti na webové aplikaci:
sqlmap -u "http://example.com/vulnerable.php?id=1" --batch
Tento příkaz spustí sqlmap a testuje zranitelnost SQL injection na URL http://example.com/vulnerable.php?id=1. Volba --batch umožňuje sqlmapu pracovat bez interaktivního zadávání, což je užitečné pro automatizované testování.
- Pro první použití se hodí možnost
--wizard, která vás provede nastavením testování krok za krokem:
sqlmap --wizard
Shrnutí
- SQL injection je zranitelnost, která umožňuje útočníkovi vložit škodlivý SQL kód do vstupního pole, které je následně zpracováno databází.
- Jedná se o typ útoku způsobený nedostatečnou sanitizací uživatelského vstupu.
- Může vést k neoprávněnému přístupu k datům, jejich úpravě nebo dokonce smazání.
- sqlmap je nástroj pro automatizované vyhledávání a exploataci SQL injection zranitelností ve webových aplikacích.
Reference
SQL
-
Standard Query Language (SQL) je jazyk používaný pro správu a manipulaci s relačními databázemi - tyto databáze se nazývají často SQL databáze. SQL umožňuje uživatelům vytvářet, upravovat a dotazovat se na data uložená v databázi.
-
Funguje principielně podobně jako třeba excel. Data jsou organizována do tabulek, které se skládají z řádků a sloupců. Každá tabulka má své jméno a každý sloupec má svůj název a datový typ (například text, číslo, datum atd.).
-
SQL umožňuje provádět různé operace nad daty, jako je vkládání nových záznamů, aktualizace existujících záznamů, mazání záznamů a dotazování se na data pomocí různých kritérií. Dotazy v SQL jsou psány pomocí klíčových slov, jako jsou SELECT, INSERT, UPDATE, DELETE a další.
-
SQL je standardizovaný jazyk, což znamená, že existují různé implementace SQL pro různé databázové systémy (například MySQL, PostgreSQL, Oracle, Microsoft SQL Server atd.). Tyto implementace mohou mít své vlastní rozšíření a specifické funkce, ale základní syntaxe a koncepty SQL zůstávají stejné.
-
SQL je velmi důležitý pro práci s databázemi a je široce používán v různých odvětvích, jako jsou webové aplikace, podnikové systémy, datová analýza a další. Je to základní nástroj pro správu a manipulaci s daty v relačních databázích.
Co jsou to relační databáze?
-
Relační databáze jsou typem databáze, která organizuje data do tabulek, které jsou propojené pomocí vztahů. Každá tabulka obsahuje řádky (záznamy) a sloupce (atributy), které definují strukturu dat. Relační databáze umožňují efektivní ukládání, vyhledávání a manipulaci s daty pomocí SQL dotazů.
-
Relační databáze jsou založeny na matematické teorii relací a umožňují definovat vztahy mezi tabulkami pomocí klíčů (primární klíč, cizí klíč). Toto umožňuje efektivní organizaci dat a zajišťuje integritu dat v databázi. Například, pokud máme tabulku “Zaměstnanci” a tabulku “Oddělení”, můžeme použít cizí klíč k propojení těchto dvou tabulek a získat informace o zaměstnancích a jejich odděleních.
-
Takovým opakem jsou tzv. NoSQL databáze, které neorganizují data do tabulek a nejsou založeny na relačním modelu. NoSQL databáze jsou často používány pro práci s velkými objemy nestrukturovaných dat nebo pro specifické typy aplikací. Příkladem NoSQL databáze je MongoDB, která ukládá data ve formátu JSON a umožňuje flexibilní schéma.
Základní dotazy
CREATE
- Používá se k vytvoření nové tabulky v databázi. V různých databázových systémech se může využívat i pro ostatní objekty, jako jsou databáze, indexy, pohledy atd.
CREATE TABLE users (id INT PRIMARY KEY, jmeno VARCHAR(50));
Tento dotaz vytvoří novou tabulku s názvem “users” a dvěma sloupci: “id” a “jmeno”.
INSERT
- Používá se k vložení nových záznamů do databáze.
INSERT INTO users (id, jmeno) VALUES (1, 'John');
Tento dotaz vloží nový záznam do tabulky s hodnotami “id” = 1 a “jmeno” = ‘John’. Stringy se v SQL obvykle uzavírají do jednoduchých uvozovek (‘string’), zatímco čísla se zapisují bez uvozovek.
SELECT
- Používá se k výběru dat z databáze.
SELECT * FROM users;
Tento dotaz vybere všechny záznamy z tabulky. Výsledek by vypadal:
| id | jmeno |
|---|---|
| 1 | John |
UPDATE
- Používá se k aktualizaci existujících záznamů v databázi.
UPDATE users SET jmeno = 'James' WHERE id = 1;
Tento dotaz změní hodnotu “jmeno” na ‘James’ pro záznam, který má “id” = 1. Po provedení tohoto dotazu by výsledek dotazu SELECT * FROM users; vypadal takto:
| id | jmeno |
|---|---|
| 1 | James |
DELETE
- Používá se k odstranění záznamů z databáze.
DELETE FROM users WHERE podmínka;
Tento dotaz odstraní záznamy, které splňují podmínku.
Komentáře
- V SQL lze používat komentáře pro vysvětlení kódu nebo pro dočasné zakomentování části dotazu. Komentáře se píší pomocí dvou pomlček
--pro jednořádkové komentáře nebo pomocí/* */pro víceřádkové komentáře. Například:-- Toto je jednořádkový komentář/* Toto je víceřádkový komentář */
Různé implementace
- Jak již bylo zmíněno, existují různé implementace SQL pro různé databázové systémy. Každá implementace může mít své vlastní rozšíření a specifické funkce, ale základní syntaxe a koncepty SQL zůstávají stejné. Například MySQL, PostgreSQL, Oracle a Microsoft SQL Server jsou populární databázové systémy, které podporují SQL.
- Mezi nejpoužívanější databázové systémy podporující SQL patří například MySQL, PostgreSQL, Oracle Database nebo Microsoft SQL Server.
- Nejpopulárnější databázové systémy
- MySQL: Open-source databázový systém, který je široce používán pro webové aplikace.
- PostgreSQL: Open-source databázový systém, který je známý pro svou robustnost a podporu pokročilých funkcí.
- Oracle Database: Komerční databázový systém, který je často používán ve velkých podnicích.
- Microsoft SQL Server: Komerční databázový systém, který je často používán ve firemním prostředí a integruje se s dalšími produkty Microsoftu.
- SQLite - jednoduchá open-source databáze, která se od ostatních liší tím, že ukládá všechna data do jediného souboru. Nevyžaduje samostatný databázový server, což ji činí vhodnou pro menší projekty, mobilní aplikace nebo vývoj a testování.
Integrace do programovacích jazyků
- SQL se často používá v kombinaci s programovacími jazyky, jako jsou Python, Java, C# a další, pro práci s databázemi. Programovací jazyky poskytují knihovny a nástroje pro připojení k databázi, provádění SQL dotazů a zpracování výsledků. Například v Pythonu lze použít knihovnu
sqlite3pro práci s SQLite databází nebopsycopg2pro práci s PostgreSQL databází. - Při programování s databázemi se často používá binding, což je technika, která umožňuje bezpečné vkládání hodnot do SQL dotazů a zabraňuje SQL injection útokům. Binding se provádí pomocí parametrů, které jsou nahrazeny skutečnými hodnotami při provádění dotazu. Například v Pythonu s knihovnou
sqlite3lze použít následující kód pro bezpečné vložení hodnot do SQL dotazu:
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
user_name = "John"
user_age = 30
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (user_name, user_age))
conn.commit()
- V tomto příkladu jsou hodnoty
nameaagebezpečně vloženy do SQL dotazu pomocí parametrů?, což zabraňuje SQL injection útokům.
Shrnutí
- SQL je jazyk pro správu a manipulaci s relačními databázemi.
- Umožňuje vytvářet, upravovat a dotazovat se na data uložená v databázi.
- Každá implementace SQL může mít své vlastní rozšíření, ale základní syntaxe zůstává stejná.
- Pro využití SQL v programovacích jazycích se často používají knihovny a nástroje pro připojení k databázi a bezpečné provádění SQL dotazů.
Reference
XSS
-
Cross Site Scripting (XSS) je zranitelnost webových aplikací, která umožňuje útočníkovi vložit škodlivý JavaScript kód do webové stránky zobrazované ostatním uživatelům.
-
Tento kód se následně spustí v prohlížeči oběti, což může vést ke krádeži cookies, session tokenů, přesměrování uživatele na škodlivé stránky nebo manipulaci s obsahem stránky.
-
XSS se vyskytuje v situacích, kdy webová aplikace nesanitizuje uživatelský vstup pořádně.
-
Nejčastěji se používá testovací payload
<script>alert('XSS!')</script>, který zobrazí jednoduché upozornění, ale útočníci mohou použít mnohem sofistikovanější kód pro různé škodlivé účely.
Alternativy k <script>
- Existují i jiné způsoby, jak spustit škodlivý JavaScript kód bez použití
<script>tagu, například pomocí atributůonerrorneboonclickv HTML elementech. Například:
<img src=# onerror="alert('XSS!')">
- Toto má několik výhod oproti tradičnímu
<script>tagu, protože některé filtry mohou být navrženy tak, aby blokovaly pouze<script>tagy, ale ne jiné způsoby spouštění JavaScriptu. - Dále také
<skript>tag může být umístěn pouze v určitých částech HTML dokumentu, zatímco<img>sonerrormůže být umístěn téměř kdekoli, což zvyšuje pravděpodobnost úspěchu útoku.
Obecný příklad útoku
- Nechť je webová aplikace, kde si uživatelé mohou ukládat cítaty a ostatní uživatelé je mohou vidět:
<h2>Citáty</h2>
<ul>
<li>Život je krásný.</li>
<li>Každý den je nový začátek.</li>
<li>Nezáleží na tom, jak pomalu jdeš, dokud nezastavíš.</li>
<li>Štěstí přeje připraveným.</li>
<li>I malý krok vpřed je stále krokem k cíli.</li>
<li>Největší překážky jsou často jen v naší hlavě.</li>
<li>Kdo chce, hledá způsoby. Kdo nechce, hledá důvody.</li>
<li>Úspěch je součet malých snah opakovaných každý den.</li>
<li>Nikdy není pozdě začít znovu.</li>
<li>Sny se stanou skutečností, když pro ně něco uděláš.</li>
</ul>
Citáty provided by ChatGPT
Pokud webová aplikace umožňuje uživatelům přidávat své vlastní citáty bez řádné sanitizace, útočník může vložit škodlivý JavaScript kód místo citátu a stránka bude vypadat například takto:
<h2>Citáty</h2>
<ul>
<li>Život je krásný.</li>
<li>Každý den je nový začátek.</li>
<li>Nezáleží na tom, jak pomalu jdeš, dokud nezastavíš.</li>
<li>Štěstí přeje připraveným.</li>
<li>I malý krok vpřed je stále krokem k cíli.</li>
<li>Největší překážky jsou často jen v naší hlavě.</li>
<li>Kdo chce, hledá způsoby. Kdo nechce, hledá důvody.</li>
<li>Úspěch je součet malých snah opakovaných každý den.</li>
<li>Nikdy není pozdě začít znovu.</li>
<li>Sny se stanou skutečností, když pro ně něco uděláš.</li>
<li><img src=# onerror=alert('XSS!')></li>
</ul>
Ukázka
- Takto to bude vypadat v praxi:
Citáty
- Život je krásný.
- Každý den je nový začátek.
- Nezáleží na tom, jak pomalu jdeš, dokud nezastavíš.
- Štěstí přeje připraveným.
- I malý krok vpřed je stále krokem k cíli.
- Největší překážky jsou často jen v naší hlavě.
- Kdo chce, hledá způsoby. Kdo nechce, hledá důvody.
- Úspěch je součet malých snah opakovaných každý den.
- Nikdy není pozdě začít znovu.
- Sny se stanou skutečností, když pro ně něco uděláš.
- V tomto příkladu, když uživatel zadá škodlivý kód do vstupního pole a klikne na tlačítko “Přidat citát”, nový citát se přidá do seznamu a škodlivý JavaScript kód se spustí, což zobrazí upozornění “XSS!”.
- Pokud by jsme v tomto místě použili
<script>alert('XSS')</script>tag, nefungovalo by to. To protože<script>není umístěn na správném místě v HTML dokumentu.
Druhy XSS
- Existují tři hlavní druhy XSS útoků:
Stored
- Útočník vloží škodlivý kód do databáze nebo jiného úložiště na serveru, a tento kód se pak zobrazuje všem uživatelům, kteří navštíví infikovanou stránku.
- Je to nejzávažnější typ XSS útoku, protože škodlivý kód je uložen na serveru a může být zobrazen mnoha uživatelům.
- Například, pokud útočník vloží škodlivý JavaScript kód do komentáře na blogu, tento kód se zobrazí všem návštěvníkům, kteří si tento komentář přečtou.
Reflected
- Útočník vloží škodlivý kód do URL nebo formuláře, a tento kód se pak odrazí zpět uživateli v odpovědi serveru.
- Tento typ XSS útoku je méně závažný než stored XSS, protože škodlivý kód není uložen na serveru a je zobrazen pouze uživateli, který klikne na škodlivý odkaz nebo odešle škodlivý formulář.
- Například útočník může vytvořit škodlivý odkaz, který obsahuje škodlivý JavaScript kód, a když uživatel klikne na tento odkaz, kód se spustí v jeho prohlížeči
https://example.com/search?q=<script>alert('XSS!')</script>
DOM-based
- DOM XSS se vyznačuje tím, že škodlivý kód je zpracováván pouze na straně klienta (v prohlížeči) a není odesílán na server.
- Útočník vloží škodlivý kód do URL nebo formuláře, a tento kód se pak zpracovává JavaScriptem na straně klienta, což může vést ke spuštění škodlivého kódu v prohlížeči oběti.
- XSS není DOM based, pokud se nevyužívá JavaScript pro zpracování škodlivého kódu na straně klienta.
- Tento typ XSS útoku je nejméně závažný, protože škodlivý kód není zpracováván serverem a je zobrazen pouze uživateli, který klikne na škodlivý odkaz nebo odešle škodlivý formulář.
- Například útočník může vytvořit škodlivý odkaz, který obsahuje škodlivý JavaScript kód, a když uživatel klikne na tento odkaz, kód se zpracuje v jeho prohlížeči a může vést ke spuštění škodlivého kódu.
https://example.com/page#<script>alert('XSS!')</script>
Následky XSS
- Odcizení cookies a session tokenů, což může vést k převzetí účtu oběti.
- Přesměrování uživatele na škodlivé stránky, které mohou obsahovat malware nebo phishingové útoky.
- Měnání obsahu stránky, což může být použito k šíření dezinformací nebo k manipulaci s uživateli.
Ochrana proti XSS
- Pro ochranu proti XSS útokům je důležité správně validovat a sanitizovat uživatelský vstup, používát knihovny pro escapování.
- Používání Content Security Policy (CSP) může pomoci omezit možnosti spouštění škodlivého JavaScript kódu na webové stránce.
- Pravidelně aktualizovat software a používat bezpečnostní záplaty pro webové servery a frameworky, které mohou obsahovat opravy pro známé XSS zranitelnosti.
Nástroje
Nástroje, které pomáhají při testování proti XSS útokům, zahrnují:
- Burp Suite: Populární nástroj pro testování bezpečnosti webových aplikací, který obsahuje funkce pro detekci a exploitaci XSS zranitelností.
- ZAP: Open-source nástroj pro testování bezpečnosti webových aplikací, který také nabízí možnosti pro detekci XSS zranitelností.
- XSStrike: Nástroj pro detekci a exploitaci XSS zranitelností, který se zaměřuje na různé techniky útoků a obchází běžné filtry.
Shrnutí
- XSS je zranitelnost webových aplikací, která umožňuje útočníkovi vložit škodlivý JavaScript kód do webové stránky zobrazované ostatním uživatelům.
- Jedná se o typ útoku způsobený nedostatečnou sanitizací uživatelského vstupu.
- Může vést ke krádeži cookies, session tokenů, přesměrování uživatele na škodlivé stránky nebo manipulaci s obsahem stránky.
- Pro ochranu proti XSS útokům je důležité správně validovat a sanitizovat uživatelský vstup, používat knihovny pro escapování a implementovat Content Security Policy (CSP).
Reference
- https://owasp.org/www-community/attacks/xss/
- https://portswigger.net/web-security/cross-site-scripting
CSRF
-
Cross Site Request Forgery (CSRF) je zranitelnost, která umožňuje útočníkovi provést neautorizované akce na cílovou(jinou) webovou aplikaci, než oběť aktuálně používá.
-
Protože oběť je přihlášena k cílové webové aplikaci, útočník může využít její oprávnění k provedení škodlivých akcí, jako je změna nastavení účtu, odesílání zpráv nebo dokonce převzetí kontroly nad účtem oběti.
-
Útok CSRF funguje tak, že útočník vytvoří škodlivý odkaz nebo formulář, který obsahuje požadavek na webovou aplikaci, na kterou je oběť přihlášena. Když oběť klikne na tento odkaz nebo odešle formulář, požadavek je odeslán na webovou aplikaci s oprávněními oběti, což umožňuje útočníkovi provést neautorizované akce.
Příklad útoku
- Uživatel je přihlášen na webovou stránku - např.
example.coma má oprávnění provádět určité akce, například změnit své heslo. - Útočník vytvoří škodlivou webovou stránku - např.
malicious.com, která obsahuje formulář pro změnu hesla naexample.coma umístí tento formulář na svou stránku. - Formulář může vypadat náísledovně:
<h2>Win a new phone!</h2>
<form action="http://example.com/change_password" method="POST">
<input type="hidden" name="new_password" value="hacked123">
<input type="submit" value="Click here to win!">
</form>
Takto bude vypadat formulář:
Win a new phone!
- Když uživatel navštíví
malicious.coma klikne na tlačítko “Click here to win!”, formulář se odešle naexample.coms oprávněními uživatele, což umožňuje útočníkovi změnit heslo oběti na “hacked123” bez jejího vědomí.
Následky CSRF
-
CSRF útoky mohou mít závažné dopady na bezpečnost uživatelských účtů i celé aplikace.
-
Útočník může provádět akce jménem oběti bez jejího vědomí – například změnit heslo, e-mail nebo jiné nastavení účtu.
-
Může dojít k neoprávněnému odesílání formulářů (např. objednávek, zpráv, převodů peněz).
-
V případě administrátorských účtů může útok vést až k úplnému kompromitování aplikace (např. změna konfigurace nebo mazání dat).
Ochrana proti CSRF
- Proti CSRF útokům existuje několik účinných obranných mechanismů:
CSRF tokeny (anti-CSRF tokeny)
- Každý formulář obsahuje unikátní, náhodně generovaný token, který server ověřuje při každém požadavku.
- Útočník tento token nezná, takže nemůže vytvořit validní požadavek.
SameSite cookies
- Nastavení cookie atributu SameSite (Strict nebo Lax) omezuje odesílání cookies při cross-site požadavcích.
- Tím se zabrání automatickému přihlášení oběti při útoku.
Ověření HTTP hlaviček
- Kontrola hlaviček jako Origin nebo Referer pomáhá ověřit, odkud požadavek pochází.
Použití POST místo GET
- Kritické operace (např. změna hesla) by neměly být dostupné přes GET požadavky.
Dvoufaktorová autentizace (2FA)
- I pokud dojde k CSRF útoku, dodatečné ověření může zabránit provedení citlivé akce.
Shrnutí
-
CSRF je závažná zranitelnost, která umožňuje útočníkovi provést neautorizované akce jménem oběti.
-
Umožňuje to pomocí cookies a dalších autentizačních mechanismů, které jsou automaticky odesílány prohlížečem.
-
Útoky CSRF mohou mít vážné důsledky pro bezpečnost uživatelských účtů i celé aplikace.
-
Ochrana proti CSRF zahrnuje použití CSRF tokenů, nastavení SameSite cookies, ověření HTTP hlaviček, používání POST místo GET pro kritické operace a implementaci dvoufaktorové autentizace (2FA).
-
Pravidelná aktualizace a bezpečnostní záplaty jsou také důležité pro minimalizaci rizika CSRF útoků.
Reference
CTF
Capture The Flag CTF jsou skvělým způsobem, jak si osvojit a procvičit dovednosti v oblasti kybernetické bezpečnosti prostřednictvím praktických úloh a soutěží.
Co je to CTF?
CTF je soutěžní formát používaný v oblasti kybernetické bezpečnosti, kde jednotlivci nebo týmy soutěží v řešení různých bezpečnostních výzev.
Cílem je “zachytit vlajku” (flag), což je speciální řetězec znaků(např. FLAG{example_flag}), čímž se prokazuje úspěšné vyřešení úlohy.
Dělí se primárně na dva typy:
- Jeopardy-style: Soutěžící řeší různé úlohy z různých kategorií a získávají body za každou vyřešenou úlohu.
- Attack-Defense: Týmy se snaží chránit své systémy před útoky ostatních týmů, zatímco útočí na systémy soupeřů.
Kategorie úloh
CTF soutěže zahrnují různé kategorie úloh, mezi které patří:
- Kryptografie: Řešení šifrovaných zpráv nebo prolomení šifer.
- Reverzní inženýrství: Analyzování binárních souborů za účelem pochopení jejich funkce nebo nalezení zranitelností.
- Forenzika: Analýza digitálních stop, jako jsou logy, paměťové dumpy nebo síťový provoz.
- Webová bezpečnost: Hledání a využívání zranitelností v webových aplikacích.
- Síťová bezpečnost: Analyzování a útoky na síťové protokoly a služby.
Attack/Defense CTF
Úvod
A/D(Attack/Defense) CTF je druh CTF, při kterém každý tým má svůj server, na kterém běží několik služeb. Cílem, stejně jako u jeopardy CTF, je nasbírat co nejvíce bodů, avšak zde se získávají úplně jinak. Jsou dvě hlavní cesty, jak získávat bodový náskok nad ostatními - útočení(attack) a bránění(defense). A/D CTF se snaží být blízkou simulací reálného světa, protože učí jak útočení (red team), tak chránění(blue team). Dále ještě učí monitorování síťového provozu, protože díky tomu týmy mohou zjistit, kterých zranitelností využívají ostatní týmy.
Servery(vulnboxy)
Každý tým má svůj vlastní server, na kterém běží několik služeb. Týmy mají přístup k těmto serverům přes SSH a mohou na nich instalovat, konfigurovat a spravovat služby podle svých potřeb.
Tick
tick určuje jak často se spouští kontroly služeb a aktualizuje žebříček.
Během jednoho ticku se provádí následující kroky:
- Každá služba na každém týmu je zkontrolována pomocí kontrol.
- Body za obranu(defense points) jsou přiděleny týmům za funkční služby.
- Body za útok(attack points) jsou přiděleny týmům za úspěšné útoky na služby ostatních týmů.
- Žebříček je aktualizován na základě získaných bodů.
tick obvykle trvá 1-3 minuty.
Kontroly(Checkers)
Kontroly jsou skripty, které ověřují funkčnost služeb na týmech.
Každá služba má svou vlastní kontrolu, která je spuštěna jednou za tick.
Kontroly mohou provádět různé akce, jako je odesílání požadavků na službu, ověřování odpovědí
a kontrola dostupnosti služby.
Služby(services)
Služby jsou hlavní částí A/D CTF, protože přesně na ně týmy útočí a snaží se je chránit.
Nejčastěji to jsou webové servery, nebo textové protokoly, které běží v Docker kontejnerech.
Služby jsou jednou za tick zkontrolovány pomocí kontrol.
Pokud služba funguje správně, tým získá body za obranu(defense points). Pokud služba nefunguje, tým nezíská žádné body.
Vlajky(flags)
Vlajky jsou speciální řetězce znaků, které jsou generovány službami a slouží jako důkaz, že služba je funkční. Zároveň jejich získáním se ověřuje, že tým úspěšně útočil na službu jiného týmu. Vlajky tým posílá na submission server, který je ověří a přidělí týmu body za útok(attack points).
Síťování
Jednotlivé týmy jsou připojeny do jedné velké sítě pomocí VPN. Každý tým má svou vlastní podsíť, ve které běží jeho služby. Důležité je, že všechny týmy mohou komunikovat mezi sebou, což umožňuje útoky na služby ostatních týmů. Zároveň vše prochazí přes router, který všechny packety NATuje. Toto zajišťuje, že týmy nepoznají, kdo je kdo - vše jde z jedné IP adresy.
NOP team
NOP(NO Player) team je speciální tým, který nehraje aktivně v soutěži. Využívá se k testování útoků a k ověřování funkčnosti služeb bez rizika ztráty bodů v soutěži. Tým se krom toho chová úplně stejně jako ostatní týmy.
A/D CTF na vlastním serveru
Možnosti nastavování
- Manuální nastavení (pokročilé) - návod zde
Stažení
Zip soubor se serverem, službami a dalšímy konfiguračnímy soubory je dostupný zde.
Požadavky
- Výkonný Linux server.
- Přístup od hráčů k serveru na jeden UDP port (pro Wireguard) - nastavitelné.
- Docker a Docker Compose nainstalované na serveru.
Jak to funguje?
Celý FAUST ctf-gameserver běží v Docker kontejnerech na serveru pomocí Docker Compose.
Tento setup je z A/D na ECSC 2022.
Wireguard se musí spustit na hostitelském systému, aby umožnil připojení hráčů do herní sítě. Také je možné spustit Wireguard v Docker kontejneru, kde ale musí být network_mode: "host".
Vulnboxy hračy spouští v QEMU, jsou generovány pomocí libguest a pomocí skriptu se vygenerují, nastaví síť a nainstalují potřebné balíčky - sshd, docker apod.
Hrači se připojují přes Wireguard VPN do herní sítě a mají přístup k vulnboxům a herní infrastruktuře.
Rozložení sítě
- Celá herní síť je na 10.200.0.0/14 subnetu na wireguard VPN.
- Každý tým má svůj 10.200.<číslo týmu>.0/24 subnet, kde 10.200.<číslo týmu>.1 je vulnbox a 10.200.<číslo týmu>.101 je první VPN hráče.
- Herní router má IP adresu 10.201.1.1 a směruje provoz mezi týmy.
- Na 10.202.0.0/15 subnetu jsou servery herní infrastruktury.
Diagram sítě
Na vytvoření diagramu byla využita webová stránka draw.io
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.
Jeopardy CTF
Jeopardy CTF na vlastním serveru
- Tento manuál popisuje, jak nastavit a nasadit GZ::CTF server pro účely jeopardy CTF soutěží.
- Toto nastavení je primárně pro menší soutěže, které nevyžadují komplexní infrastrukturu.
- Následují instrukce jsou určeny pro administrátory, informace pro účastníky jsou zde.
Požadavky
Před zahájením konfigurace se ujistěte, že máte následující požadavky splněny:
- Server s operačním systémem Linux, který bude sloužit jako hostitel pro GZ::CTF server.
- Nainstalovaný Docker, Docker compose a máte k nim práva.
- Přístup k internetu pro stažení potřebných závislostí.
- Popř. nginx/wireguard pro přístup k serveru z internetu(nepopsáno v tomto manuálu).
Konfigurace serveru
- Většina informací je přebrána z dokumentace GZ::CTF
- Konfigurace serveru je velice jednoduchá - je potřeba jen upravit 2 soubory:
- docker-compose.yaml
- appsettings.json
docker-compose.yaml
- Tento soubor obsahuje konfiguraci pro spuštění GZ::CTF serveru pomocí Docker Compose.
- Pro bližší informace o jednotlivých nastaveních se podívejte na dokumentaci GZ::CTF.
- Upravte hodnoty
GZCTF_ADMIN_PASSWORDaPOSTGRES_PASSWORDna silná hesla, aby byl server bezpečný.
services:
gzctf:
image: gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=TBD"
- "LC_ALL=en_US.UTF-8"
ports:
- "80:8080"
volumes:
- "./data/files:/app/files"
- "./appsettings.json:/app/appsettings.json:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
depends_on:
- db
db:
image: postgres:alpine
restart: always
environment:
- "POSTGRES_PASSWORD=TBD"
volumes:
- "./data/db:/var/lib/postgresql"
appsettings.json
- Tento soubor obsahuje konfiguraci pro GZ::CTF server, včetně nastavení pro databázi, služby a další.
- Pro bližší informace o jednotlivých nastaveních se podívejte na quick start GZ::CTF.
- Upravte hodnotu Password v databáze na stejné heslo jako v docker-compose.yaml, aby se server mohl připojit k databázi.
- Dále je potřeba upravit
XorKeyna silný náhodný řetězec, který bude použit pro šifrování a dešifrování dat. PublicEntryje adresa, na které bude server přístupný z internetu. Upravte ji na veřejnou IP adresu nebo doménové jméno vašeho serveru, aby účastníci mohli přistupovat k serveru z internetu.- Pokud chcete mailový server na ověřování účtů, reset hesla nebo pro jiné účely, je potřeba upravit
EmailConfigs informacemi o vašem SMTP serveru a přihlašovacími údaji.
{
"AllowedHosts": "*",
"ConnectionStrings": {
"Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=TBD"
},
"EmailConfig": {
"SenderAddress": "",
"SenderName": "",
"UserName": "",
"Password": "",
"Smtp": {
"Host": "localhost",
"Port": 587
}
},
"XorKey": "TBD",
"ContainerProvider": {
"Type": "Docker",
"PortMappingType": "Default",
"EnableTrafficCapture": false,
"PublicEntry": "TBD",
"DockerConfig": {
"Uri": "unix:///var/run/docker.sock"
}
},
"CaptchaConfig": {
"Provider": "None",
"SiteKey": "",
"SecretKey": ""
},
"ForwardedOptions": {
"ForwardedHeaders": 7,
"ForwardLimit": 1,
"KnownIPNetworks": ["192.168.12.0/24"]
}
}
Spuštění serveru
- Po úpravě konfigurace můžete spustit server pomocí následujícího příkazu v terminálu:
docker-compose up -d
- Tento příkaz spustí GZ::CTF server a databázi v oddělených kontejnerech. Server bude přístupný na adrese
http://localhost(nebo na adrese, kterou jste nastavili vPublicEntry). - Pro přístup do administrátorského rozhraní použijte následující přihlašovací údaje:
- Uživatelské jméno:
admin - Heslo: Hodnota, kterou jste nastavili v
GZCTF_ADMIN_PASSWORDv docker-compose.yaml.
- Uživatelské jméno:
- Po přihlášení do administrátorského rozhraní můžete začít přidávat služby, týmy a další konfigurace pro vaši CTF soutěž.
- Případně můžete importovat i celou CTF hru odsud.