Fuzzing web servisa (REST i SOAP)
Lovro Predovan,
Milan Pavlović
Sadržaj |
Fuzzing web servisa (REST i SOAP)
Prema [1] i [2], eng. fuzzing ili fuzz testing je tehnika testiranja računalnog softvera. Softver se testira na način da mu se kao ulazni podaci proslijede neke neobične i neočekivane vrijednosti te se promatra kako će softver reagirati u takvoj situaciji. Ulazni podaci često mogu biti i nasumični, a nerijetko se u program ubacuju automatiziranim tehnikama, primjerice, pomoću specijalnog programa namijenjenog ovoj vrsti testiranja. Ova tehnika testiranja obično se koristi prilikom testiranja sigurnosti u računalnim, programskim ili informacijskim sustavima. [4]
Iako je u [2] navedeno kako je fuzzing tehnika testiranja pomoću metode crne kutije (eng. black-box), izvor [1] navodi da fuzzing može biti testiranje metodom bijele, sive ili crne kutije. Naše mišIljenje jest da fuzzing nije samo tehnika crne kutije jer takvu vrstu testiranja ne provodi uvijek osoba koja ne poznaje način transformacije ulaznih u izlazne vrijednosti. Primjerice, ako programer testira vlastitu aplikaciju smatramo da se tada radi o tehnici bijele kutije. U slučaju da testiranje provodi tester koji djelomice poznaje aplikaciju iznutra može se govoriti o tehnici sive kutije, a tehnikom crne kutije smatramo slučaj u kojem testiranje provodi netko tko ni malo ne poznaje programski kod.
Fuzzing se uglavnom svodi na sistematični pristup silom (eng. brute force).Treba naglasiti da sama ideja fuzzinga nije da se nasumično bacaju podaci prema (web) aplikaciji već da se taj proces odvija pažljivo i sistematično kako bi on bio što efikasniji. Ukupan prostor rješenja je svakog puta nepoznanica koju trebamo istražiti stoga možemo povući paralelu s kriptoanalizom čija je primarna svrha smanjivanje prostora rješenja kako bi brute force bio što “čišći”.
Primjer fuzzinga
Jednostavan primjer fuzzinga može biti prikazan na programskoj funkciji koja dijeli dva broja. Oba broja unosi korisnik (npr. radi se o kalkulatoru). Uobičajene vrijednosti za ovu operaciju su cijeli ili decimalni brojevi. Međutim, što ako korisnik unese nulu kao djelitelja ? Hoće li se program srušiti ?
Prednosti
Najveće prednosti fuzzinga prema [1] i [2] su njegova jednostavnost i neobična kombinacija sistematičnog pristupa s jedne i nasumičnog pristupa s druge strane. To bi značilo da se prateći metodu može otkriti greška koju bi sam programer teško uočio i predstavlja odličan izbor kada je sustav koji se razvija potpuno izoliran. Fuzzing nudi odličan omjer uloženog i dobivenog jer ponekad osim otkrivanja trivijalnih grešaka može dovesti do razotkrivanja ozbiljnih sigurnosnih problema. Najučinkovitiji je upravo kod problema koji mogu uzrokovati rušenje programa poput buffer owerflowa, xss-a, DDOS napada ili sql injectiona, odnosno kod danas najpopularnijih metoda napada na web aplikacije.
Mane
Prema [1] i [4] ograničenja fuzzera su da uglavnom detektiraju jednostavne greške te da je kod testiranja tipa crne kutije povećana težina procjene utjecaja pronađene ranjivosti. Fuzzing je neučinkovit kod sigurnosnih prijetnji koje ne izazivaju rušenje programa poput spyware-a,virusa, trojanaca, keyloggera itd. Ne može dati potpunu sliku sigurnosti sustava, kvalitete ili efikasnosti programa ali pri beta testiranju i debugiranju može biti izuzetno koristan.
Značajke fuzzinga i alata
Alati za fuzzing (prema [2]) su prije svega ovisni o:
- protokolu i formatu datoteka zbog činjenice da se na neki način trebaju priključiti na ulazni tok podataka koji je vezan za metu koju napada
- podacima jer programi mogu interpretirati samo dovoljno strukturirane podatke. Primjerice, ukoliko se spajamo na web poslužitelj, moramo koristiti definirane metode jer web poslužitelj čita samo poruke (poslane GET ili POST metodom) koje su dovoljno strukturirane da ih prihvati.
Obično se fuzzeri svode na kombinaciju više tipova napada ubacivanjem različitog sadržaja poput:
- brojeva (integera,floatova,long int)
- znakova (urlova,cmd ova)
- metapodataka : (id-eva)
- sekvenci binarnih brojeva
- ostalih deformiranih i neočekivanih podataka
Nisu sve vrijednosti jednako opasne. Granične vrijednosti su često stvar koju developeri olako shvaćaju stoga se te vrijednosti zovu fuzz vektori i svojstveni su za svaki tip podataka. Primjerice, za cijele brojeve su to nula,negativni brojevi ili jako veliki brojevi, za znakove je problem izbjegavanje problematičnih znakova (eng. escaping), SQL injection naredbe, posebni znakovi ili nekarakteristično kodirani znakovi.
Svrha samog fuzzinga leži na pretpostavci da niti jedan program nije savršen i da ako smo dovoljno uporni možemo pronaći greške ukoliko poštujemo sustavski pristup problemu.
Fuzzing može dati drugi pogled na klasične metode testiranja software-a poput debug-a ili ručnog pregledavanja koda jer fuzzing možemo u potpunosti automatizirati. Fuzzing neće i ne može zamjeniti sve klasične metode testiranja softwarea ali može ponuditi dodatnu vrijednost samom procesu testiranja.
Fuzzing i web servisi
Prema [3], web servis ili eng. WEB API je definirani skup HTTP zahtjeva s definiranim i strukturiranim odgovorima koje su obično formatirane kao XML (Extensible Markup Language) ili JSON (JavaScript Object Notation). Postoji više vrsta web servisa od kojih su svakako najpoznatiji REST (REpresentational State Trasnsfer) i SOAP (Simple Object Access Protocol) web servisi.
REST
Representational State Transfer (REST) je apstrakcija arhitekturalnih elemenata unutar distribuiranog hipermedijalnog sustava. Rest web servis ignorira detalje implementacije komponenti i sintakse protokola kako bi se fokusirao na same podatke, uloge komponenti i ograničenja u interakciji s drugim komponentama. [5]
Glavne karakteristike REST-a su:
- stateless (bez sessiona i cookiea)
- identifikcija resursa (URL)
- prezentacija podataka(XML, JSON)
- manipulacija resursima kroz prezentaciju
- koristi pravila manipulacije resursima (dohvaćanje GET, kreiranje POST,update PUT, brisanje DELETE)
SOAP
Simple Object Acces Protocol (SOAP) je protokol aplikacijskog sloja OSI modela , te definira specifikacije za razmjenu strukturiranog sadržaja putem web servisa. Koristi XML pri formatiranju poruka, a HTTP za njihovo slanje i primanje. [6] Web servisi koji koriste SOAP četo su definirani WSDL (Web Service Descriptin Language) jezikom koji koristi XML kako bi opisao web servis. SOAP može graditi web servise koji se sastoje od 3 glavna dijela:
- Omotnice koja sadržava strukturu poruke i kako je obraditi
- Skupa pravila za dekodiranje instanci podataka s kojima aplikacija radi
- Konvencije za predstavljanje poziva procedura i odgovora
Glavne karakteristike SOAP-a su:
- Proširivost (sigurnost)
- Neutralnost (SOAP uspješno funkcionira s gotovo bilo kojim transportnim protokolom)
- Neovisnost (proširiv je s gotovo svakim stilom programiranja OOP, deklarativno, agentno...)
Primjer HTTP POST zahtjeva čiji sadržaj je SOAP poruka s omotnicom pomoću koje se od web servisa zahtijeva cijena dionice na temelju njenog imena [6]:
POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: 299 SOAPAction: "http://www.w3.org/2003/05/soap-envelope" <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header> </soap:Header> <soap:Body> <m:GetStockPrice xmlns:m="http://www.example.org/stock"> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
Odabrani alati za fuzzing
Kao alate za fuzzanje odabrali sljedeće:
- WebScarab https://www.owasp.org/index.php/WebScarab
- JBroFuzz https://www.owasp.org/index.php/JBroFuzz
- WSFuzzer https://www.owasp.org/index.php/WSFuzzer
- fuzzer https://www.npmjs.org/package/fuzzer
- BURP http://portswigger.net/burp/ (Intruder mod)
- ZAP https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project (Fuzzer mod)
Testna okolina
Kako bismo mogli komparirati rezultate i mogućnosti koje pojedini alati za fuzzing daju, kao testna okolina s REST i SOAP servsima korišteno je besplatno virtualno okruženje OWASP BWA (Broken web apps), tj. aplikacija Mutillidae II (Web services - SQL Injection) [7]. Kao fuzz vektori odabrani su vektori iz datoteka GenericBlind.fuzz.txt, MySQL.fuzz.txt i MySQL_MSSQL.fuzz.txt dostupnih u fuzzdb-u (https://code.google.com/p/fuzzdb/).
Testiranje alata za fuzzing web servisa
Pokušali smo sa svakim fuzzerom fuzzati REST i SOAP web servis na spomenutoj Mutillidae II aplikaciji i opisati osnovne značajke i karakteristike alata.
WebScarab
WebScarab je framework za analizu aplikacija koje koriste HTTP i HTTPS protokole, a nastao je u sklopu OWASP projekta. Ima nekoliko modova rada, a proširiv je i pluginovima. Nažalost, u vrijeme pisanja ovog teksta na službenim stranicama alata navedeno je kako je ovaj projekt napušten i više neće biti razvijan, kao što je bio slučaj i s nekim drugim OWASP projektima. Od mogućnosti koje nudi, prisutna je većina koja je dostupna i u BURP-u ili ZAP-u. Neke od mogućnosti su proxy mod za presretanje HTTP(S) zahtjeva i odgovora, bandwith simulator, parameter fuzzer - sličan ZAP-u, može izvoditi automatski fuzzing, SOAP plugin za parsiranje WSDL-a, no trenutno je dobio status deprecated, uz preporuku da se za SOAP analize koristi SoapUI.
JBroFuzz
JBroFuzz je još jedan od OWASP-ovih projekata koji je trenutno neaktivan. To je (bio) fuzzer web aplikacija koje rade s HTTP(S) zahtjevima i odgovorima. Posljednja verzija omogućava rad u terminalu (osim u GUI-u), proxy mod, poboljšane fuzzing opcije i drugo. Alat može sam generirati zahtjeve i primati odgovore, no ne nastoji otkriti je li aplikacija ranjiva nego to prepušta ljudskoj analizi. Također, ovaj alat grupira fuzz payload-e u nekoliko kategorija ovisno o vrsti otprije poznate ranjivosti koja se traži. Prema dokumentaciji, trenutno postoji oko 50 vrsta payloada s kojima fuzzer radi pa tako je moguće koristiti replacive fuzzer, recursive fuzzer, double fuzzer, cross product fuzzer, zero fuzzer itd.
WSFuzzer
WSFuzzer još je jedan OWASP-ov projekt. Radi se o Python fuzzeru namijenjenom profesionalnom fuzzanju SOAP web servisa. Neke od njegovih brojnih mogućnosti su testiranje SOAP servisa na temeju validnog WSDL zapisa, detektiranje WSDL-a za danu adresu servisa, jednostavno TCP port skeniranje, fuzzanje više parametara simultano, generiranje fuzz vektora, mjerenje vremena za odgovor na zahtjev, desetak IDS evasion opcija i druge. Fuzzer se koristi iz terminala, a moguće ga je solidno detaljno konfigurirati promjenom parametara u konfiguracijskim datotekama. Nažalost, nismo uspjeli izvršiti fuzzing s ovim alatom jer je prije početka fuzzanja konstantno dolazilo do pogreške. Neki glavni linkovi na službenim stranicama alata nisu ažurirani pa nismo sgurni radi li se trenutno na održavanju ovog fuzzera. Zadnja izmjena na njegovom wikiju napravljena je 2010. godine.
SoapUI
SoapUI je open source alat s vrlo mnogo mogućnosti za testiranje SOAP web servisa (djelomice je podržan i REST). Omogućava izradu automatiziranih funkcionalnih, regresijskijkih, compliance i load testova kroz grafičko sučelje. Nudi i analizu rezultata, snimanje testova, reporting i mogućnost razvoja vlastitih pluginova. Što se sigurnosnih testova tiče, dostupno je nekoliko security scan opcija, među kojima su SQL Injection, fuzzing scan, XPath Injeciton i drugi. Mi smo ovaj alat prvo koristili kako bi na telemju učitanog WSDL-a generirao i poslao zahtjev SOAP servisu koji smo presreli u ZAP-u kako bismo njime mogli odraditi daljnji fuzzing. Također, u alatu smo izvršili osnovni fuzz scan i SQL injeciton scan. Fuzz scan na temelju konfiguriranih parametara generira nasumične stringove i šalje ih servisu, pritom bilježeći odgovor. SQL injeciton scan pak šalje unaprijed zadane ili učitane fuzz vektore za SQL injection. Nažalost pritom nismo pronašli opciju za učitavanje datoteke fuzz vektora. Prilikom kreiranje testa moguće je i dodati tzv. assertions koji provjeravaju je li uistinu došlo do ranjavanja aplikacije. Rezultate je moguće pregledavati u sklopu kreiranog projekta. Za potrebe ovog projekta iskoristili smo vrlo mali broj mogućnosti ovog dosta opsežnog alata, stoga je za temeljitu procjenu kvalitete potrebno provesti više vremena u radu s njim.
ZAP
Zed Attack Proxy je besplatan alat za penetracijska testiranja web aplikacija nastao u sklopu OWASP Zed Attack Proxy projekta. To je zapravo skup raznih alata koji profesionalcima, ali i početnicima omogućava razne vrste automatiziranih i ručnih sigurnosnih testova web aplikacija. Alat za fuzzing ima jednostavno ime Fuzzer. Kako bi se fuzzing mogao obaviti, potrebno je uključiti proxy mod u web pregledniku i ZAP-u te poslati HTTP zahtjev prema web servisu. Zahtjev će biti presreten u ZAP-ovom proxyju i naknadno (ili trenuno) će mu biti moguće mijenjati parametre. Fuzzer dolazi s određenim brojem datoteka sa fuzz vektorima za nekoliko vrsta ranjivosti, a omogućava i unos vlastite datoteke s vektorima. Fuzzing je u ZAP Fuzzeru prilično jednostavan, kao i pregled rezultata. U rezultatima je moguće vidjeti HTTP metodu, URI, statusni kod i poruku (mogu biti važni kod fuzzinga), zatim RTT, veličinu odgovora, fuzz vektor i state. State može imati vrijednosti reflected - vektor je pronađen u odgovoru na zahtjev, successful - zahtjev je uspješno poslan i odgovor primljen (bez fuzz vektora u tijelu odgovora), i error - došlo je do pogreške u slanju zahtjeva ili primanja odgovora. Kada se fuzza SOAP web servis, dosta nezgodno je to što su znakovi fuzz vektora u tijelu zahtjeva zamijenjeni escape kodovima pa je upitno je li fuzzing ispravno izvršen. Također, kako bismo uspješno mogli fuzzati SOAP servis, morali smo prije pomoću drugog alata (SoapUI) poslati "običan" SOAP zahtjev i presresti ga u ZAP-u. Rezultate fuzzinga nije moguće grupno izvesti u datoteku, već samo spremiti sesiju u ZAP-u.
BURP Suite
BURP Suite je uvelike sličan ZAP-u te je jedan od najpoznatijih alat za penetracijska testiranja web aplikacija. BURP je inače komercijalan alat no postoji i besplatna verzija koja je i više nego dovoljna potrebama našeg testiranja. BURP se kao i ZAP sastoji od skupa različitih alata među kojima je i fuzzer. Također potrebno je u web pregledniku namjestiti proxy mod kako bi BURP mogao uhvatiti HTTP zahtjev koji šaljemo prema serveru. Prilikom testitranja uz BURP korišten je firefox preglednik te foxy proxy dodatak. Nakon što odredimo port na kojem će proxy slušati requestove i prosljeđivati ih BURPU spremni smo za početi fuzzing. Nakon presretanja HTTP zahtjeva u BURPu se uključuje Proxy/Intercepter, što bi označavalo da je naš zahtjev uspješno uhvaćen. U ovom modu možemo određivati što želimo učiti s pojedinim zahtjevom. Sve ovo nam omogućava mjenjanje parametara stoga kao i kod ZAP-a možemo uhvatiti neki parametar ( primjerice username ili password kod prijave u sustav) te ga bombardirati (fuzzati) čudnim zahtjevima. Nakon što uhvatimo zahtjev koji želimo modificirati,desnim klikom odaberemo opciju "send to intruder", odaberemo Intruder opciju u izborniku te odaberemo neku od opcija koje nam se nude (Sniper, Pitchfork, Battering ram, Cluster bomb) te odabermo parametre koje želimo ispitati.Nakon toga sve što nam preostaje je odabrati payload (fuzzing vektori),odnosno podatke koje ćemo slati serveru. Također moguće je podesiti pretraživanje rezultata i vektora po ključnim riječima te postaviti parametre poput broja dretvi, vremena između zahtjeva i brojnih drugih opcija. Nakon odabira opcije "start attack" u Intruder tabu, fuzzing počinje te se može vidjeti izuzetno pregledna lista HTTP odgovora koja se može sortirati prema svakom parametru koji je dostupan (id zahtjeva,vektor,duljina odgovora i slično). Za slanje SOAP zahtjeva je potrebno znati wsdl ili ga kreirati. BURP sam po sebi to nema, no postoje ekstenzije koje to omogućuju. Također možemo s nekim drugim alatom poput Soap UI kreirati zahtjev, presresti ga pomoću proxya te izmjenjati parametre.
Katyusha fuzzer
Katyusha fuzzer je osmišljen kao jednostavni fuzzer REST i SOAP web servisa. Pisan je u pythonu te koristi Angular.js za prikaz rezultata fuzzinga.
Github stranica projekta s uputama za korištenje dostupna je na lpredova/Katyusha.
Kao testna okolina prilikom izrade fuzzera korištena je OWASP DVWA Mutillidae II okolina.
Instalacija i pokretanje
Prije prvog pokretanja fuzzera potrebno je instalirati dvije python biblioteke koje služe za napredno slanje i manipulaciju http zahtjeva u za REST i SOAP servise.
- Pysimpesoap - https://code.google.com/p/pysimplesoap/
- Requests - http://docs.python-requests.org/en/latest/
Značajke
Katyusha fuzzer podržava slanje REST i SOAP zahtjeva. Kod slanja REST zahtjeva nam je omogućeno dodavanje N parametara i odabir želimo li taj parametar fuzzati ili ne. Budući da se nismo odlučili za izradu alata s grafičkim sučeljem, ovaj pristup smo prihvatili kao najprikladniji. Osim definiranja parametara još postoji mogućnost odabira metode koju želimo odabrati (POST ili GET za sada).
Kod SOAP zahtjeva potrebno je dati putanju do WSDL datoteke iz koje čitamo parametre koje servis prima te nakon toga se korisnika za svaki parametar eksplicitno pita želi li ga fuzzati. Nakon što su parametri odabrani obavlja se fuzzing.
Nakon završetka fuzzanja korisniku je ponuđena opcija prezentacije rezultata u web pregledniku. Ukoliko korisnik želi vidjeti i pretraživati rezultate, browser će mu sam otvoriti novi tab s rezultatima, a ukoliko se to ne dogodi može kopirati generirani link u web preglednik. Rezultati fuzzanja su sortirani prema duljini odgovora.
Fuzz vektori
Također svaki fuzzer je samo alat za slanje HTTP zahtjeva a njegova posebnost i snaga leži u podacima koje šalje (fuzz vektorima). Proces prikupljanja najučestalijih napada je izuzetno dugotrajan te smo odlučili preuzeti podatke za napad iz Fuzz db projekta koji koristi najučestalije uzorke napada, od sql injectiona,xss-a i brojnih drugih ranjivosti.
Fuzz db - https://code.google.com/p/fuzzdb/
Treba napomenuti kako je trenutno rješenje,odnosno izvor podataka za fuzzing uvelike omogućen fuzzdb-om, no ne koristimo sve njegove uzorke napada te u budućim iteracijama poboljšanja fuzzera svakako bi valjalo razmotriti kako učinkovitije koristiti sve opcije koje nam fuzzdb pruža.
Nakon instalacije potrebnih biblioteka dovoljno je pokrenuti main.py dadoteku. Kako bi smo pokrenuli Katyusha fuzzer u konzolu unesimo:
python main.py
Primjer korištenja
Nakon pokretanja fuzzera ponuđen je izbornik s glavnim opcijama.
Please choose your action: 1) Fuzz API service 2) View results 3) Quit Select:1
REST fuzzer
################################################ REST FUZZER ################################################ Please insert URL to API :http://192.168.56.101/mutillidae/webservices/rest/ws-user-account.php Method: 1) GET 2) POST 3) Quit Select:1 ################################################ Name of the parametar you want to fuzz :username Fuzz this parameter (Y/N):y Add more parameters (Y/N) ? n Fuzzing started...
SOAP fuzzer
################################################ SOAP FUZZER ################################################ WSDL URL: http://192.168.194.128/mutillidae/webservices/soap/ws-lookup-user-information.php?wsdl Please wait... Do you want to fuzz operation getUserInformation ? (y/n) y Fuzz argument username ? (y/n) y Fuzz argument password ? (y/n) y Fuzzing operation getUserInformation... Fuzzing done. Errors: 0 Results saved at: 'results/'soap_result_2015_01_08_20_23_58.json
Pregled rezultata
Fuzzing done... Results saved at: 'results/'rest_result_2015_01_08_02_23_04.json View results: 1) YES 2) NO 3) Quit Select:1 Find results at: http://localhost:8088/#/rest_result_2015_01_08_02_23_04.json running local server... Listening on 8088
Poboljšanja u budućnosti
Katyusha fuzzer je poprilično direktan i jednostavan za korištenje te kao takav postoji mnogo prilika za poboljšanje.
Neka od područja koja autori razmatraju za poboljšanja u budućnosti su:
- Podrška za proxy,odnosno slušanje prometa poput mehanizama koji su implementirani u ZAP ili BURP
- Opcija fuzzinga parametara zaglavlja HTTP requesta
- Implementacija logike za filtriranje rezultata po procjeni njihove relevantnosti
- Odabir fuzz vektora za određeni tip napada, primjerice SQL ranjivosti,Timing attacks i slično.
- Opcija pretraživanja prošlih rezultata te analitika rezultata kroz povijest
- Uklanjanje pogreški koje se događaju kod određenih znakova fuzz vektora u SOAP fuzzeru
Izvori
[1] “Fuzz testing,” Wikipedia, the free encyclopedia. Dostupno: http://en.wikipedia.org/wiki/Fuzz_testing [Pristupano: 4-Oct-2014].
[2] “Fuzzing - OWASP.” [Online]. Dostupno: https://www.owasp.org/index.php/Fuzzing. [Pristupano: 29-Oct-2014].
[3] “Application programming interface,” Wikipedia, the free encyclopedia. Dostupnp: http://en.wikipedia.org/wiki/Application_programming_interface [Pristupano: 04-Nov-2014].
[4] “Automated Penetration Testing with White-Box Fuzzing.” [Online]. Dostupno: http://msdn.microsoft.com/en-us/library/cc162782.aspx. [Pristupano: 05-Nov-2014].
[5] “Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST).” [Online]. Dostupno: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm. [Pristupano: 05-Nov-2014].
[6] “SOAP,” Wikipedia, the free encyclopedia. Dostupno: http://en.wikipedia.org/wiki/SOAP [Pristupano: 04-Nov-2014].
[7] “OWASP Broken Web Applications Project - OWASP.” [Online]. Dostupno: https://www.owasp.org/index.php/OWASP_Broken_Web_Applications_Project. [Pristupano: 05-Nov-2014]