====== Gnutella protokol ====== ===== Sažetak ===== //Peer-to-peer// [[https://techterms.com/definition/p2p|(P2P)]] tehnologija se često koristi za preuzimanje datoteka unutar mreže na velikim brzinama. Što se više ova tehnologija razvija, sve se više povećava broj korisnika i čvorova u cijeloj mreži te tako ona postaje kompleksnija. Kako ovakve mreže imaju puno korisnika, primamljive su hakerima i podložne su raznim napadima. Ovaj seminarski rad bavi se Gnutella protokolom koji pripada P2P mrežama. Kratko je opisan način na koji se u Gnutella mrežu uključuju novi klijenti, komunikacija među klijentima, pretraživanje te preuzimanje datoteka unutar mreže. Također, opisani su neki sigurnosni nedostaci ovog protokola i mogući napadi na njega. Ključne riječi: Peer-to-Peer, Gnutella, napad ===== Uvod ===== Peer-to-Peer mreže se najčešće koriste za dijeljenje podataka među korisnicima. Putem ove mreže korisnici mogu preuzimati jedni od drugih multimedijske datoteke, podatke, programe itd. Preuzimanje ovakvih datoteka i sadržaja nije uvijek legalno na što treba obratiti pozornost. Najpopularnije P2P mreže su [[https://techterms.com/definition/bittorrent|BitTorrent]], Gnutella i [[https://www.techopedia.com/definition/7314/freenet|Freenet]]. U ovom seminarskom radu bit će detaljnjije opisana Gnutella mreža. Gnutella, kao i ostale P2P mreže, dizajnirana je kako bi zadovoljila sljedeće ciljeve: * Dinamičnost - omogućava korisnicima da se u bilo kojem trenutku pridruže ili napuste mrežu * Skalabilnost – povećanje broja korisnika rezultira povećanjem opsega rada mreže (ovo može predstavljati problem) * Pouzdanost – u slučaju napada * Anonimnost ===== Gnutella protokol ===== Gnutella je protokol u kojem podatke razmjenjuju ravnopravna računala koristeći //peer-to-peer// mrežu. Ovaj protokol uglavnom se koristi za pretraživanje i dijeljenje datoteka. Sam izraz Gnutella predstavlja i grupu računala koji imaju Gnutella aplikaciju i tako tvore virtualnu mrežu. Gnutella protokol podržava tradicionalni model klijent-server no on je u suštini [[https://www.cert.hr/wp-content/uploads/2019/04/NCERT-PUBDOC-2009-11-282.pdf|decentralizirani model]]. Svako računalo u mreži predstavlja čvor koji može funkcionirati i kao klijent i kao server te se može pridružiti ili napustiti mrežu u bilo kojem trenutku bez utjecaja na ostatak mreže. Svaki čvor može slati upite ostalim čvorovima i prihvaćati upite čvorova koji se podudaraju sa sadržajem na vlastitom tvrdom disku. Sljedeća slika prikazuje arhitekturu decentralizirane P2P mreže. {{ :racfor_wiki:mrezna_forenzika:p2p.png?400 }} Gnutella mreža je nestrukturirana, a raspodjela datoteka unutar nje može biti sasvim slučajna. To predstavlja problem kako broj čvorova raste. Svaki dostupni čvor odgovara na upit bilo kojeg drugog čvora slanjem svog cjelokupnog sadržaja. Podaci koji dolaze do čvora se proporcionalno povećavaju s brojem čvorova u mreži. To je razlog zbog kojeg je mogućnost proširenja mreže ograničena. ==== Tipovi poruka ==== Gnutella protokol definira način na koji računala u mreži komuniciraju. Sljedeća tablica prikazuje vrste poruka: |**TIP** |**OPIS** | |Ping|Koristi se za otkrivanje poslužitelja (engl. //Host//) u mreži. Sudionik koji primi //ping// poruku trebao bi odgovoriti jednom ili više //pong// porukom.| |Pong|Odgovor na //ping//. Sadrži adresu sudionika i informacije o količini podataka koje stavlja na raspolaganje mreži.| |//Query//(Upit)|Koristi se za pretraživanje mreže. Ako //peer// otkrije podudaranje u svojim lokalnim podacima, odgovara //QueryHit//-om.| |QueryHit (Odgovor)|Odgovor na upit. Primatelj dobiva informacije o podacima koji odgovaraju upitu.| |Push|Zahtjev za preuzimanje datoteka od peer-ova zaštićenih vatozidom (engl. //Firewall//).| \\ ==== Pridruživaje klijenata i međusobna komunikacija ==== Novi klijenti koji se tek uključio u mrežu, ne zna informacije o ostalim //peer//-ovima u mreži te se ne može povezati s njima. Kako bi saznao IP adrese/priključke //peer// -ova koji postoje u mreži, novi klijent koristi //bootstrap// čvor. //Bootstrap// čvor sadrži listu //peer//-ova koji su uključeni u mrežu. Novi klijent se pomoću te liste može povezati s aktivnim //peer//-om koristeći [[http://mreze.layer-x.com/s040100-0.html|TCP]](//Transmission Control Protocol//). Novi klijent (P) šalje //ping// poruku aktivnom klijentu mreže s kojim se povezao (Q). Aktivni klijent prosljeđuje //ping// poruku klijentima s kojima je on povezan (A,B) te se poruka tom analogijom širi mrežom (do C,D,E). Ovaj način prosljeđivanja poruke naziva se preplavljivanje mreže i prikazan je sljedećom slikom: {{ :racfor_wiki:mrezna_forenzika:ping.png?400 |n}} Preplavljivanje se ograničava u zaglavlju poruke TTL (engl. //Time-To-Live//) vrijednošću. Na sljedećoj slici je prikazano zaglavlje poruke. {{ :racfor_wiki:mrezna_forenzika:zaglavlje.png?400 }} **ID poruke** - 16-bajtni jedinstveni identifikator poruke u mreži **Tip** - tip poruke: Ping (0x00), Pong (0x01), Push (0x40), Query (0x80), QueryHit (0x81) **TTL** - Vrijednost koja označava koliko će puta poruka biti proslijeđena mrežom prije nego što nestane. Svaki klijent do kojega je poruka stigla će smanjiti ova vrijednost prije nego što proslijedi poruku idućem klijentu. Kada ova vrijednost dođe do 0, poruka se više neće prosljeđivati mrežom. //**Hops**// - Vrijednost koja pokazuje koliko je puta poruka proslijeđena. **Duljina poruke** - Duljina informacija koje dolaze nakon zaglavlja. Nakon što svi potrebni klijenti prime //ping// poruku, oni odgovaraju s //pong// porukom. //Pong// poruka se vraća istim putem kojim je došla //ping// poruka. Novi klijent (P) prima mnoštvo //pong// poruka te preko njih može odabrati nove klijente s kojima će se povezati TCP protokolom. Kako bi mreža konstantno bila ažurirana Svi //peer//-ovi šalju //ping// poruke periodično. Na sljedećoj slici prikazan je put jedne //pong// poruke. {{ :racfor_wiki:mrezna_forenzika:pong.png?400 }} Dok je //ping// poruka jednostavno predstavljena samo zaglavljem poruke (duljina poruke je 0), //pong// poruka sadrži dodatne informacije nakon zaglavlja. Slika prikazuje zaglavlje //pong// poruke: {{ :racfor_wiki:mrezna_forenzika:zagl_pong.png?400 }} **Priključak** - Broj priključka na kojem odgovarajući poslužitelj može prihvatiti vezu. **IP adresa** - IP adresa odgovarajućeg poslužitelja. **Broj dijeljenih datoteka** - Broj datoteka koje ovaj poslužitelj dijeli s mrežom. **Veličina dijeljenih datoteka** - Veličina datoteka koje ovaj poslužitelja dijeli s mrežom u kilobajtima. ==== Pretraživanje ==== Pretraživanje se temelji na preplavljivanju mreže upitima. Upiti se šalju postojećim TCP vezama i funkcioniraju na gotovo isti način kao //ping// poruke. Uspješni odgovori se vraćaju istim putem kojim je došao upit i funkcioniraju gotovo isto kao //pong// poruke. Ako je upit uspješno pronađen, odgovor sa informacijama o tom klijentu dolazi do klijenta koji je poslao upit. Ta dva klijenta uspostavljaju direktnu vezu i razmjenjuju podatke preko [[http://mreze.layer-x.com/s050100-0.html|HTTP]](//Hypertext Transfer Protocol//). Ako postoji više klijenata koji odgovaraju na upit, klijent koji je poslao upit može odabrati onog koji mu je najoptimalniji (ovisno o brzini prijenosa). Ako ne postoji odgovor na upit, pretraživanje se smatra neuspješnim. Sljedeća slika prikazuje razmjenu podataka između klijenata A i D. A šalje upit klijentu B koji ga prosljeđuje kroz mrežu dok ne dobije odgovor. Klijent D šalje odgovor i prosljeđuje ga istim putem do računala A šaljući informacije o svojoj IP adresi, priključku, brzini prijenosa i slično. Klijenti A i D se direktno povezuju i razmjenjuju podatke. {{ :racfor_wiki:mrezna_forenzika:komun.png?400 }} Ako klijent primi odgovor na upit od klijenta koji je zaštićen vatrozidom i ne može uspostaviti vezu, može poslati //push// poruku. Kada do zaštićenog klijenta stigne //push// poruka, on može uspostaviti vezu ako može identificirati klijenta koji šalje upit. ===== Ranjivosti Gnutella protokola ===== U nastavku će biti opisani neki od mogućih napada na Gnutella protokol. ==== Denial of Service napad pomoću spam poruka ==== Ako računalo koristeći Gnutella mrežu preuzme zaraženi sadržaj, može postati aktivni sudionik //Distributed Denial of Service// (DDoS) napada. DDoS napad izgleda otprilike ovako, napadač pretraži određenu skupinu IP adresa kako bi pronašao računala koja su zaražena te ih upotrebljava kako bi napao neki web poslužitelj. Računala šalju posebnu vrstu zahtjeva dok se poslužitelj ne zaguši. Gnutella nema mjere koje bi spriječile i izbjegle DDoS napade. Štoviše, DDoS napad se lako može postići u ovoj mreži jer zlonamjerno //peer// računalo može lažno pozitivno odgovoriti na upit te tako poslati zloćudne datoteke klijentu koji je zatražio upit. Kod ovakvih napada iznimno je teško identificirati počinitelja jer se zahtjevi šalju iz različitih domena i s različitih IP adresa. Sa strane napadača, vrlo je lako „podvaliti“ zloćudan program nekom od korisnika protokola, dovoljno je na primjer odgovarati na sve poruke koje sadrže traženu riječ te nasumično odabranu popularnu medijsku ekstenziju (npr. mp3, mpeg, wma). Također, moguće je postaviti manju veličinu datoteke tako da zloćudni program protokolu izgleda kao najbolja opcija za preuzimanje. Jednom kad se zloćudni program nalazi na mnoštvu računala u mreži, svi napadaju određeni web poslužitelj te ga usporavaju i zagušuju do te mjere da posjetitelji više ne mogu otvoriti web stranicu. Sljedeća slika prikazuje širenje zloćudnog programa mrežom te napad na web stranicu: {{ :racfor_wiki:mrezna_forenzika:napad.png?400 |}} Ovakve napade vrlo je teško spriječiti jer klijent nema nikakvu odgovornost prema upitima koje prima. U prilog tome ide i to što je u protokolu definirano da klijent, ako sadrži podatke koji odgovaraju upitu, može odgovoriti samo //QueryHit// porukom. ==== Pong napad ==== Ovakav napad također se ubraja u DDoS napade i može se lako izvesti na Gnutella protokolu. Ovaj napad se ne smatra toliko ozbiljnim i važnim, ali pokazuje određene ranjivosti ovog protokola. Nakon što klijent pošalje ping poruku zloćudnom klijentu, on će odgovoriti pong porukom. Tipična pong poruka sastoji se od IP adrese i broja priključka za spajanje. Zloćudni klijent može poslati IP adresu i priključak nekog web poslužitelja. Klijent koji šalje upit će sve upite proslijediti njemu i tako ga možda zagušiti. Ovaj napad neće trajati dugo jer svi klijenti periodički šalju ping poruke susjedima u mreži kako bi mreža bila ažurirana. Kada klijent pošalje ping poruku web poslužitelju, on nije u mogućnosti odgovoriti pong porukom pa će ga klijent koji šalje ping poruku jednostavno ukloniti iz mreže i time je napad završen. Sljedeća slika prikazuje pong napad: {{ :racfor_wiki:mrezna_forenzika:napad1.png?400 |}} ==== Prikupljanje IP adresa (IP Harvesting) ==== Hakerima su svakakve informacije dobrodošle kako bi izvršili napad. Jedna od takvih informacija je i IP adresa. Obični korisnik Interneta ima IP adresu koja je poznata samo njemu i pružatelju internetskih usluga. P2P mreže ipak zahtijevaju dijeljenje IP adresa što ih čini plodnim tlom za hakere. Ako se nađe propust u sigurnosti kod jednog ili više klijenata Gnutelle, moguće je prikupiti IP adrese te pokrenuti masovni napad na korisnike mreže. Otkrivena IP adresa zapravo i nije od velike koristi nakon nekog vremena jer se većini korisnika Gnutella mreže ona dinamički mijenja. Ovaj problem se javlja za korisnike koji imaju statičku IP adresu. ==== Ostale slabosti ==== **Slanje virusa push porukom** – nakon što klijent zaštićen vatrozidom primi push poruku, on bi trebao pokušati uspostaviti TCP/IP vezu sa zadanom IP adresom i na zadanom priključku. Nakon što je veza uspostavljena, klijent koji je poslao push poruku slijepo prihvaća sve što mu šalje klijent zaštićen vatrozidom. Klijent tako može prihvatiti i preuzeti viruse. ===== Zaključak ===== Gnutella je protokol temeljen na P2P mreži. Ovaj protokol služi za razmjenu podataka među računalima u mreži. Sva računala komuniciraju na jednostavan način, a slanje i primanje podataka odvija se koristeći HTTP internetski protokol. Gnutella je svojedobno privukla veliko zanimanje u industriji i akademskom okruženju zbog svog komunikacijskog i podatkovnog modela, ali nedostatak je sigurnost mreže. Postoje neki nedostaci u ovom protokolu koji se lako mogu zlorabiti. Većina tih nedostataka mogla bi se poboljšati i učiniti mrežu sigurnijom. S druge strane, sva moguća poboljšanja sigurnosti čine ovu mrežu barem malo kompliciranijom te zahtijevaju veću količinu poruka i podataka koji prolaze mrežom. ===== Literatura ===== [[http://alumni.cs.ucr.edu/~csyiazti/courses/cs260-2/project/gnutella.pdf|[1] Demetrios Zeinalipour-Yazti: Exploiting the Security Weaknesses of the Gnutella Protocol ]] [[https://en.wikipedia.org/wiki/Gnutella|[2] Wikipedia: Gnutella]] [[http://medianet.kent.edu/surveys/IAD06S-P2PArchitectures-chibuike/P2P%20App.%20Survey%20Paper.htm|[3] Chibuike Muoh: A Tutorial on Gnutella, Bittorrent and Freenet Protocols]] [[https://www.cert.hr/wp-content/uploads/2019/04/NCERT-PUBDOC-2009-11-282.pdf|[4] Peer-to-Peer mreže]] [[https://courses.cs.washington.edu/courses/cse522/05au/gnutella_protocol_0.4.pdf|[5] The Gnutella Protocol Specification v0.4]]