[Home/Nieuws]  [Magazines]  [Meetings]  [Downloads]  [Redaktie]  [Geschiedenis]


Veiligheidsonderzoek ABN AMRO HomeNet 2.0
Door Bastiaan Bakker en Richard Odekerken

Hoofdstuk 5 - De HomeNet software

5. De HomeNet software

5.1 Onderdelen van HomeNet

De HomeNet software bestaat uit een fors aantal onderdelen. In de directory waar HomeNet geïnstalleerd is bevinden zich drie subdirectories (EXE, DATA en TEMP), met respectievelijk de programmabestanden en de database-bestanden. De directory TEMP dient voor opslag van tijdelijke bestanden.

5.1.1 De programmabestanden

In de EXE directory bevinden zich 27 dynamische libraries (DLL's) en 5 executables. De copyright teksten, version resources en geïmporteerde en geëxporteerde functies van al deze DLL's zijn bekeken om zo inzicht te krijgen in de samenhang van het programma en de "interessante" delen er uit te kunnen lichten. Het volledige overzicht van DLL's is te vinden in Appendix A. (niet echt interessant, niet gepubliceerd)

5.1.2 De database-bestanden

In de DATA directory bevinden zich ongeveer 250 bestanden met extensies als .PX, .DB, .X01, .Y01. Het blijkt hier te gaan om een Borland Paradox database.

Een Borland Paradox database kan benaderd worden door middel van de al eerder genoemde Borland Database Engine (BDE). Omdat de hiervoor benodigde ontwikkeltools niet beschikbaar waren, en omdat het vermoeden bestond dat de bestanden wel eens beveiligd zouden kunnen zijn, is meteen gezocht naar een andere oplossing om deze database bestanden uit te kunnen lezen.

Via Wotsit's File Format Collection (http://www.wotsit.org/) was snel een beschrijving van het Paradox bestandsformaat gevonden. Met behulp van deze beschrijving is het programmaatje PXDUMP gemaakt, wat een Paradox bestand snel en eenvoudig kan uitlezen.

Een volledig overzicht van de tabellen is te vinden in Appendix B, de source code van PXDUMP in Appendix E.

Bij het onderzoeken van de database-bestanden valt meteen op dat deze niet beveiligd zijn - Paradox biedt de mogelijkheid om database bestanden te encrypten, en van deze mogelijkheid is geen gebruik gemaakt. Voor eenieder met toegang tot de PC waarop HomeNet geïnstalleerd is zijn de database-bestanden met wat moeite uit te lezen.

Zo is een lijstje met 'interessante' bestanden snel gemaakt:

  • ACCOUNT.DB - Koppeling tussen gebruikers en rekeningen.
  • PAYMENT.DB - Alle aangemaakte overboekings-opdrachten.
  • RECURPAY.DB - De tabel met daarin de herhalende betalingen.
  • STA_MOVE.DB - Alle overboekingen op de rekeningen.
  • STA_GLOB.DB - Alle rekeningsaldi in de loop van de tijd.
  • USERFILE.DB - Gebruikersdatabase.
Met behulp van PXDUMP of elke BDE-compatible database viewer zijn al deze bestanden zonder enige moeite in te zien en/of te wijzigen.

5.2 Customer.exe

Van de 5 executables waaruit HomeNet bestaat, zijn er twee die direct door de gebruiker te starten zijn: HNWIN.EXE (het HomeNet programma), en Customer.exe.

Customer.exe blijkt een hulpprogramma voor de HomeNet helpdesk te zijn, wat dient om de toegang tot het HomeNet pakket te herstellen wanneer de gebruiker zijn wachtwoord vergeten is. Wanneer het gestart wordt verschijnt de volgende tekst (inclusief twee verschillende spelwijzen van het woord 'Sleutelcode'):

HERSTELLEN TOEGANG HOMENET

De Administratie Rehabilitatie heeft een sleutel code nodig.
De sleutelcode wordt gegeven door de HomeNet helpdesk. 
Bel de helpdesk a.u.b.
Vervolgens dient de gebruiker zijn contractnummer en postbusnummer in te vullen. Ook wordt een zogenaamd 'randomnummer' van 12 cijfers berekend. Op basis van deze gegevens wordt door de helpdesk een 'code' berekend, die in customer.exe ingevoerd dient te worden. In de volgende paragraaf zal blijken dat dit echter allemaal veel makkelijker kan.

5.3 De gebruikersdatabase

De gebruikersgegevens worden opgeslagen in het bestand USERFILE.DB. Het is gebleken dat wanneer een gebruiker zijn wachtwoord voor het lokale pakket (dit is dus niet noodzakelijk hetzelfde als het wachtwoord voor de bankserver) wijzigt, dit de volgende velden in de tabel beïnvloedt:
  • USR_PASSWORD
  • USR_LGTHPASSW
  • USR_LASTPASSMODDAT en USR_LASTPASSMODTIM
  • USR_OLDPASSW1
  • USR_OLDPASSW2
Het veld USR_PASSWORD bestaat uit 24 ASCII cijfers (0x30 - 0x39) (altijd beginnend met een '0'), en tot slot een karakter met als ASCII waarde de lengte van het wachtwoord. Deze waarde wordt ook in het veld USR_LGTHPASSW geplaatst. De inhoud van dit veld is waarschijnlijk een hash over het wachtwoord. Wanneer deze hash overeenkomt met de hash van het door de gebruiker tijdens de login-procedure ingevoerde wachtwoord, is het juiste wachtwoord ingevoerd.

Wanneer het wachtwoord wordt gewijzigd wordt de oude waarde van het USR_PASSWORD-veld in USR_OLDPASSW1 geplaatst, en die van USR_OLDPASSW1 in USR_OLDPASSW2. Deze velden dienen ervoor te zorgen dat een gebruiker die zijn wachtwoord moet wijzigen, niet hetzelfde wachtwoord als de vorige keer (of de 2 keer daarvoor) kan kiezen.

Wanneer USR_LASTPASSMODDAT op nul gezet wordt, krijgt de gebruiker bij het inloggen de melding dat het huidige wachtwoord is toegekend door de hoofdgebruiker, en dat hij zijn wachtwoord dient te wijzigen.

Het veld USR_STATUS wordt gebruikt voor het blokkeren van gebruikersaccounts. Wanneer dit de waarde '1' heeft (0x31) is het account geblokkeerd.

Het veld USR_PASSVALIDCYCLE geeft de geldigheid van een wachtwoord aan, in dagen. Wanneer de huidige datum groter is dan USR_LASTMODIFDATE + USR_PASSVALIDCYCLE, dient de gebruiker zijn wachtwoord te wijzigen.

5.3.1 Secutool.dll

De library secutool.dll bevat de functie die van een wachtwoord de bijbehorende hash-waarde berekent: SYSHASHPWD. Deze functie is gedisassembleerd en reverse-engineered. Intern wordt een aantal malen gebruikt gemaakt van de functies DES_KEY en DES_CRYPT. Uit de disassembly blijkt dat dit een ongemodificeerde implementatie van het DES-algoritme is.

SysHashPwd() heeft als invoer het wachtwoord, en als uitvoer de hash-waarde van dat wachtwoord. Dat opent natuurlijk perspectieven: de hash is blijkbaar alleen maar afhankelijk van het wachtwoord.

Dit houdt het volgende in:

  • Geen zogenaamde random seed : een bepaald wachtwoord levert ALTIJD dezelfde hash op.
  • De hash is niet afhankelijk van de gebruikersnaam : hashes zijn uitwisselbaar tussen verschillende gebruikers binnen de HomeNet installatie.
  • De hash is niet afhankelijk van de computer : het pakket kan naar een andere PC gekopieerd worden en het werkt dan nog steeds.
  • De hash is niet afhankelijk van het contractnummer : hashes zijn uitwisselbaar tussen verschillende gebruikers en verschillende HomeNet installaties.
Tevens is gebleken dat HomeNet geen enkele beveiliging (zoals encryptie) of controle (zoals een checksum) op de integriteit van de database-bestanden uitvoert.

Hiermee komen we op het volgende (werkende) scenario:

  • Zoek een bekend wachtwoord op in USERFILE.DB.
  • Noteer de waarden van USR_PASSWORD en USR_LGTHPASSW.
  • Vul deze waarden in, in het record van de (hoofd)gebruiker, in USERFILE.DB op een ander systeem.
  • Start HomeNet en log in als de (hoofd)gebruiker met het bekende wachtwoord.
Het deblokkeren van geblokkeerde accounts kan door eenvoudigweg de waarde van het veld USR_STATUS te wijzigen.

5.3.2 "HomeHack voor Windows"

Om dit scenario op eenvoudige wijze te kunnen demonstreren is een eenvoudige exploit geschreven: HomeHack voor Windows. De source code van deze exploit bevindt zich in Appendix F.

Het programma geeft een overzicht van beschikbare gebruikers. Nadat een gebruiker gekozen is zijn er twee mogelijkheden:

  • Wachtwoord op abcd12 instellen.
  • Deblokkeren van het account.
Wanneer gekozen wordt een reservekopie te maken, wordt de orginele inhoud van userfile.db bewaard. Wanneer HomeHack opnieuw gestart wordt, krijgt de gebruiker de mogelijkheid om deze backup terug te zetten.

5.3.3 Meer over wachtwoorden

Kort rondvragen in onze omgeving leerde dat bij de meeste gebruikers het wachtwoord om toegang te verkrijgen tot het HomeNet pakket, gelijk is aan het bankwachtwoord. Het is dus erg interessant om ook de vertaalslag van hash terug naar wachtwoord te kunnen maken.

De volgende eisen worden aan een wachtwoord gesteld:

  • Minimaal 6 en maximaal 8 tekens
  • Minstens 1 cijfer
  • Minstens 1 letter
  • Minimaal 4 verschillende tekens
  • Alleen letters en cijfers, geen leestekens e.d.
Tevens wordt er geen verschil gemaakt tussen lowercase en uppercase letters, en is de lengte van het wachtwoord bekend (dat is immers opgeslagen in het veld USR_LGTHPASSW).

Wanneer we de regel van 4 verschillende tekens even vergeten (dat doet nauwelijks af aan de hoeveelheid mogelijkheden), komt het aantal mogelijke wachtwoorden op:

  • 6 tekens: 366 - 266 - 106 = 1.866.866.560
  • 7 tekens: 367 - 267 - 107 = 70.322.353.920
  • 8 tekens: 368 - 268 - 108 = 2.612.182.842.880
Uitgaande van duizend pogingen per seconde komt een brute-force attack dan neer op 151,632 dagen voor een wachtwoord van 6 tekens. Voor elk teken méér, neemt dit met een factor 36 toe.

In de praktijk zullen de meeste gebruikers een bestaand woord of bestaande naam als wachtwoord nemen waaraan cijfers zijn toegevoegd of letters door cijfers zijn vervangen (O door 0, i door 1, Z door 2, etc.). Er zijn diverse programma's op internet beschikbaar (bijv 'Crack') die aan de hand van woordenlijsten kandidaatwachtwoorden genereren en ze testen. Praktijkstudies met UNIX /etc/passwd files hebben uitgewezen dat een groot percentage wachtwoorden op deze wijze binnen enkele uren gevonden kan worden.

Omdat in tegenstelling tot de UNIX passwords HomeNet geen gebruik maakt van 'salting' (het toevoegen van willekeurige data aan een password voor het gehashed wordt), is het mogelijk een veel snellere wachtwoordzoekmethode op te zetten: men maakt van te voren een lijst van waarschijnlijke wachtwoorden (aan de hand van een woordenlijst) en berekent de bijbehorende hash. Met huidige gangbare harddisks van 15GB is het mogelijk een lijst op te slaan van tegen de miljard wachtwoorden. Dit is ruim voldoende voor de complete Nederlandse en Engelse woordenlijsten gecombineerd met eenvoudige toevoegingen van cijfers of substituties met cijfers. Het 'kraken' van een HomeNet wachtwoord kan nu in enkele seconden gebeuren: alleen de betreffende hash moet in de lijst worden opgezocht.

5.4 De database met overschrijvingen

Wanneer de gebruiker een overschrijving/betaalopdracht aanmaakt om die vervolgens via HomeNet te verzenden, wordt deze opdracht opgeslagen in een tabel die zich bevindt in het bestand PAYMENT.DB.

5.4.1 Opbouw van de tabel met overschrijvingen

Interessante velden in deze tabel zijn onder meer:

PAY_STATUSBevat de status van een betaling (zie onder)
PAY_DEBACCNUMRekeningnummer waarvan wordt afgeschreven
PAY_BENNAMENaam begunstigde
PAY_BENCITYWoonplaats begunstigde
PAY_BENACCNUMRekeningnummer begunstigde
PAY_AMOUNTBedrag
PAY_INTAMOUNTGuldens
PAY_DECIMALAMOUNTCenten
PAY_SENDEDBevat '*' indien betaling is geselecteerd voor verzending

Het veld PAY_STATUS kan onder meer de volgende waarden aannemen:

01Overschrijving geweigerd door bank - meer informatie in de velden PAY_REJECTCODE en PAY_REJECTTEXT
03Overschrijving aangemaakt, nog niet verzonden
04Overschrijving verzonden
08Overschrijving geslaagd (teruggemeld door bank)

5.4.2 Manipulatie van PAYMENT.DB

Evenals in het geval van USERFILE.DB blijkt het mogelijk om PAYMENT.DB op eenvoudige wijze te wijzigen zonder dat HomeNet hier 'erg' in heeft. Dit schept de mogelijkheid om betalingsopdrachten te wijzigen of toe te voegen.

Betalingsopdrachten dienen echter, nadat ze zijn aangemaakt, door de gebruiker per stuk en handmatig te worden geselecteerd voor verzending. Dat wil zeggen dat het niet zonder meer mogelijk is om een betalingsopdracht toe te voegen zonder dat de gebruiker dit merkt.

Het scherm waarin de gebruiker de betalingsopdrachten dient te selecteren, kent een zwakheid. Het is op dit scherm niet mogelijk om te zien naar welke rekening het bedrag wordt overgemaakt - alleen de naam van de begunstigde en de omschrijving zijn zichtbaar. Daarnaast wordt het bedrag getoond en de rekening waarvan het bedrag zal worden afgeboekt (HomeNet ondersteunt meerdere rekeningen).

Eén mogelijkheid is dus, om het rekeningnummer van de begunstigde te vervangen door een ander rekeningnummer. Hierbij mogen het bedrag en de naam van de begunstigde niet gewijzigd worden, zodat een aldus gewijzigde betaling te ontdekken is doordat de naam en het rekeningnummer van de begunstigde niet overeenkomen. In de praktijk is gebleken dat ABN AMRO hierop geen controle uitvoert en dat een op dergelijke wijze gemanipuleerde betaling gewoon wordt uitgevoerd.

Een andere methode wordt mogelijk gemaakt door het veld PAY_SENDED in de tabel. Wanneer een betaling ter verzending wordt geselecteerd door de gebruiker, wordt die betaling gemarkeerd door het plaatsen van een sterretje in dit veld. Wanneer een betaling een sterretje in PAY_SENDED bevat, is deze al door de gebruiker geselecteerd. De betaling wordt echter pas verzonden indien de gebruiker het bankwachtwoord invoert en op de knop 'Zenden / Legen postbus' drukt.

Het tijdsinterval tussen selectie en verzending kan worden aangegrepen om ongemerkt ook de naam van de begunstigde en het bedrag van de betaling te manipuleren, zonder dat de gebruiker dit merkt. Hiervoor is vanzelfsprekend wel toegang tot de PC vereist terwijl de gebruiker bezig is om het verzenden van de betalingen voor te bereiden. Wanneer de computer al verbonden is met Internet en bovendien onveilig geconfigureerd is (bijvoorbeeld doordat Windows Bestandsdeling is ingeschakeld) is het mogelijk om de database op afstand aan te passen.

Eenvoudiger is echter om een geautomatiseerde oplossing te maken. Door middel van een 'Trojaans paard' zou het zeer eenvoudig zijn om door middel van een verborgen stukje programmatuur op de computer van de gebruiker de databasetabellen in de gaten te houden, en het rekeningnummer te wijzigen nadat een nieuwe betaling is aangemaakt. De enige drempel die dan moet worden genomen, is het installeren van deze software op de computer van de gebruiker. Hiervoor zou bijvoorbeeld gebruik gemaakt kunnen worden van bugs in bekende software - zoals Microsoft Outlook Express.

Bij het door ons geïmplementeerde trojaans paard is de software vermomd als een 'update' voor HomeNet. Een andere mogelijkheid zou zijn om de software als een leuk 'grapje' te verpakken. Een wijdverbreide trojan als HAPPY99.EXE bewijst dat deze methode uitermate succesvol is.

Bij deze aanpak ontvangt de gebruiker een programma (per mail, of op andere wijze zoals bijvoorbeeld via ICQ). Wanneer het programma gestart wordt lijkt het slechts kortstondig te 'draaien'. In werkelijkheid nestelt het programma zich diep in het systeem en zorgt het, door middel van een wijziging in de Windows registry, dat het bij elke systeemstart weer opnieuw actief wordt.

De source code van de trojan is te vinden in Appendix G. Het betreft hier een proof-of-concept waarin slechts het rekeningnummer van de begunstigde wordt gewijzigd. Met enkele modificaties van de code zou de trojan veel krachtiger kunnen worden, zodat ongemerkt het hele saldo van de rekening van de HomeNet gebruiker zou kunnen worden overgemaakt naar een andere rekening. Hiertoe zou bij een betaling waarvan PAY_SENDED een sterretje bevat, het bedrag, naam, en rekeningnummer gewijzigd kunnen worden.

Het is in dat geval nodig om een bestaande betaling te wijzigen. Het toevoegen van een extra betaling is niet mogelijk. Hoogstwaarschijnlijk levert dit problemen op met de gegevens in sre.cnt en sre.in (zie paragraaf 4.1.1).

Vorige Inhoudsopgave Volgende

De informatie in 't Klaphek dient slechts een educatief doel. Gebruik van deze informatie zou strafbaar kunnen zijn. De redaktie wijst iedere verantwoordelijkheid voor gebruik door lezers van de in 't Klaphek opgenomen informatie af. De mening van een auteur weerspiegelt niet noodzakelijkerwijs de mening van de redaktie of uitgever.