======Lažiranje IP adresa korišćenjem iptables na Linux-u====== Svaki IP datagram, poslat na Internet, sadrži u zaglavlju IP adresu pošiljioca i primaoca paketa. Tako da, ignorišući ulogu //NAT//-a, kada računar uspostavi vezu sa serverom na Internetu, taj server zna IP adresu računara sa kojim komunicira. U nekim slučajevima poželjno je promeniti IP adresu pošiljioca koja se nalazi u zaglavlju paketa (a da se stvarna adresa računara ne promeni). Promena adrese je korisna za testiranje i dijagnostikovanje mreže, testiranje sigurnosti mreže i vršenje sigurnosnih napada (u cilju učenja i provere sigurnosti). Postavljanje IP adrese pošiljioca u datagram-u na lažnu IP adresu se naziva lažiranje adrese (//address spoofing//). Na //Linux//-u lažiranje adrese je lako izvesti korišćenjem ''iptables''. Na primer, da bi se promenila adresa pošiljioca u zaglavlju datagram-a na adresu 1.1.1.1: $ sudo iptables -t nat -A POSTROUTING -j SNAT --to-source 1.1.1.1 U daljem tekstu biće demonstrirano lažiranje IP adrese korišćenjem alata ''ping''. Koristićemo i alata ''tcpdump''. Pre konfigurisanja virtualne mreže date na slici potrebno je intalirati paket ''tcpdump'' na osnovnoj virtualnoj mašini. student@osnovna:~$ sudo apt-get install tcpdump {{:virtnet-topology-03.png?600|Tražena topologija mreže}} Traženu topologiju mreže moguće je podesiti korišćenjem skripte //topologija.kreiraj// (''bash topologija.kreiraj 3''). =====1. Ping bez lažiranja adrese===== U ovom delu teksta videćemo šta se dešava kada jedan računar komunicira sa drugim bez lažiranja adresa. Komandom ''ping'' svake sekunde inicira se slanje paketa ICMP Echo zahteva (//ICMP Echo Request//) ka adresi primaoca. Kada računar primi ICMP Echo zahtev on odgovara sa ICMP Echo odgovorom (//ICMP Echo Reply//). Na **node2** računaru, koji će biti primaoc, uhvatićemo pakete korišćenjem alata ''tcpdump'', a onda ćemo aktivirati ''ping'' na računaru **node1** korišćenjem parametra -c 2 koji će poslati 2 ICMP echo zahteva: student@node2:~$ sudo -b tcpdump -i eth1 -w tcpdump.log student@node1:~$ ping -c 2 192.168.1.12 PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data. 64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=1.37 ms 64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=0.635 ms --- 192.168.1.12 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.635/1.002/1.370/0.368 ms Uhvaćeni paketi na računaru **node2** pokazuju kako ping/ICMP i ARP radi: student@node2:~$ sudo pkill tcpdump student@node2:~$ tcpdump -r tcpdump.log 21:18:48.395103 ARP, Request who-has 192.168.1.12 tell 192.168.1.11, length 28 21:18:48.395160 ARP, Reply 192.168.1.12 is-at 08:00:27:c5:9f:e9 (oui Unknown), length 28 21:18:48.395762 IP 192.168.1.11 > 192.168.1.12: ICMP echo request, id 963, seq 1, length 64 21:18:48.395807 IP 192.168.1.12 > 192.168.1.11: ICMP echo reply, id 963, seq 1, length 64 21:18:49.397119 IP 192.168.1.11 > 192.168.1.12: ICMP echo request, id 963, seq 2, length 64 21:18:49.397149 IP 192.168.1.12 > 192.168.1.11: ICMP echo reply, id 963, seq 2, length 64 Pre slanja prvog ICMP echo request paketa, računar **node1** prvo mora da zna hardversku adresu računara koji ima IP adresu 192.168.1.12. Sva komunicija u LAN-u se obavlja preko protokola u sloju veze podataka, u ovom slučaju //Ethernet//. Iako **node1** zna IP adresu primaoca, on mora da zna i hardversku (//Ethernet ili MAC//) adresu da bi poslao Ethernet paket ka **node2** računaru. //Address Resolution Protocol// (ARP) se koristi da bi obavio mapiranje IP adrese sa hardverskom adresom. **Node1** šalje ARP zahtev ka svim računarima u LAN-u i pita ih ko zna hardversku adresu za IP adresu 192.168.1.12. **Node2** računar ima tu IP adresu, i stoga odgovara sa ARP odgovorom koji šalje odgovarajuću hardversku adresu 08:00:27:c5:9f:e9 računaru **node1**. Sada **node1** može da šalje ICMP echo zahtev ka **node2** računaru. Računar **node2** prima ICMP echo zahtev i odgovara sa ICMP echo odgovorom. Treba primetiti da **node2** računar već zna hardversku adresu računara **node1** (primljena je sa ARP zahtevom koji je prethodno poslao node1), pa nije potrebno da šalje ARP zahtev. Kada ICMP echo odgovor stigne do računara **node1**, on pamti vreme kružnog puta (//round-trip time RTT//) kao vreme proteklo od trenutka kada je ping poslao ICMP echo zahtev do trenutka kada je primio ICMP echo odgovor. U RTT je uključeno i vreme potrebno da se iskomunicira preko ARP-a. Drugi ICMP echo **node1** šalje oko 1s kasnije u odnosu na prvi zahtev. Posle nekog vremena (u našem slučaju posle 0.635ms) primljen je ICMP echo odgovor, i onda ping ispisuje RTT statistiku za oba zahteva. Slanje paketa u LAN-u je prikazano slici ispod. Iako se ping odvija između računara node1 i node2, ARP zahtev je poslat svima (broadcast) koristeći specijalnu hardversku adresu primaoca ff:ff:ff:ff:ff:ff. Zbog toga node3 računar takođe prima ARP zahtev, ali on ne odgovara zato što nema IP adresu 192.168.1.12. {{:ping-exchange-1.png?600|Ping razmena: Normalan slučaj}} =====2. Ping sa lažnom nezauzetom adresom===== Ponovićemo ping od računara **node1** ka **node2**, ali ćemo podesiti lažnu adresu pošiljioca u ICMP echo zahtevu poslatom sa računara **node1**. U ovom slučaju lažna adresa će biti nezauzeta adresa: ni jedan drugi računar na LAN ne poseduje tu lažnu adresu. Konktretno koristićemo adresu 192.168.1.66. Alat ''iptables'' se koristi za filtriranje paketa i kao //firewall// aplikacija na Linux-u. Takođe, dozvoljava korisnicima da manipulišu načinom na koji Linux jezgro obrađuje pakete. U daljem tekstu neće biti objašnjeno funkcionisanje ''iptables'' u celini, već samo deo vezan za lažiranje adrese pošiljioca. Komanda koja se koristi za lažiranje adrese pošiljioca je: student@node1:~$ sudo iptables -t nat -A POSTROUTING -p icmp -j SNAT --to-source 192.168.1.66 Parametar -t nat govori da želimo da manipulišemo tabelu koja se koristi za //Network Address Translation// (NAT), tj. Prevođenje jedne adrese u drugu, -A POSTROUTING opcija služi da se doda pravilo u POSTROUTING lanac. Pravila u lancu se primenjuju na sve pakete koji su završili proceduru rutiranja na traženom računaru i koji će biti poslati. U stvari, pravila se primenjuju na pakete neposredno pre njihovog slanja preko hardvera. Opcija -p icmp je uslov za primenu pravila: paket mora da koristi ICMP protokol (ovo pravilo se neće primenjivati da druge vrste paketa). Posle toga sledi akcija koja se izvršava ako su uslovi zadovoljeni. Parametar -j SNAT govori da je akcija promena adrese pošiljioca (SNAT - source network address translation). Na kraju opcija --to-source 192.168.1.66 govori koja je nova (lažirana) IP adresa pošiljioca. U suštini, svi ICMP paketi poslati sa računara **node1** imaće adresu pošiljioca 192.168.1.66. Ponovićemo ''ping'' korake od računara **node1** ka **node2**, i hvatati pakete na **node2** korišćenjem alata ''tcpdump'': student@node2:~$ sudo -b tcpdump -i eth1 -w tcpdump.log student@node1:~$ ping -c 2 192.168.1.12 PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data. --- 192.168.1.12 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1007ms Prikaz uhvaćenih paketa na računaru **node2**: student@node2:~$ sudo pkill tcpdump student@node2:~$ tcpdump -r tcpdump.log 18:29:55.458710 ARP, Request who-has 192.168.1.12 tell 192.168.1.11, length 28 18:29:55.458935 ARP, Reply 192.168.1.12 is-at 08:00:27:c5:9f:e9 (oui Unknown), length 28 18:29:55.459543 IP 192.168.1.66 > 192.168.1.12: ICMP echo request, id 970, seq 1, length 64 18:29:55.459668 ARP, Request who-has 192.168.1.66 tell 192.168.1.12, length 28 18:29:56.457789 ARP, Request who-has 192.168.1.66 tell 192.168.1.12, length 28 18:29:56.465478 IP 192.168.1.66 > 192.168.1.12: ICMP echo request, id 970, seq 2, length 64 18:29:57.457808 ARP, Request who-has 192.168.1.66 tell 192.168.1.12, length 28 Grafički prikaz komunikacije korišćenjem alata ''ping'' je prikazan na slici. {{:ping-exchange-2.png?600|Ping razmena: Lažna adresa pošiljioca je 192.168.1.66}} Kao i u normalnom slučaju, čvor **node1** šalje u etar ARP zahtev da bi pronašao hardversku adresu za IP adresu 192.168.1.12. Odgovor stiže sa čvora **node2**, pa čvor **node1** šalje prvi ICMP echo zahtev. Izvorna adresa ICMP echo zahteva je 192.168.1.66, a ne prava adresa čvora **node1** (192.168.11). Kada **node2** primi ICMP echo zahtev on će odgovoriti čvoru koji je poslao taj zahtev. Iz ugla **node2** čvora, čvor koji je poslao zahtev je računar sa IP adresom 192.168.66. Pošto nije komunicirao sa računaraom koji ima IP adresu 192.168.66, node2 šalje ARP da bi pronašao hardversku adresu za odgovarajuću IP adresu. **Node2** čvor je poslao ARP zahtev u etar tražeći hardvesku adresu za IP adresu 192.168.66. Čvor sa traženom IP adresom ne postoji, pa **node2** neće primiti ARP odgovor. Posle nekog vremena će ponovo poslati ARP zahtev i opet neće dobiti odgovor. Takođe, neće poslati ICMP echo odgovor zato što ne zna hardversku adresu pošiljioca. Na kraju čvor **node1** će poslati i drugi ICMP echo zahtev, ali opet neće dobiti odgovor. Posle nekog vremena, alat ''ping'' na **node1** čvoru će odustati i ispisati da je poslao dva paketa i primio nula odgovora (2 packet transmitted, 0 (reply) packets received). =====3. Ping sa lažnom adresom koju poseduje neki čvor u LAN-u===== Ponovićemo ping sa lažnom adresom izvora, ali sada ćemo podesiti IP adresu tako da bude ista kao adresa nekog čvora u LAN-u, npr. 192.168.1.13. Da bi promenili adresu izvora prvo ćemo izbrisati staro pravilo (sa adresom 192.168.1.66 u iptables) i onda dodati novo pravilo sa adresom pošiljioca 192.168.13: student@node1:~$ sudo iptables -t nat -D POSTROUTING -p icmp -j SNAT --to-source 192.168.1.66 student@node1:~$ sudo iptables -t nat -A POSTROUTING -p icmp -j SNAT --to-source 192.168.1.13 Hvataćemo pakete i na čvoru **node2** i **node3**. student@node2:~$ sudo -b tcpdump -i eth1 -w tcpdump.log student@node3:~$ sudo -b tcpdump -i eth1 -w tcpdump.log Izlaz iz komande ''ping'' čvora **node1**: student@node1~$ ping -c 2 192.168.12 PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data. --- 192.168.1.12 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1007ms Prikaz uhvaćenih paketa na računaru **node2** i **node3**: student@node2:~$ sudo pkill tcpdump student@node2:~$ tcpdump -r tcpdump.log 16:22:33.693683 ARP, Request who-has 192.168.1.12 tell 192.168.1.11, length 28 16:22:33.693942 ARP, Reply 192.168.1.12 is-at 08:00:27:c5:9f:e9 (oui Unknown), length 28 16:22:33.694477 IP 192.168.1.13 > 192.168.1.12: ICMP echo request, id 972, seq 1, length 64 16:22:33.694615 ARP, Request who-has 192.168.1.13 tell 192.168.1.12, length 28 16:22:33.695242 ARP, Reply 192.168.1.13 is-at ''''08:00:27:84:b2:62'''' (oui Unknown), length 28 16:22:33.695249 IP 192.168.1.12 > 192.168.1.13: ICMP echo reply, id 972, seq 1, length 64 16:22:34.701429 IP 192.168.1.13 > 192.168.1.12: ICMP echo request, id 972, seq 2, length 64 16:22:34.701460 IP 192.168.1.12 > 192.168.1.13: ICMP echo reply, id 972, seq 2, length 64 student@node3:~$ sudo pkill tcpdump student@node3:~$ tcpdump -r tcpdump.log 16:22:33.784902 ARP, Request who-has 192.168.1.12 tell 192.168.1.11, length 28 16:22:33.786039 ARP, Request who-has 192.168.1.13 tell 192.168.1.12, length 28 16:22:33.786161 ARP, Reply 192.168.1.13 is-at 08:00:27:84:b2:62 (oui Unknown), length 28 16:22:33.786661 IP 192.168.1.12 > 192.168.1.13: ICMP echo reply, id 972, seq 1, length 64 16:22:34.792426 IP 192.168.1.12 > 192.168.1.13: ICMP echo reply, id 972, seq 2, length 64 Grafički prikaz komunikacije korišćenjem alata ''ping'' je prikazan na slici ispod. {{:ping-exchange-3-r697.png?600|Ping razmena: Lažna adresa pošiljioca je 192.168.1.13}} Prvi ARP zahtev, ARP odgovor i ICMP Echo zahtev su isti kao i u prethodnom primeru, sa izuzetkom adrese pošiljioca koja je sada 192.168.1.13. Kada čvor **node2** primi ICMP Echo zahtev, na osnovu IP adrese pošiljioca, utvrđuje da mora da pošalje odgovor ka adresi 192.168.1.13. On šalje ARP zahtev u etar, da bi pronašao hardversku adresu računara sa IP adresom 192.168.1.13. Taj zahtev primaju svi čvorovi u LAN-u, uključujući i node3. **Node3** ima IP adresu 192.168.1.13 i odgovara na taj ARP zahtev svojom hardverskom adresom (08:00:27:84:b2:62). Kada **node2** primi ARP odgovor i mapira IP adresu 192.168.1.13 da hardverskom adresom 08:00:27:84:b2:62, može da odgovori na ICMP Echo zahtev koji ima adresu pošiljioca 192.168.1.13. U ovom slušaju računar koji će primiti ICMP Echo odgovor sa čvora node2 je **node3**. Čvor **node1** inicira ping ka čvoru **node2**, ali lažiranjem adrese pošiljioca tera računar **node2** da odgovori čvoru **node3**. Ovaj koncept može da se koristi za izvođenje ''DoS'' napada. Zlonamerni računar šalje mnogo ''ping'' zahteva ka mnogo računara na Internet-u, sa lažiranom adresom računara koji je meta. Svi čvorovi koji prime ICMP Echo zahtev šalju ICMP Echo odgovor ka računaru meti. Ako je u ovom napadu uključeno mnogo računara posrednika (onih koji šalju odgovor), može se desiti da se mreža na kojoj se nalazi računar meta preoptereti i tako uskrati pristup normalnih računara ka računaru meti. Videli smo da je prilično lako lažirati adresu korišćenjem ''iptables'' na Linux-u. Takođe, ništa teže nije lažiranje adresa na drugim OS. Stoga pri dizajniranju sigurnosnih sistema, koršćenje samo IP adrese da bi se identifikovao korisnik na mreži je problematično. Za proveru identiteta potrebno je koristiti druge tehnike. Takođe, potrebno je limitirati brjoj paketa koji pristižu sa jedne adrese.