S_Fold6_10 Advertisement S_Fold6_10 Advertisement S_Fold6_10 Advertisement

Python a kybernetická bezpečnosť – 17. časť

0

V tejto časti seriálu plynule nadviažeme na predošlú časť, kde sme vám predstavili jednoduchú aplikáciu klient – server, prostredníctvom ktorej sme na server (vzdialený počítač) zasielali obsah Windows Clipboardu. Naprogramujeme novú verziu našej vzorovej aplikácie (v5.1), ktorá bude plniť tú istú funkciu, ale diametrálne odlišným spôsobom. Naším cieľom bude ukryť a preniesť údaje (informácie) pomocou služieb, ktoré prioritne nie sú určené na prenos údajov. Táto technika sa všeobecne označuje ako tunelovanie (tunneling). Nie je pritom dôležité, či údaje zašifrujeme, alebo ponecháme v otvorenej podobe. Tunelovanie výrazne sťažuje prácu bezpečnostným systémom a analytikom. Keby tí chceli ukryté údaje identifikovať, museli by sledovať a vyhodnocovať kompletne všetky dáta, ktoré sú prenášané v kontrolovanej sieti, bez zamerania sa na konkrétnu službu, vrstvu či protokol.

Tunelovanie

Jedným zo základných cieľov útočníkov pri kompromitácii cudzích systémov je získanie údajov (informácií). Je pritom jedno, o aké informácie ide. Niektoré môžu byť zaujímavé, niektoré nie. Znalosť niektorých dokáže otvoriť dvere k ďalším a ďalším službám, naopak, niektoré informácie útočníkov iba pobavia a nijako ich nevyužijú. Každopádne akékoľvek informácie sú pre útočníkov cennými čriepkami, ktorých poskladaním môžu dosiahnuť veľké veci. Prenos údajov medzi útočníkovým a napadnutým systémom – či už v otvorenej, alebo zašifrovanej forme – nemusí vždy prebiehať priamo s využitím služieb na to určených. Práve naopak, pri veľmi sofistikovaných útokoch sa takéto služby nevyužívajú. Útočníci použijú na prenos údajov úplne iné (cudzie) služby, a to také, ktoré nie sú bežne určené na prenos údajov. Ako príklad sme v našom prípade použili HTTP Cookie a DNS Query. Prenos údajov takýmto spôsobom nie je bežný, ale nie je vylúčený.

HTTP Cookie sa používa na prenos údajov menšieho rozsahu najmä z dôvodu ukladania stavových informácií. Ide napríklad o manažment session, personalizáciu či tracking používateľa. DNS Query sa používa na získavanie IP adries priradených konkrétnemu hostname. DNS Requests, resp. Questions sú zasielané na servery pracujúce v rámci Domain Name System (DNS), ktoré zasielajú klientom požadované odpovede.

V oboch prípadoch možno namiesto manažmentových údajov, resp. požiadaviek, zaslať ľubovoľné nami zvolené údaje. Znamená to, že protokoly HTTP a DNS „zneužijeme“, inak povedané, „vytunelujeme“.

TunnelingClient.py

Pokračujeme vo využívaní prostredia klient – server, ktorého klientska aplikácia má isté prvky malvéru. Počítame s tým, že ju nejakým spôsobom (napr. e-mailom) dostaneme na cieľový počítač, kde ju spustí nič netušiaci bežný používateľ alebo, čo je ešte lepšie, priamo administrátor systému. Aplikácia na svojom začiatku získa MAC a IP adresu klienta a zadefinuje MAC a IP adresu servera + cieľové porty. Na HTTP prenos sme vybrali port 8888 a na DNS prenos port 1111.

Aplikácia potom v nikdy nekončiacej slučke vykonáva nasledujúcu činnosť:

1. priebežne načítava obsah Clipboardu,

2. pripraví reťazec „src_ip|xxx|načítaný obsah Clipboardu“, ktorý zakódovaný s využitím kódovania Base64 umiestni do obsahu Cookie hlavičky a v rámci požiadavky requests.get() zašle na HTTP server,

3. rozdelí načítaný obsah Clipboardu na časti vo veľkosti 10 znakov,

4. pripraví IP paket, do ktorého dns položky qd umiestni DNS Query Record (DNSQR) naplnený príslušnou časťou údajov, zakódovanou s využitím kódovania Base64,

5. pripravený paket zašle pomocou funkcie srp1() knižnice Scapy na konkrétny server.

Zopakujme si, že spojenie so serverom je v tomto prípade inicializované zo strany klienta. Firewall klienta teda bude aplikovať Outgoing Policy, takže spojenie by nemalo byť ničím obmedzené.


Obr. 1 Pracovné prostredie na tunelingový prenos údajov

TunnelingServer

Na strane servera ako obvykle spúšťame aplikáciu Dash, tentoraz s názvom TunnelingServer, pričom z dôvodu, že v rámci aplikácie spúšťame funkciu sniff() knižnice Scapy, musíme ju spustiť ako root. Tak ako naposledy do zložky pages sme pridali nový súbor page6.py a vykonali potrebné úpravy v súboroch components/navbar.py a index.py. Súbor page6.py obsahuje definíciu dvoch nových tried: TunnelingHTTPServerClass() a TunnelingDNSServerClass(), ktoré sú doplnené o triedu myRequestHandler() a funkcie putDNSdata() a getDNSdata().

Triedy TunnelingHTTPServerClass() a myRequestHandler() majú na starosti spracovanie požiadaviek zaslaných na HTTP server zo strany klienta. Ich úlohou je získať údaje zaslané prostredníctvom hlavičky Cookie, oddeliť IP adresu klienta od údajov a doplniť novo prijaté údaje do príslušného Pandas DataFramu. Klientovi na záver zasielajú odpoveď HTTP response status code 200 = Successful response, ktorú doplnia o verziu HTTP servera a aktuálny dátum.

Trieda TunnelingDNSServerClass() rieši spracovávanie DNS paketov, a to prostredníctvom funkcie sniff() paketového analyzátora Scapy. Po každom prijatom pakete je volaná funkcia getDNSdata(), v rámci ktorej dochádza k extrakcii údajov z DNS Question Record (DNSQR) a v prípade, že ide o časť údajov, dôjde k doplneniu tejto časti do postupne kompletizujúceho sa reťazca. Klient zaslaním špeciálneho reťazca |xxx| informuje server o zaslaní všetkých častí, čím dôjde na strane servera ku skompletizovaniu reťazca a k jeho doplneniu do príslušného DataFramu. Klientovi sa priebežne po prijatí každej časti údajov zasiela odpoveď pomocou funkcie putDNSdata().

Obsah DataFramov sa periodicky vypisuje na obrazovku v rámci tabuliek Dash DataTable, teda po každom úspešne prijatom Cookie a po každom skompletizovanom reťazci, ktorého časti boli prijaté prostredníctvom DNS požiadaviek, získame obsah Clipboardu doplnený o IP adresu klienta, ktorý dané údaje zaslal.


Obr. 2 Grafický výstup aplikácie TunnelingServer

Z výstupu aplikácie TunnelingServer možno vyčítať, že sme od klienta s IP adresou 192.168.1.63 získali viacero údajov, ako napr. použité URL adresy a niekoľko textových informácií skopírovaných do Clipboardu.

Poznámka: Všetky zdrojové kódy možno stiahnuť zo stránky softengine.sk.

Marek Sopko

Zobrazit Galériu

Marek Sopko

Všetky autorove články

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať