Differences

This shows you the differences between two versions of the page.

ping_flooding [2015/11/25 13:46] (current)
marko.knezevic created
Line 1: Line 1:
 +======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'').
 +
 +{{:virtnet-topology-26.png?600|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**:
 +<code bash>
 +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
 +</code>
 +
 +Sada ćemo konfigurisati čvor **node8** (jedina razlika u komandama je u interfejsu, **node7** koristi ''eth2'', a **node8** ''eth1'' mrežni interfejs):
 +<code bash>
 +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
 +</code>
 +
 +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:
 +<code bash>
 +student@node2:~$ sudo sysctl net.ipv4.conf.eth1.rp_filter=0
 +net.ipv4.conf.eth1.rp_filter = 0
 +</code>
 +<code bash>
 +student@node2:~$ sudo sysctl net.ipv4.conf.eth2.rp_filter=0
 +net.ipv4.conf.eth2.rp_filter = 0
 +</code>
 +<code bash>
 +student@node2:~$ sudo sysctl net.ipv4.conf.all.rp_filter=0
 +net.ipv4.conf.all.rp_filter = 0
 +</code>
 +<code bash>
 +student@node2:~$ sudo /etc/init.d/networking restart
 +</code>
 +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.
 +<code bash>
 +student@node4:~$ sudo sysctl net.ipv4.icmp_echo_ignore_broadcasts=0
 +net.ipv4.icmp_echo_ignore_broadcasts = 0
 +</code>
 +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**:
 +<code bash>
 +student@node1:~$ sudo iptables -t nat -A POSTROUTING -p icmp SNAT -to-source 192.168.3.31
 +</code>
 +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.
 +<code bash>
 +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
 +</code>
 +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**.
 +
 +<file bash>
 +#!/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
 +</file>
 +
 +
 +Potrebno je postaviti i da fajl može da se izvrši:
 +<code bash>
 +student@node1:~$ sudo chmod u+x pingujvise
 +</code>
 +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:
 +<code bash>
 +student@node1:~$ ./pingujvise 0.5 972 192.168.2.21 192.168.2.22 192.168.2.23 192.168.2.24
 +</code>
 +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:
 +<code bash>
 +student@node1:~$ kill -SIGINT `pgrep ping`
 +</code>
 +
 +=====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):
 +<code bash>
 +student@node8:~$ sudo apt-get install apache2
 +student@node8:~$ sudo apache2ctl start
 +</code>
 +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
 +<code bash>
 +student@node8:~$ lynx http://192.168.3.31/
 +</code>
 +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