Toto je manuál pre detektor sieťových slabín, ktorý je výsledkom bakalárskej práce študenta Peter Šuhaj na FIT VUT v roku 2018.

Funkcia:
    Nástroj poskytuje detekciu zapísaných slabín sieťových protokolov v jazyku YAML v špcifikovanom súbore PCAP.
    Pri detekcií slabiny vypíše chybovú hlášku na štandardný výstup.
    Program skončí keď skontroloval všetky zapísané slabiny v zadanom súbore PCAP.

Podrobnejší popis funkčnosti:


Spustenie: 
    python3.6 detector.py cesta_k_pcap cesta_k_priečinku_slabín
    
    cesta_k_pcap: obsahuje absolútnu alebo relatívnu cestu k PCAP 
    cesta_k_priečinku_slabín: udáva cestu k priečinku, ktorý obahuje súbory YAML pre jednotlivé protokoly. 
                              Načítajú sa rekurzívne všetky súbory s koncovkou .yml.

Zápis všeobecne:

názov_slabiny:
    error:
        - výraz1
        - výraz2
            .
            .
    [operator: AND/OR]
    mode: single/all
    message: Chybová hláška


-názov_slabiny: užívateľom zvolený názov pre danú slabinu v zápise. Má byť unikátny pre správnu funkčnosť programu.

-error: obsahuje výraz/y, ktoré sú postupne vyhodnotené a na konci na ich výsledky(True alebo False) je aplikovaný logický operátor. Výraz musí 
        obsahovať jeden porovnávací operátor(>,<,>=,<=,!=,==), môže obsahovať reťazce, číselné hodnoty, názvy atribútov paketu a základné aritmetické 
        operátory(+,-,*,/). Príklady výrazov: 
                                              hsrp.hellotime >= 3*hsrp.holdtime
                                              smtp.rsp == "EHLO"

        Taktiež môže obsahovať pomocné funkcie(COUNT,AVG,MIN,MAX,SUBSTR,FQIPV6,UNIQUE). Parametrom funkcie môže byť
        vlastnosť paketu, alebo vlastnosť paketu s podmienkou(porovnávanie), kde funkcia bude zavolaná iba nad tými hodnotami paketu, kde platí
        podmienka. Tieto podmienky môžu byť aj viaceré spojené pomocou logických operátorov(and, or). Príklady:
                                              AVG(ip.len) > 40
                                              COUNT(udp.port > 50) <= 10
                                              MAX(udp.port > 50 and ip.len > 40) > 100

        Okrem funkcií výraz môže obsahovať aj konštrukciu foreach. Príklad: 
                                              foreach x in UNIQUE(eth.src) COUNT(ip.len > 40 and eth.src == x) > 10

        UNIQUE(eth.src) vráti pole hodnôt cez ktoré sa bude iterovať premennou x, v ďalšej časti zápisu sa x nahradí hodnotou a nájdu sa 
        hodnoty COUNT(ip.len > 40 and eth.src == x)(ukladajú sa hodnoty ip.len) pre každý x. Na konci sa celý výraz vyhodnotí.  
        Program kontroluje syntaktickú správnosť zápisu výrazov, pri chybe upozorní výpisom na štandartný výstup.


-operator: jedná sa o volitelný parameter. Môže byť AND alebo OR. Obsahuje logický operátor, ktorý bude aplikovaný 
           na výsledky jednotlivých výrazov v rámci jedného zápisu. Pri absencii tejto položky sa implicitne používa AND.  

-mode: určuje spôsob vyhodnotenia výrazov, presnejšie udáva spôsob hľadania hodnôt jednotlivých 
       vlastností paketov v súbore PCAP. V oboch prípadoch sa prehladá celý súbor. Pri móde single pri iterácií nad paketmi sa vyhľadajú a uložia hodnoty aktuálneho paketu a výraz je vyhodnotený pomocou týchto hodnôt, tj. n paketov znamená n-krát vyhodnotenie výrazu. Pri all sa prejde každý paket, postupne sa ukladajú hodnoty z paketov a iba raz(na konci) je vyhondotený výraz s hondotami z celého súboru.

-message: obsahuje chybovú hlášku, ktorá bude vypísaná na štandardný výstup pri prezencie slabiny, tj. 
          ak výsledok vyhodnotenia výrazov v položke error je pravdivý(True).

Ak sa v konfiguračných súboroch objaví zápis slabiny s nepodporovaným názvom vlastnosti alebo niektorá povinná vlasnosť chýba 
tak sa vypíše chyba a pokračuje sa na ďalšiu slabinu.


Príklad zápisu slabiny:

kratky_holdtime:
    error: 
        - hsrp.holdtime < 3*hsrp.hellotime
        - hsrp.opcode == 0
    mode: single
    message: Nízka hodnota prametru HoldTime.

Ďalšie príklady zápisov sú dostupné v už hotových zápisoch jednotlivých slabín v súboroch YAML.
