Python a kybernetická bezpečnosť / 26. časť
V tejto časti seriálu sfinalizujeme informácie týkajúce sa nástroja Nmap a využijeme ich na prípravu programového kódu v jazyku Python, ktorý bude riešiť tie isté úlohy, aké sme doposiaľ riešili prostredníctvom príkazov nmap spúšťaných v termináli. Z portfólia príkazov sme vybrali tie, ktoré realizujú nasledujúce tri skeny: SYN Stealth Scan, TCP Connect Scan a FIN Scan. Získané výsledky zobrazujeme v nám známom webovom prostredí aplikácie Sieťový skener, tentoraz vo verzii 8.0.
Python3-nmap
Ide o klasickú knižnicu (modul) Python, ktorá prostredníctvom svojich tried a ich metód formátuje (upravuje) argumenty príkazu nmap a následne tento príkaz vykonáva, čím pripravuje zoznamy, ktoré sú výsledkami jednotlivých druhov skenov. Z tejto definície je jasné, že na fungovanie metód python3-nmap treba mať nainštalovaný a funkčný nástroj Nmap. V Linuxe môžeme spomínané komponenty doinštalovať jednoduchými príkazmi sudo apt-get install nmap a pip3 install python3-nmap. Metódy python3-nmap volajú príkaz nmap úplne rovnako, ako keby sme ho spúšťali v termináli. To platí aj pre spúšťanie nmap v privilegovanom režime, teda ak chceme vykonať príkaz nmap prostredníctvom metód python3-nmap, musíme naše skripty spúšťať takisto v privilegovanom režime ako superuser (root). Moduly potrebné na beh nášho skriptu si budeme musieť takisto nainštalovať do prostredia privilegovaného režimu pomocou príkazu sudo pip3 install...
Knižnica python3-nmap deklaruje a definuje tri základné triedy:
1. Nmap,
2. NmapHostDiscovery,
3. NmapScanTechniques,
ktoré obsahujú nasledujúce metódy:
|
nmap_list_scan(), nmap_fin_scan(), nmap_idle_scan(), nmap_ping_scan(), nmap_syn_scan(), nmap_tcp_scan(), nmap_udp_scan() |
List scan, FIN scan, IDLE scan, Ping scan, SYN scan, TCP Connect scan, UDP scan |
|
scan_top_ports() |
Sken stavu najpoužívanejších portov |
|
nmap_dns_brute_script() |
Získanie zoznamu subdomén s využitím skriptu dns-brute |
|
nmap_subnet_scan() |
Sken podsietí |
|
nmap_os_detection() |
Identifikácia OS |
|
nmap_version_detection(), nmap_version() |
Získanie verzie nmap, resp. verzie služby |
|
nmap_portscan_only() |
Host Discovery |
|
nmap_no_portscan() |
No port scan |
|
nmap_arp_discovery() |
ARP Discovery |
|
nmap_disable_dns() |
Disable DNS |
SYN Stealth Scan
Pyhon vykoná príkaz nmap s argumentmi -v = zvýš úroveň reportovania, -oX = vytvor výstup vo formáte XML a -sS = TCP SYN Scan:
/usr/bin/nmap -v -oX - -sS 172.20.10.1-13
Získame tak zoznam zariadení/portov, ktoré odpovedali na SYN, ale spojenie sa nenadviaže, pretože nmap namiesto ACK zašle RST. Ide teda o tzv. neviditeľný/nehlučný (stealthy) sken, ktorý pomerne spoľahlivo rozoznáva otvorené, zatvorené a filtrované stavy portov. Okrem iného získame hostname, MAC adresy, zoznamy portov a mnoho ďalších detailov.

Obr. 1 Časť textového výpisu výsledkov aplikácie Sieťový skener – Nmap skeny
TCP Connect Scan
V tomto prípade Pyhon vykoná príkaz nmap s argumentmi -v = zvýš úroveň reportovania, -oX = vytvor výstup vo formáte XML a -sT = TCP Connect Scan:
/usr/bin/nmap -v -oX - -sT 172.20.10.1-13
Získame zoznam zariadení/portov, ktoré odpovedali na systémové volanie connect(). Pripomeňme si, že Connect scan spojenie vytvorí a následne ho riadne ukončí bez odoslania obsahových údajov, čo vyvolá dojem korektne prebiehajúcej komunikácie (na rozdiel od RST, ktorý zasiela SYN Scan). Upozorňujeme, že takéto správanie môže vyvolať zvýšený záujem detekčných systémov.
FIN Scan
Pyhon vykoná príkaz nmap s argumentmi -v = zvýš úroveň reportovania, -oX = vytvor výstup vo formáte XML a -sF = FIN Scan:
/usr/bin/nmap -v -oX - -sF 172.20.10.1-13
Získame zoznam zariadení/portov, ktoré neodpovedali (open/filtered), resp. odpovedali RST (closed). Pri FIN Scan je nastavený FIN flag, pričom otvorené porty nijako nereagujú, ale zatvorené porty sú „zmätené“ a zašlú RST paket. V prípade, ak cieľové zariadenie odošle ICMP unreachable, port sa doplnkovo označí ako filtrovaný.
Sieťový skener v8.0
Do ôsmej verzie našej vzorovej aplikácie sme doplnili nový súbor pages/page9.py a upravili príslušné časti ostatných súborov aplikácie tak, aby s ním korektne pracovali. Najdôležitejšie časti jeho programového kódu sú nasledujúce:
1. import knižnice nmap3,
2. definícia troch DataFrame na uloženie výsledkov jednotlivých skenov – SYN_scan_data, TCP_scan_data, FIN_scan_data,
3. úprava vzhľadu stránky – zmena názvu tlačidla na spustenie skenov – 'SPUSTI NMAP SKENY', doplnenie ProgressBaru, úprava vzhľadu a obsahu troch DataTable – page9table1, page9table2, page9table3,
4. definícia funkcie read_dicts(), prostredníctvom ktorej načítavame požadované údaje zo slovníka a podslovníkov, ktoré sú výstupmi jednotlivých nmap príkazov, zaujímajú nás najmä údaje ako hostname, macaddress, ports a state,
5. definícia Callback funkcie update_page9run(), ktorá po stlačení tlačidla spustí nmap skeny a ich výsledky uloží do príslušných DataFrame,
6. zobrazenie obsahu DataFrame v rámci Dash tabuliek.

Obr. 2 GUI aplikácie Sieťový skener s výsledkami vykonaných skenov
Obsah tabuliek, resp. stránky je automaticky obnovovaný, to značí, že používateľ po stlačení tlačidla nemusí vykonať žiadnu ďalšiu činnosť a už iba sleduje výstup bežiacich skenov. V programovom kóde absentuje detekcia chybových stavov a výnimiek. Kód sme v maximálnej miere zjednodušili s cieľom prezentovať, akým spôsobom možno v rámci programového kódu napísaného v jazyku Python vykonať príkazy nástroja Nmap. Využili sme pri tom metódy konkrétnej triedy nmap3.NmapScanTechniques(), ktoré generovali už spomínané argumenty príkazov nmap a po ich vykonaní pripravili výstup vo forme slovníkov Python, ich podslovníkov a zoznamov. Potom nám už nič nebránilo prečítať uvedené slovníky a zoznamy, presunúť požadované údaje do DataFrame a ich obsah zobraziť v príslušných tabuľkách v rámci webového prostredia.
Poznámka: Všetky zdrojové kódy možno stiahnuť zo stránky softengine.sk.
Zobrazit Galériu