Online roosterbord 'hacken'!

Digitale inbraken waarbij persoonlijk informatie wordt buitgemaakt, het nieuws staat er tegenwoordig vol mee. Veel bedrijven / instellingen denken ‘ons overkomt dit niet’, maar door kleine fouten komt er vaak gevoelige informatie op straat te liggen.

In dit artikel zal ik uitleggen uit hoe ik op mijn vorige school eenvoudig toegang kreeg tot privacy gevoelige gegevens, door middel van de online rooster software.

Waarom heb ik dit onderzocht?

Een onderdeel van mijn profielwerkstuk in 6VWO was het testen van de ‘informatieveiligheid’ op school. Dit onderzoek was enkel op webapplicaties gericht, die ook buiten het schoolnetwerk benaderbaar waren. In dit artikel zal ik mijn resultaten met betrekking tot de online rooster software tonen.

Fase 1: het onderzoek

Het onderzoek begon met research naar de gebruikte software. Op mijn oude school werd gebruik gemaakt van de rooster software van Zermelo. Infoweb; de website waarbij online het rooster kon worden bekeken was eveneens afkomstig van Zermelo. Zermelo biedt twee varianten van Infoweb aan, namelijk ‘zonder inloggen’ en ‘met inloggen’.
Op mijn school werd gebruik gemaakt van de versie waarbij inloggen vereist is, wat betekent dat de gegevens van alle leerlingen ergens moeten worden opslagen. Via de website van Zermelo is het voor iedereen mogelijk om de nieuwste versie van Infoweb (beiden versies) te downloaden. Dit zorgt ervoor dat het mogelijk is om te kijken waar de gebruikersgegevens worden opgeslagen en op welke manier er verbinding wordt gemaakt.

Infoweb is een webapplicatie geschreven in PHP. Na het doorzoeken van de php bestanden kunnen er al een aantal conclusies getrokken worden:

define( "WACHTWOORDENMAP", "../data/wachtwoorden" );  
define( "WACHTWOORDENBESTAND", "../data/wachtwoorden/wachtwoorden.txt" );  

De wachtwoorden komen niet uit een database, maar worden opgeslagen in een tekst bestand wat een standaard locatie heeft.

Nu de locatie van het wachtwoordenbestand bekend is, kan er gekeken worden of dit bestand openbaar staat. De URL van mijn school is http://rooster.school.nl, wat een iframe is die verwijst naar http://rooster.school.nl/infoweb/index.php. De URL is in dit geval dan http://rooster.school.nl/data/wachtwoorden/wachtwoorden.txt.

Tot mijn verbijstering stond dit bestand niet afgeschermd, waardoor het .txt bestand geheel te lezen (en downloaden) was. Het bestand wat ik heb ingezien bevatte gegevens van 2660 personen, waaronder leerlingen en ouders. Docenten konden via een algemene account inloggen, waardoor elke docent niet individueel in het bestand stond.

Elke regel had de volgende structuur:

105112 105112 Mick Vleeshouwer e34eadf84c7aaf0013946f7e5940235b1bf58de7 0

Gebruikersnaam – ID – Voornaam – Achternaam – Wachtwoordhash – Rechten – Type

Het meest interessante zijn natuurlijk de gebruikersnaam en het wachtwoord. Op het wachtwoord wordt duidelijk een encryptie toegepast, maar het is geen standaard encryptie. Wanneer ik verder de php bestanden doorspit kom ik een interessant stuk tegen;

function encrypt_user_pass($user, $pass)  
    {
        $user_sha = sha1(strrev(str_rot13(strtolower($user))));
        $pass     = sha1(strrev(str_rot13(           $pass )));
        $totaal = substr($pass, 0, -2).substr($user_sha, 15, 1).substr($user_sha, 4, 1);
        return $totaal;
    }
$totaal = encrypt_user_pass($username, $paswoord);

Om de wachtwoord hash te genereren wordt er gebruik gemaakt van een combinatie van de gebruikersnaam en het wachtwoord. De encryptie (zie bovenstaande code) is niet te decrypten helaas, dus er zullen andere oplossingen moeten worden gezocht.

Fase 2: het echte ‘hack’ werk

Nu de encryptie bekend is begint het echte werk pas. Om op school aan te tonen dat deze situatie absoluut niet veilig is heb ik ervoor gekozen om te proberen of het admin wachtwoord te kraken is. De gebruiker ‘admin’ had beheerrechten voor Infoweb.

