Lažiranje IP adresa

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

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 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 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 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.