Yllättävä tempaus Tietoturvahaasteen finaaliin!

Reilu kuukausi sitten päätin osallistua parin kaverini kanssa Viestintäviraston Tietoturvahaasteeseen. Kilpailu oli avoin kaikille ja se houkutteli paljon osallistujia esimerkiksi F-securelta, Helsingin yliopistosta ja Aallosta. Ensi viikonloppuna kilpailemme finaalissa tietoturva-alan asiantuntijoita vastaan.

”Tietoturvahaaste on Viestintäviraston järjestämä kilpailu, jossa etsitään tietoturvahaavoittuvuuksia ja ratkotaan tietoturva-aiheisia tehtäviä haasteisiin piilotettujen vihjeiden avulla.”

Haasteissa nopeus ratkaisi, eli mitä nopeammin ratkaisit haasteen niin sitä varmemmin olit jatkossa. Ajanotto alkoi haasteen lataamisesta ja loppui vastauksen lähettämiseen.

Keskityn tässä blogissa ryhmämme taipaleeseen alkuhaasteesta finaaliin, joka järjestetään Junction Hackatonissa 25.-27.11.2016.

Ensimmäinen haaste – Hiljainen SQL haavoittuvuus

Ensimmäinen tietoturvahaaste ohjasi haastesivulle, jossa oli kirjautumislomake kysyen käyttäjätunnusta ja salasanaa. Verkkosivun lähdekoodeista löytyi vihje, että ylläpitotunnus on mahdollisesti disabloimatta. Koska tarkoituksena oli ilmiselvästi päästä murtautumaan lomakkeesta sisään, oli SQL-injektion etsiminen ensimmäisten tarkistettavien asioiden joukossa.

Kaappasimme palvelimelta palaavan vastauksen epäonnistuneesta kirjautumisyrityksestämme Burp-proxyn avulla. Syötimme saamamme vastauksen SQL-injektioiden hyväksikäyttöön erikoistuneeseen SQLmap-tietoturvatyökaluun seuraavalla komennolla:

./sqlmap.py -r req.txt –level 5 –risk 3 –delay 1

Työkalu selvitti, että Password-parametri on haavoittuva aikaperusteiselle hyökkäykselle. Tämän ohjelma sai selville erilaisilla syötteillä. Esimerkiksi yksi salasanakenttään tarjottu syöte voisi olla ”admin’) OR SLEEP(5)–”, mikä viivästyttää serverin vastausta viideksi sekunniksi, jos palvelimella on SQL haavoittuvuus. Pian tämän jälkeen, työkalu selvitti palvelimen ympäristötiedot, tunnisti tietokannan ja löysi users-taulusta admin-käyttäjän salasanalla G4)dBo2!a. Syöttämällä nämä tunnukset lomakkeeseen, saimme tehtävän ratkaistua.

Toinen haaste – Linkin etsiminen salatusta verkkoliikenteestä

Haasteessa saimme salatun verkkoliikennenauhoituksen, jonka avasimme Wireshark-työkalulla. Meille oli annettu myös liikenteen purkamiseen soveltuva .pem avain, jonka syötimme Wireshark-ohjelmaan. Purettu verkkoliikenne sisälsi verkkokyselyn tietoturvahaastesivun verkkoresurssiin, jonka avaaminen selaimessa ratkaisi tehtävän.

Kolmas haaste – Maatuska

Haasteeksi annettiin maatuskaa esittävä kuvatiedosto. Haastekontekstissa maatuska on vihje tiedostoon piilotetuista kerroksittaisista asioista. Nopea vilkaisu kuvaan sisällytettyihin merkkijonoihin strings-ohjelmalla antaa merkkijonon uggc://vzntrfgrtnabtencul.pbqrcyrk.pbz/. Merkkijono muistuttaa huomattavasti verkko-osoitetta, ja merkkien keskinäiset esiintyvyydet viittaavat vahvasti siihen, että kirjaimet on korvattu toisillaan, esim http, muotoon uggc.