Bekend is dat de encryptie niet om te draaien is, waardoor er naar een andere manier moet worden gezocht om de wachtwoord hash te ‘kraken’. Het is echter wel mogelijk om alle mogelijke combinaties te proberen en zelf een wachtwoord hash aan te maken, waarbij je deze elke keer vergelijkt. Wanneer de wachtwoord hashes overeen komen, dan weet je het wachtwoord.

Deze methode kost echter veel tijd en computerkracht. Je moet voor elke gebruiker elk mogelijke wachtwoord genereren. Wanneer men een wachtwoord van 6 tekens gebruikt met alleen normale letters dan zijn dit maar liefst; 26^6 (=308915776) mogelijke combinaties. Worden hier ook nog hoofdletters aan toegevoegd, dan zijn het al 52^6 (=19770609664) mogelijke combinaties.

Om alle mogelijke combinaties te genereren heb ik php script geschreven. Dit script genereerde wachtwoorden met alle ingestelde karakters en een maximale lengte. De gebruiker dient een gebruikersnaam en een wachtwoord hash in te voeren en het script doet het werk. Het php script kan het beste lokaal uitgevoerd worden, bijv. in de (OS X) terminal.

In 6VWO had ik nog geen kennis van andere programmeertalen dan PHP, om deze reden heb ik ervoor gekozen om in PHP een script te schrijven. In andere programmeer talen zou dit veel efficiënter / sneller kunnen.

Het resultaat

Om het wachtwoord van de gebruiker ‘admin’ te kraken heb ik aantal combinaties moeten uitproberen. Ik ben begonnen met alle karakters uit het alfabet (kleine letters, 26). De maximale lengte waarmee ik ben begonnen was 6 karakters. Na een aantal uren genereren kwam er helaas niets uit, het wachtwoord had dus meer karakters en/of andere karakters.

De tweede poging begon weer met alle karakters uit het alfabet (kleine letters, 26), maar dit keer met een maximale lengte van 7 karakters. Na maar liefst 8 uur non-stop wachtwoorden genereren kwam het goede nieuws; “Match found!”.

Script

Wat kon ik met deze gegevens?

Met de gebruikersnaam ‘admin’ en zijn wachtwoord had je beheer rechten in de rooster webapplicatie. Hier kon weinig belangrijks aangepast worden, omdat alle roosters via de Windows software als tekstbestand gepubliceerd worden. Hier is weinig schokkends aan, je kon hoogstens wat ‘kwajongensstreken’ uitvoeren.

De gegevens van alle leerlingen zijn echter wel privacy gevoelig! In het wachtwoorden bestand stond de volledige naam, het leerlingnummer en de wachtwoord hash. Het wachtwoord heeft bij elke leerling 6 tekens en maakt gebruik van hoofdletters, wat zorgt voor 52^6 mogelijk combinaties. Het kraken van deze wachtwoorden zal beduidend meer tijd kosten, maar het is wel mogelijk.

Wanneer het wachtwoord gekraakt zou worden, heb je toegang tot privacy gevoelige informatie. Je zou kunnen inloggen op Magister, de webmail en op alle andere diensten waarvoor je schoolgegevens worden gebruiken. Via de webmail is het weer mogelijk om aan andere gegevens te komen enz. Op deze manier is het relatief eenvoudig om veel privacy gevoelige informatie te verzamelen.

Samenvatting; waar ging het fout?

Om deze ‘hack’ uit te kunnen voeren zijn een aantal factoren belangrijk. In mijn geval was het relatief simpel, omdat er meerdere factoren niet goed waren. De belangrijkste factoren waardoor deze hack kon gebeuren waren;

  • Wachtwoorden.txt bestand niet afgeschermd!
  • Een onveilig wachtwoord (7 tekens, alleen kleine letters)
  • Bronbestanden te downloaden via de Zermelo website.

De meest belangrijke fout is natuurlijk het niet afschermen van het wachtwoorden bestand. Dit kan eenvoudig op elke webserver door de rechten aan te passen. Het onveilige wachtwoord (sangria) heeft er ook aan meegeholpen dat het vrij snel te kraken was. Wanneer dit hoofdletters en speciale karakters had gehad, dan was het al een stuk moeilijker te kraken… Zermelo zou mogelijk de bronbestanden op haar website pas beschikbaar kunnen maken nadat er ingelogd is, maar een groot probleem is dit niet.

Disclaimer:

Dit artikel is gebaseerd op gebeurtenissen uit mei/juni 2013, toen ik in 6VWO zat. Inmiddels zijn alle problemen opgelost. De naam van de desbetreffende school is in het gehele artikel weggelaten.

Mick Vleeshouwer

Developer, entrepreneur and student Information Technology. Graduate Intern at Microsoft NL.

Amsterdam