Da bi nam se olakšalo shvaćanje koje sve opasnosti postoje, organizacija OWASP (Open Worldwide Application Security Project) provodi niz zanimljivih projekata. Jedan od njih je i OWASP Juice Box.
Što je OWASP?
OWASP je međunardna neprofitna organizacija koja osvještava o sigurnosti na internetu i radi na poboljšanju sigurnosti u softveru. Između ostalog, sakuplja informacije o ranjivosti web aplikacija i nudi mnoštvo projekata na kojima možete brusiti svoje vještine hakiranja, kao i niz dokumenata koji objašnjavaju kako zaštititi svoje aplikacije i sustave. Njihov najpoznatiji dokument je OWASP Top 10 koji govori o deset najčešćih ranjivosti aplikacija i načinima na koje se mogu ublažiti. Više o tome možete saznati na njihovim službenim stranicama (owasp.org), a ako se želite aktivno uključiti u program, možete se registrati na njihovim stranicama i učlaniti u hrvatski tim (Croatian Chapter) na Meetup platformi.
Juice Box
Jedan od najvažnijih projekata OWASP organizacije je Juice Box. Juice Box je web aplikacija na kojoj možete iskušati različite ranjivosti. Postoji bodovna ljestvica, tako da možete pratiti svoj rezultat i razbuditi natjecateljski duh!
Slika 1: Izvor: https://owasp.org/www-project-juice-shop
Arhitektura Juice Box-a
Samim gledanjem arhitekture na slici 1 počinjemo razmišljati o ranjivostima, a budući da je frontend i backend napisan u javascript programskom jeziku možemo probati iskoristiti ranjivost putem script injection-a, dok za bazu podataka možemo pokušati sql injection. Za same datoteke koristi se datotečni sustav, pa možemo provjeriti jesu li prava dobro podešena. No idemo redom – prvo ćemo pogledati kako sustav možemo pokrenuti u lokalnom okruženju.
Instalacija
Autori su se toliko potrudili da je aplikacija dostupna kao docker image, u obliku izvornog koda, i online demo-a (za one s manje slobodnog vremena).
Mi smo se odlučili za docker image jer je taj način instalacije jednako brz kao i da posjetite online demo, a jedini preduvjet je da imate instaliran docker na vašem računalu. Ako imate instaliran docker, otvorite vašu konzolu i utipkajte:
- docker pull bkimminich/juice-shop, pa
- docker run --rm -p 3000:3000 bkimminich/juice-shop,
te pogledajte na adresi – http:localhost:3000 vašu aplikaciju koja je spremna za hakiranje!
Docker je platforma za kontejnerizaciju koja uključujuje aplikaciju i sve njezine ovisnosti (biblioteke, operativni sustav, konfiguraciju) radi jednostavnog izvođenja aplikacija na različitim okruženjima, a više možete saznati na stranicama dockera (docker.com/get-started/) koja sadrži detaljne upute za instalaciju.
Slika 2. Izgled score-board ekrana s težinama, kategorijama i zadacima
Sigurnosno istraživanje ili popularno – hakiranje
Juice Box aplikaciju možete hakirati na tri načina. Prvi način je prateći interaktivni tutorial pronalaskom Score Board-a u navigaciji (koji je ujedno i vaš prvi izazov). Drugi način je pregled rješenja, a treći samostalno istražujući. Rezultati i napredak konstantno se prate tako da, ako se slučajno nešto nepredvidivo dogodi (npr. nestane struje, Windowsi otkažu poslušnost…), imate opciju spremanja trenutnog stanja. Potrebno je preuzeti datoteku u json formatu u kojoj je spremljen vaš trenutni napredak, a ako želite nastaviti na drugom računalu onda tu istu datoteku morate učitati.
Mi smo se odlučili za opciju interaktivnog tutoriala i istraživanja. Krenite klikati po aplikaciji kako biste vidjeli što vam je sve dostupno, pogledajte u navigacijski izbornik s lijeve strane gdje se nalazi link Help getting started. Kada kliknete na njega, vaš prvi izazov je istražiti gdje se nalazi Score Board stranica kako biste mogli pregledati ostale izazove koji su vam dostupni. Mali hint, kod frontend aplikacija i inicijalnog istraživanja web aplikacija uvijek je dobro otvoriti Developer Tools preglednik (otvara se pritiskom na tipku F12), a ako odete u Source tab možete vidjeti izvorni kod aplikacije. Dobra praksa bi bila da je izvorni kod zamagljen i umanjen tako da ga je teško pročitati, što bi barem odvratilo većinu (lijenih) entuzijasta u hakiranju, a što u ovom slučaju nije i kod je lijepo isporučen svakom tko ga želi pročitati. Zatim pretražite kod s riječi score ili board. Odmah ćete naići na rutu score-board. Probajte je utipkati kao dodatak vaše rute – http://localhost:3000/#/score-board i bravo! Uspjeli ste napraviti prvi korak u hakiranju.
Međutim ne stajemo ovdje, već idemo dalje!
Score Board
Prije nego što se upustimo u daljnje istraživanje idemo se upoznati s ekranom Score Board kojeg ste upravo otkrili. Na dnu ekrana, kojeg možete vidjeti na slici 2, vidimo popis različitih izazova. Svaki izazov uz naslov ima dodatne detalje kao što je težina, opis, kategorija i status. U polju iznad izazova, na gornjem dijelu ekrana slike 2, vidimo opcije za filtriranje izazova i status trenutnog napretka.
Ovisno o tipu izazova možemo vidjeti dodatne detalje. Primjerice, ako ste riješili izazov pokazat će se dodatne ikone u obliku preporuka za ublažavanje ranjivosti – znak štita s povećalom. Ako je za rješenje izazova potrebno izmijeniti izvorni kod prikazat će vam se znak <>, a ako je nacrtana mala kapica moguće je ući u interaktivni tutorial mode aplikacije koji će vas voditi kroz hakiranje.
Sada kada znamo kako čitati Score Board ekran, idemo isprobati dvije ranjivosti prema OWASP Top 10 - injection i sensitive data exposure - te dati preporuke kako se od njih zaštititi. Pritom vam ne želimo previše kvariti zabavu, pa ostale izazove ostavljamo vama.
Slika 3. Prijava u sustav
SQL Injection
Kroz ovu ranjivost napadač pokušava prenijeti kod koji će se izvršiti u vašem sustavu s ciljem da ošteti sustav i učini ga nedostupnim ili dobije neke korisne informacije. Najpoznatiji je SQL Injection koji izvršava maliciozni kod u bazi podataka.
U Juice Boxu postoji zadatak koji se zove Login Admin koji želi da se prijavite s administratorskim računom putem SQL Injection-a. Kada pristupite ekranu za prijavu i upišete neki slučajan mail i lozinku dobijete očekivani odgovor o neispravnom emailu ili lozinki što se može vidjeti na slici 3.
Idemo pokušati još jednom. Ovaj put ćemo za email unijeti jednostruki navodnik (‘) koji u SQL-u označava tekstualni podatak, a unosom jednostrukog navodnika ispitujemo postoji li kakva obrana u programskom kodu. Kada stisnemo gumb Log in dobijemo zanimljiv rezultat koji možemo promotriti na slici 4. Pod brojem 1 na slici 4 vidimo kako nam aplikacija čestita i kaže da smo uspješno riješili izazov i isprovocirali grešku koju možemo vidjeti pod brojem 2. Greškom se očito nije dobro upravljalo, a greške s kojima se ne upravlja, osim što mogu ostaviti loše korisničko iskustvo i gubitak korisnika aplikacije, nas white hat hakere mogu navesti na neke druge tragove koje ćemo otkriti, a nalaze se na istoj slici pod brojem 3. Otvorimo Developer Tools i Network tab da vidimo možemo li saznati još koju zanimljivu informaciju i, na naše veselje, vidimo cijeli SQL upit koji se očito spaja s parametrima i prenosi prema bazi podataka. To nikako nije dobro za korisnike i implementatore aplikacije, dok je za nas odlično jer nam pokazuje da je ova aplikacija možda ranjiva na napad umetanjem odnosno SQL Injection. Kako bismo to saznali, probat ćemo unijeti dio SQL koda u email polje i vidjeti kako će se aplikacija ponašati.
Moramo se poigrati s ulaznim parametrima, a da bismo se mogli igrati potrebno je osnovno znanje SQL-a. Idemo malo zasukati rukave i modificirati SQL upit. Uzet ćemo sada dio SQL koda sa slike 4 pod brojem 3 koji je glasio ovako:
SELECT * FROM Users WHERE email = ‘’’ AND password = ‘3590cb8af0bbb9e78c343b52b93773c9’ AND deletedAt IS NULL
Iz upita možemo ustanoviti da se podaci povlače iz tablice Users koja ima polja email, password i deletedAt. Nama je cilj proći kroz ovu validaciju, a najbolje je da se probamo ubaciti s OR uvjetom koji prolazi ako je barem jedan uvjet zadovoljen.
Polje deletedAt nam govori da svi aktivni korisnici imaj NULL vrijednost u tom polju, pa idemo preinačiti taj upit na način da dodamo ‘OR deletedAt IS NULL OR email = ‘’. U tom slučaju od baze podataka ćemo dobiti odgovor ako je email prazan tekst ILI deletedAt bez vrijednosti (NULL) ILI je email prazan tekst I password ispravan, odnosno samo jedan uvjet mora biti zadovoljen da dobijemo nekakav odgovor.
Slika 4. Greške
Upit bi sada trebao izgledati ovako:
SELECT * FROM Users WHERE email = ‘’OR deletedAt IS NULL OR email =’’ AND password = ‘3590cb8af0bbb9e78c343b52b93773c9’ AND deletedAt IS NULL
Dio koji unosimo u email polje:
‘OR deletedAt IS NULL OR email =’
Stisnete gumb Log in i uspjeli ste, zar ne? Bravo! Sada ste dobili pristup kao korisnik u ulozi administratora i poruku da ste uspješno riješili još jedan izazov što možete vidjeti na slici 5 pod brojem 1 gdje piše „You successfully solved a challenge: Login Admin (Log in with the administrator’s user account.)“. Istražite malo padajući izbornik s lijeve strane (sidebar) kojeg možete vidjeti na slici pod brojem 2 s dodatnim opcijama kao što su email, narudžbe i plaćanja, sigurnost, opcije članstva itd. Gore desno, na istoj slici pod brojem 3, možete vidjeti opcije kao što su prethodne narudžbe, plaćanja, privatnost i sigurnost. Opet, da vam ne kvarimo zabavu, ostavit ćemo istraživanje i rješavanje izazova i zadataka vama, a mi idemo vidjeti na koji način se možemo obraniti od takvih napada.
Obrana
Kako se možemo osigurati?
- Parametrizirajte upite u vašoj aplikaciji koji dolaze od korisnika. Čistite ulazne parametre od potencijalno opasnih znakova, postavite definirane ulazne parametre, a ostale odbacujte.
- Koristite pripremljene SQL upite (stored procedures), a kroz aplikaciju prenosite isključivo ulazne parametre.
- Koristite listu dopuštenih parametara, tj. nemojte direktno generirati upit s ključnim riječima SQL jezika, nego proslijedite druge parametre. Na primjer, od korisnika tražite unos za sortiranje u oblike boolean varijable (true ili false), a na izvornu SQL ključnu riječ kao što je ASC ili DESC.
- Svojim aplikacijama otvorite servisne račune s minimalnim pravima i dopuštenjima, odnosno s dovoljno prava da mogu izvršiti svoju zadaću.
Ovo su sve samo neke od preporuka za osiguravanje od SQL Injection napada, a ako ih koristite kvalitetno zaštitit ćete svoje sustave i aplikacije.
Slika 5. Uspješna prijava kao administrator preko SQL Injectiona
Sensitive Data Exposure (Security by Obscurity)
Često budu kavanske rasprave oko sigurnosti – Tko će pronaći taj API? Trebaš znati IP adresu, domenu i kako se koristi, nitko ga neće pronaći! No uvijek ga netko pronađe i nikada se ne smijete oslanjati na sigurnosnu zaštitu „Nitko to neće pronaći“.
Idemo opet promotriti našu Juice Box aplikaciju i vidjeti kako su se oni osigurali (ili nisu?) od takvog pristupa. Nastavljamo istraživati aplikaciju, pregledavamo proizvode i, naravno, poželimo kontaktirati prodaju kako bismo postavili neki direktni upit. Stoga smo otišli na About Us stranicu.
Kako smo pedantni korisnik i želimo se informirati o politici povrata proizvoda, kliknut ćemo na Check out our boring terms of use if you are interested in such lame stuff poveznicu koja će nas odvesti na dokument koji vidimo na slici 6 pod brojem 1. Bezbrižno pregledavajući pravne napomene zatekao nas je url samo stranice, uočili smo ftp prefiks, a kako smo znatiželjni, idemo vidjeti što će se dogoditi ako odemo na adresu http://locahost:3000/ftp. Na slici 6 pod brojem 2 iznenadio nas je nezaštićeni ftp direktorij gdje vidimo nekoliko klasificiranih podataka. Jedan od njih je .bak file što označava backup baze podataka, datoteku s prošlim incidentima, a ima i jedan zanimljiv dokument koji se zove acquisitions.md, a otvorenog ga možemo vidjeti na slici pod brojem 3. Izgleda da su to neki tajni dokumenti o planiranim akvizicijama. Konkurencija bi ga sigurno htjela, zar ne?
Obrana
Za razliku od SQL Injection-a kod obrane od ovih napada potreban je cjelovit pristup jer nema jedne preporuke koja bi nas zaštitila. Potrebno je imati pozornost kod cijelog ciklusa razvoja softverskog proizvoda, testirati i pratiti dobre prakse sigurnog razvoja softvera. Također je potrebno i postavljanje prava pristupa dijelovima sustava kao što su baze podataka i aplikacije na najmanje potrebna. Zatim je potrebno imati dobro razvijene sustave autentifikacije i autorizacije, postavljati enkripciju na kritične podatke - zakonom zaštićene povjerljive informacije, kriptografske ključeve, zdravstvene i financijske podatke odnosno sve one podatke koji svojim otkrivanjem ili gubitkom mogu dovesti do narušavanja ugleda ili financijske štete. Nužno je provoditi redovite sigurnosne provjere i revizije kao što je penetracijsko testiranje (strogo kontrolirano hakiranje sustava od strane stručnjaka za informacijsku sigurnost), analiza izvornog koda, revidiranje pristupa određenim dijelovima sustava te redovite sigurnosne edukacije za sve uključene u razvoj.
Slika 6. Security By Obscurity
White Hat, Black Hat?
U tekstu smo spomenuli white hat izraz, no što je to? To je izraz koji se koristi za etičnog računalnog hakera, najčešće stručnjaka za informacijsku sigurnost koji želi istražiti sustav kako bi ga mogao upozoriti na ranjivosti i pomoći u obrani. Black Hat je izraz za malicioznog hakera koji želi upasti u vaš sustav da nanese štetu ili se financijski okoristi. Kao pravi White Hat trebamo znati neka pravila ponašanja kod istraživanja i prijava ranjivosti, a s tim ciljem, između ostalog, predložen je standard security.txt kojeg možemo proučiti na stranici https://securitytxt.org. Radi se o datoteci u kojoj su kontakti sigurnosnih timova sustava kojima se može javiti ako se uoče kritične ranjivosti (nekada postavite i otvorena radna mjesta u svojim cyber security timovima pa tko zna, možda i pronađete posao).
Na kraju
Iako bismo i mi htjeli proći kroz sve izazove, čuti više o ranjivostima i obranama, ovaj tekst ima svoj ograničen prostor. Nadamo se da smo vas uspjeli zainteresirati za temu sigurnosti jer smo neprestano spojeni na internet, a opasnosti ne manjka. Organizacija OWASP potrudila se razvojem svojih projekata, a Juice Box je tek jedan od mnogih. Ovim putem vas (ponovo) pozivamo da istražite i ostale. Budite oprezni i etično (white hat) hakiranje uvijek radite u kontroliranim okruženjima ili sigurnosnim laboratorijima. Imajte na umu da je osvještavanje i edukacija o sigurnosti uvijek najbolja prevencija jer, koliko god sigurnosnih kontrola uspijemo postaviti, važno je biti oprezan i svjestan da opasnosti postoje.
Već ste prošli sve izazove Juice Box-a i nije vam dosta?
Ako ste prošli sve zadatke iz Juice Box-a i nije vam dosta, postoje i ostala web sjedišta na kojima možete iskušati svoje vještine hakiranja:
1. https://tryhackme.com/ - pruža niz learning path-ova, od početnika do naprednih korisnika, postoje virtualni labovi koji su sigurna okruženja za isprobavanje različitih načina hakiranja u sigurnom okruženju,
2. https://www.hackthissite.org/ - slična platforma kao što je TryHackMe, postoji mogućnost rješavanja zadataka koji pomažu korisnicma dati uvod u sigurnosne tehnike i tehnike hakiranja, promoviranje etičnog hakiranja,
3. https://www.hacker101.com/ - besplatan uvod u hakiranje, potrebna registracija,
4. http://www.securitytube.net/ - ako niste od čitanja - youtube za security,
5. https://blog.intigriti.com/hackademy/ - zgodna akademija, pruža niz primjera, od početnih do naprednih, kombinacija videa i teksta.
Sretno (white hat) hakiranje!