
Python a kybernetická bezpečnosť / 9. časť
V rámci tohto článku budeme pokračovať v rozvíjaní aplikácie Sieťový skener. Tentoraz sa zameriame na tzv. Domain Name System (DNS). Aplikáciu doplníme o jednoduchý DNS skener, prostredníctvom ktorého budeme môcť získavať informácie o úlohách, ktoré plnia jednotlivé sieťové zariadenia. Je totiž bežné, že prevádzkovatelia sieťových služieb nazývajú jednotlivé servery podľa účelu, na ktorý slúžia. To, či je v našom bezprostrednom okolí nainštalovaný nejaký DNS server, môžeme zistiť sledovaním prevádzky na všeobecne známom porte 53. DNS je ako kniha, ak ju vieme správne čítať, vieme z nej získať mnoho zaujímavých informácií.
DNS systém / proces
DNS predstavuje komplexnú hierarchiu názvov (domain names), ktorá slúži na to, aby sme si nemuseli pamätať IP adresu každého zariadenia, s ktorým chceme komunikovať. To sa týka nielen prehliadania webového obsahu, ale aj poštových služieb, prehliadania či zdieľania sieťových zložiek, komunikácie s okolím, resp. všeobecne komunikácie so sieťovými službami a zariadeniami z pohľadu človeka. DNS možno prirovnať k telefónnemu zoznamu, v ktorom sú jednotlivým IP adresám zariadení priradené ich slovné, zväčša ľahko čitateľné a zrozumiteľné názvy. Detailný opis fungovania DNS systému ďaleko presahuje rámec tohto článku. Na základný rozhľad spomenieme iba niekoľko najdôležitejších faktov.
Proces získania IP adresy zariadenia na základe jeho názvu iniciuje klient prostredníctvom tzv. Stub Resolvera. Ten zašle DNS požiadavku tzv. Recursive Resolveru, ktorý ju ďalej rieši na úrovni Root – Top Level Domain (TLD) – Authoritative servera. Authoritative server vo výsledku zašle klientovi nájdenú IP adresu prostredníctvom Recursive a Stub Resolvera.
Stub Resolver |
Softvérový nástroj, tzv. čiastkový resolver, spravujúci DNS požiadavky medzi aplikáciou a Recursive Resolverom |
Internet Service Provider (ISP) Recursive Server Recursive Resolver |
DNS služba zodpovedná za kompletné vyriešenie DNS požiadavky |
Root Server |
Koreňový server v DNS hierarchii |
TLD Server |
Server spravujúci poslednú časť názvu zariadenia = Top Level Domain |
Authoritative Server |
Server spravujúci jednotlivé názvy zariadení v rámci danej TLD |
Obr. 1 Zjednodušený diagram DNS procesu
Do uvedeného procesu, samozrejme, vstupujú ďalšie drobnosti ako domény/subdomény (domains/subdomains), priebežné ukladanie údajov (DNS caching), názvové súbory (hostnaming), typy záznamov (DNS records), typy požiadaviek (DNS queries), reverzný DNS (reverse DNS), dynamický DNS (DDNS)…
Každopádne výsledkom DNS procesu je v prípade úspechu IP adresa prislúchajúca k zadanému názvu domény/subdomény. Táto IP adresa sa následne použije na komunikáciu medzi klientom a požadovanou službou (serverom, resp. iným klientom).
Aplikácia Sieťový skener v3.0
V rámci tretej verzie našej vzorovej aplikácie sme implementovali jednoduchý DNS sken. Vytvorili sme nový súbor pages/page3.py, ktorý obsahuje novú triedu DNSSnifferClass().
Programová logika je mierne zložitejšia. Stránka okrem výsledkovej tabuľky obsahuje dve vstupné polia. Prvé slúži na zápis názvu domény, ktorú chceme skenovať. Druhé obsahuje zoznam prefixov názvov subdomén, ktoré sa majú doplniť k zvolenému názvu domény a následne skenovať.
Samotný sken sa vykoná po stlačení tlačidla SKEN – START, čím dôjde k spusteniu metódy DNSScan(). Tá vo svojom tele volá rekurzívnu metódu DNSRequest(), ktorá rieši DNS požiadavky cestou objektu triedy dns.resolver.Resolver() modulu resolver.py. Metóda resolve() vracia zoznam IP adries spojených s názvom zvolenej domény/subdomény ako objekt triedy dns.resolver.Answer.
V prípade úspešného nájdenia IP adresy (adries) sa následne k tejto IP adrese (IP adresám) prostredníctvom metódy DNSReverse() získajú názvy (hostname) zariadení = domén/subdomén v tzv. reverznom DNS procese s využitím funkcie socket.gethostbyaddr(). V prípade nájdenia nových názvov domén/subdomén, resp. aliasov, dôjde k rekurzívnemu zavolaniu metódy DNSRequest(). Aplikácia teda prostredníctvom uvedeného procesu hľadá IP adresy k zadanému názvu domény, k zadaným názvom subdomén (prefix.doména) a k názvom domén/subdomén, ktoré boli nájdené v rámci reverzného DNS procesu.
Výsledky, tzv. názvy domén/subdomén a k nim prislúchajúce IP adresy, sa ukladajú do Pandas DataFrame objektu dns_data, ktorého obsah je pravidelne zobrazovaný v tabuľke.
Obr. 2 Výstup aplikácie NetScanner v3.0 – prijaté odpovede na zaslané DNS požiadavky
Použiteľnosť získaných výsledkov
Ak vezmeme do úvahy portfólio prefixov subdomén, dokážeme po vykonaní DNS skenu v sieti identifikovať prítomnosť nasledujúcich serverov/služieb:
dns, ns |
DNS server |
ftp |
FTP server |
www, web |
Webový server |
mail, email, exchange, smtp, pop, imap, mx |
Poštový server |
myslq |
MySQL server |
DNS sken implementovaný v rámci našej aplikácie vytvára v sieti „hluk“, ale pri jeho správnom použití možno túto činnosť ľahko zakryť. Požiadať DNS server o IP adresu nie je nič zvláštne ani výnimočné. DNS Authoritative servery prijímajú obrovské množstvo takýchto požiadaviek bez toho, aby im to bolo podozrivé. Stačí, ak do nášho webového prehliadača zadáme doposiaľ neznámy názov, DNS Resolver nášho OS požiada o nájdenie korešpondujúcej IP adresy. Tento proces sa opakuje stále dookola, to znamená, že nie je ničím podozrivý. Je však jasné, že len čo vložíme do zoznamu prefixov veľa položiek a požiadavky zašleme bezprostredne po sebe, niektorý zo „strážcov“ DNS serverov si to môže všimnúť. Našu aplikáciu by sme mohli zlepšiť tak, že DNS Requesty budeme zasielať v náhodnom časovom intervale s určitým odstupom. Každopádne je veľmi nepravdepodobné, že s obozretným využitím funkcií DNS Stub Resolvera vyvoláme príliš veľké podozrenie.
Zobrazit Galériu