Kuvatiedoston purkaminen tarjosi tiedoston, joka osoittautui äänitiedostoksi. Äänitiedoston piipityksessä ei ollut tolkkua, mutta EXIF-metatiedoissa oli seuraava vihje: ”Awesomesauce SSTV Scottie S1”. Se oli viittaus formaattiin, jolla äänen voi muuttaa kuvaksi.

Lopulta purimme koodauksen Androidille saatavalla sovelluksella. Käytännössä sovelluksesta valittiin oikea formaatti ja painettiin kännykkä kiinni tietokoneen kaiuttimiin ääntä toistaen. Ohjelma muodosti äänestä kuvan, josta erottui linkki tietoturvahasteen päättävälle sivulle.

Neljäs haaste – Session lainaus

Haasteessa annettiin jälleen verkkoliikennenauhoitus, jota tutkimme Wiresharkilla. Nauhoituksesta paljastui salaamaton käyttäjätunnus ja salasana, sekä verkkopalvelun osoite. Kirjautumalla kyseiseen palveluun kyseisillä tunnuksilla palvelu estää kirjautumisen toteamalla sessioavaimen tuntemattomaksi. Verkkonauhoituksesta paljastui käyttäjän käyttämä tunniste, jonka asetimme Firefox-selaimen Web Console -työkalulla (ctrl+shift+k) seuraavasti:

document.cookie = ”PHPSESSID=u25atq9g4lct63frd4fln5eif0”

document.cookie = ”sid=965d37481352cb2c”

Tämän jälkeen kirjautuminen sisään onnistui millä tahansa epätyhjällä käyttäjätunnussalasanalla ja haaste päättyi.

Viides haaste – Kryptohaaste

Haaste koostui kahdesta osasta: obfuskoinnista ja salausohjelmasta. Obfuskoitu, eli tarkoituksenmukaisesti monimutkaistettu, ohjelma saatiin ratkaistua purkamalla zlib- ja base64-koodatut kerrokset. Obfuskoidusta sisällöstä avautunut koodi paljasti vinkkejä salausohjelmasta. Esimerkiksi salauksen lähdekoodi oli tiedossa, salasana sisälsi vain pieniä kirjaimia ja numeroita ja salattu tiedosto alkoi merkkijonolla http://. Lisäksi lähdetiedostosta paljastui, että salausalgoritmi muistuttaa kovasti RC4-salausta ja selvisi, että salaus on symmetrinen, joten samaa salausfunktiota käyttämällä voidaan kohdetiedosto joko purkaa tai salata.

Aluksi loimme yksinkertaisen brute force -menetelmää käyttävän purkusovelluksen, joka testailee kaikki merkkijonot läpi aloittaen lyhyistä merkkijonoista ja kasvattamalla vähitellen salasanan pituutta. Paransimme koodin tehokkuutta liittämällä bruteforce-koodin alkuperäisen lähdekoodin sekaan. Näin vältimme tehokkaasti ylimääräiset prosessien luonnit.

Salausohjelmasta löytyi lisäksi haavoittuvuus, että kaikki salasanan merkit eivät ole merkitseviä riippuen salasanan pituudesta. Salasana löytyi alle vuorokaudessa hajautetun bruteforcetuksen ansiosta. Kohdistimme resursseja ja etsimme ensimmäkseen pitkiä salasanoja, jotka yllä mainitun toteutusvirheen takia olivat heikkoja. Yllättäen oikea salasana ei ollutkaan yli kymmenmerkkinen, vaan putkahti seitsemän merkin pituisena, jonka kaikki merkit olivat täten merkitseviä.

Loppusanat

Tässä oli taipaleemme haasteen aloittamisesta tietoturvafinaaliin! Odotamme innolla viikonloppua ja toivomme tutustuvamme myös muihin alan asiantuntijoihin. Opin matkalla paljon ja toivon, että finaalikin on yhtä opettavainen.