wekknsie/IPK_Project1

GitHub: wekknsie/IPK_Project1

Stars: 0 | Forks: 0

# IPK Projekt Jedná se o síťový skener, který pracuje na čtvrté vrstvě modelu OSI, tedy transportní vrstvě a zjišťuje stav TCP a UDP portů na zadaném síťovém zařízení. ## TCP popis U protokolu TCP se posílá packet s příznakem SYN a očekává odpověď serveru pokud je port otevřený nebo zavřený. Pokud žádnou odpověď nedostaneme, port považujeme filtrovaný. Při navázání spojení se serverem dostaneme paket SYN, ACK a tedy víme, že na tomto portu je komunikace otevřena, pak tedy za nás kernel pošle RST paket na ukončení spojení. Pokud dostaneme jako odpověď od serveru RST paket, port je zavřený. ## UDP popis Zde si můžeme být jistí pouze zda je port otevřený nebo zavřený. UDP je bez spojový protokol, tedy neposílá žádný potvrzovací paket. Pokud nám jako odpověď přijde “*ICMP Port Unreachable*” port je zavřený, nicméně jestliže nedostaneme žádnou odpověď tak port je buď filtrovaný nebo otevřený a my ho považujeme za otevřený. # Použití ## Testování V Makefilu je připraven jeden test na ukázku funkčnosti programu, který lze spustit příkazem `make run` ## Ruční testování Skenování `./ipk-l4-scan [-i interface | --interface interface] [--pu port-ranges | --pt port-ranges | -u port-ranges | -t port-ranges] {-w timeout} [hostname | ip-address]` Výpis nápovědy `./ipk-l4-scan --help` Výpis dostupných rozhraní `./ipk-l4-scan --interface` # Implementace Program je rozdělený na několik částí, které jsou všechny součástí jednoho souboru ipk-l4-scan.cpp ## Hlavní soubor ### Argumenty O správnosti zadaných argumentů se stará třída **argumentParser**. Všechny proměnné jsou zde privátní a přistupuje se k nim přes funkce *get\[nazev_proměnné]();*. ### Získání vlastní IP adresy Funkce *getSourceIP()* vrací lokální IP adresu, kterou stroj použil k navázání cílového spojení s *target_ip*, aniž by spojení opravdu navázal ### Převedení domény na IPv4 adresu O toto se stará funkce *dnsLoopUp()*, která vezme string *hostname* a převede ho na IPv4 adresu. Funguje to tak, že se vytvoří struktura pro získání odpovědi z DNS serveru, ten se následně kontaktuje s danou doménou a pokud existuje překlad na IP adresu, tak ji následně z té struktury vytáhne a vrátí nám ji. ### Posílání TCP paketu Tato část se stará o ruční vytvoření a odeslání TCP SYN paketu pomocí raw socketu, včetně výpočtu vlastního TCP checksumu. Jako první je zde pomocná struktura *pseudo_header*, která slouží k výpočtu TCP checksumu. Na tento výpočet je potřeba další funkce *checksum()*, která vypočítá 16ti bitový kontrolní součet velikosti hlavičky. Hlavní je funkce *sendTcpSyn()*, jenž vytvoří TCP hlavičku, vytvoří pseudo-header zavolá již zmíněnou funkci *checksum* a jako poslední pošle SYN paket na zadanou IP adresu a daný port za pomocí funkce *sendto()*. ### Posílání UDP paketu Tato část kódu se stará o odeslání UDP paketu na zadanou IP adresu a port. Využívá se zde běžný UDP socket a ne raw socket, narozdíl od posílání TCP paketu. ### Zachytávání paketů Pro zachytávání paketů se využívá knihovna **libpcap**. Pro zpracování přijatých paketů je tady funkce *packetHandler*. Jako první zjišťuje, zda nevypršel timeout na daný port. Následně se kontrolují TCP odpovědi, zda je port otevřený (odpověď SYN-ACK) nebo zavřený (RST). Pokud přijde ICMP odpověd pro UDP paket, znamená to, že port je zavřený. Pokud jsou všechny porty hotové, buď jsme dostali odpověď, nebo vypršel timeout, tak se ukončí poslouchání příchozích paketů. ### Řízení celého skenování O toto se stará hlavní funkce *main*. Prvně se zpracují argumenty, následně se vybere síťové rozhraní, pokud je zadán interface, jestliže není, vypíše se seznam dostupných rozhraní. Nastaví se struktura *ScanContext*, která obsahuje data jako jsou například délka timeoutu, skenované porty, nebo IP adresa cílového stroje. Pak se odešlou TCP a UDP pakety na dané porty a poslouchají se příchozí pakety. Jako poslední proběhne výpis portů. ## Makefile Výchozí cíl Makefilu je *cpp*. Používá překladač g++ a verzi jazyka C++20. Příkazem "make" se přeloží soubor a příkazem "make run" se přeloží a spustí testovací příkaz, který na stroji s doménou "server.datexo.cz", kontroluje tři TCP porty, a dva UDP porty s timeoutem nastavým na jednu sekundu. # Závěr ## Závislosti a licence Tento program používá následující knihovny třetích stran: - libpcap – BSD licence (https://www.tcpdump.org/) - glibc – GNU LGPL (běžná součást Linuxu) - Standardní C++ knihovna – Public Domain / ISO Všechny knihovny jsou kompatibilní s AGPL-3.0.