2018-10-26 12:30 | Kirke Kjellberg

2/3 Password cracking med Hashcat

I den sidste post beskrev vi password cracking overordnet. I denne post vil vi se nærmere på de procedurer, der ligger bag password cracking, herunder hvordan vi har opsat værktøjet Hashcat til at genskabe passwords. Vi ser også nærmere på de forskellige algoritmer og deres styrker og svagheder.

Hashcat

Som beskrevet i den sidste post, er det ikke muligt at genskabe klartekst input ud fra en hashværdi. Derfor fungerer Hashcat og andre lignede programmer ved at hashe en streng fra klartekst, og sammenligne dens hashværdi med den hashværdi man ønsker at genskabe input til. Hvis en identisk hashværdi findes af Hashcat, vil programmet returnere det password, som resulterede i den hashværdi. Hashcat laver samtidig en liste med de fundne passwords og deres hashværdi. På denne måde kan programmet hurtigt opdage, hvis det samme password forekommer mere end en gang. Dette gælder dog ikke hvis der er brugt et salt. I de tilfælde vil Hashcat skulle bruge de forskellige individuelle salts til alle de gæt, der laves til de forskellige hashværdier, hvilket forlænger processen.

Denne fremgangsmåde betyder, at Hashcat højst sandsynligt vil lave flere gæt inden den rigtige hashværdi findes - hvis altså den findes. Hashcat kan benytte flere forskellige slags angrebsmetoder til at finde et password, og det er vigtigt, at man har styr på hvilke, der passer bedst til den givne situation.

En af de hurtige, og dermed ofte forsøgte, angrebsmetoder er at udføre et såkaldt dictionary angreb. Ved sådan et angreb løber Hashcat gennem en given liste (et såkaldt dictionary) og hasher klartekstsekvenserne på listen. Derfor kræver det, at passwordet er på den brugte liste for at dette angreb har succes.

Der findes flere forskellige lister, der kan bruges og rettes til efter behov. To af de mest brugte er rockyou og weakpass, der begge kan findes og downloades flere steder på internettet. Begge lister er resultater af sammensætninger af passwords fra forskellige læk.

Hashcat kan også bruges til såkaldte mask angreb, som er en viderudvikling af et brute force angreb. Sådanne angreb kan være tidskrævende alt efter de ressourcer, der er til rådighed. Som eksempel vil det tage cirka 1 time og 52 minutter for vores AWS-instans (mere om den lige om lidt) at cracke et password på 7 tegn. Samme angreb vil på vores lokale maskine tage 13 dage og 16 timer.

Hvis vi tilføjede ét enkelt tegn og forsøgte at cracke et password på 8 tegn ville det på vores AWS-instans tage cirka 3 dage og 20 timer - mens det på vores lokale maskine vil tage 3 år og 331 dage… Det er muligt, at tilpasse sit angreb til for eksempel at starte med store bogstaver, og slutte med et tal. Hvis man er på bar bund, kan man desværre blive nødt til at prøve med mange mulige tegn - eller væbne sig med tålmodighed.

Der findes også mere avancerede angreb, som benytter forskellige regler eller sammensætter passwords på tværs af lister. Disse vil som udgangspunkt være mere tidskrævende end et almindeligt dictionary angreb, men de finder dog også de mere specielle og længere passwords.

Hashcat kan downloades her, hvor der også findes guides til brug og installation. Når først programmet er installeret kan man med kommandoen `$hashcat --help` finde en oversigt over de algoritmer, som Hashcat kan bruges på, samt de forskellige angrebsmetoder Hashcat understøtter.

Hashcat --help kommando i terminal.

Læg mærke til, at Hashcat skelner mellem om der er en tilhørende salt for hashværdierne. For eksempel har MD5 uden salt nr. 0, og MD5 med ($pass.$salt) nr. 10. Det er en god ide at løbe indholdet af hjælpeguiden igennem, da den giver en fin introduktion til at komme i gang med at bruge Hashcat. Tilmed skal man gøre sig klart, hvilke passwords man ønsker at genskabe. Det er samtidig nødvendigt, at tilpasse den password liste Hashcat skal bruge, således at eksempelvis sprog stemmer overens.

En hashing algoritmes styrke afhænger i store træk af, hvor hurtigt den kan hashe en sekvens af klartekst: Jo hurtigere en hashing algoritme er, jo flere gæt vil et program som Hashcat kunne eksekvere i sekundet og jo hurtigere vil et password kunne genskabes. Hvor hurtigt Hashcat kan eksekvere hashværdier afhænger ligeledes af hvor meget regnekraft der er til rådighed. Hashcat kan i denne henseende gøre brug af den type chips, der findes på grafikkort, også kaldet Graphics Processing Unit (GPU). En moderne GPU er kendetegnet ved at kunne køre mange parallelle processeringer, hvilket er meget brugbart når det kommer til udregning af hashværdier.

AWS Instans

For at vise forskellen på at køre Hashcat på en almindelig CPU på en lokal maskine og et multi-GPU setup, har vi via en Amazon Web Services (AWS) instans, lavet en benchmark test af Hashcat på begge. Det er forholdsvist simpelt at sætte en instans op og installere Hashcat. Hvis man løber ind i problemer findes der en del guides til at hjælpe en videre, for eksempel denne fra Medium.com. Disse tests giver samtidigt et fint overblik over, hvilke hashing algoritmer, som er hurtigst for Hashcat at genere gæt til - og derved også mest usikre. Som det kan ses i benchmarktesten, er der stor forskel blandt de mest benyttede algoritmer som MD5, SHA-1, bcrypt og PBKDF2. De to førstnævnte er langtfra sikre, mens de to sidstnævnte anses som sikre.

Vi har valgt at installere og køre Hashcat i en Linux instans hos Amazon, for at kunne opnå hurtigere performance end på en lokal maskine. Vores AWS-instans er af typen p2.8xlarge hvilket giver 8 GPUer og 32 vCPUer. Den lokale maskine, der er brugt til sammenligning er en Lenovo ThinkPad L470 med en Intel Core i5-7200U CPU og 8GB RAM og Linux som operativsystem (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4).

Hvor meget mere saft og kraft, der er i ”vores” AWS-instans kan eksemplificeres således:

For MD5 algoritmen kan vores lokale maskine i Hashcat udregne ~ 242,4 MH/s (millioner hashes per sekund) (17,17ms). I vores AWS-instans kan en enkelt GPU udregne ~4537,5 MH/s (48,79ms). Kombineret på tværs af vores i alt 8 GPUer nåede vi op på i alt 35337,3 MH/s - en forbedring, der er til at føle på.

For en af de stærkere algoritmer som bcrypt har vi ~1316 H/s (hashes i sekundet) (95,68ms) på vores lokale maskine, mens AWS-instansen gav 2544 H/s (19,95ms) på én GPU og 20649 H/s, hvis vi brugte alle 8 GPUer. På trods af den markante forbedring i sikkerheden bruges algoritmer som MD5 stadig i vid udstrækning.

Klik her for at se vores samlede benchmark resultater.

I vores næste og sidste blogpost i denne serie vil vi beskrive, hvordan vi har brugt Hashcat i praksis. Derudover viser vi præcis, hvor hurtigt et af de mest brugte danske passwords kan genskabes, på trods af hashing algoritme. Afslutningsvist kommer vi ind på hvordan man laver et stærkt password og hvilke forholdsregler man bør tage for at beskytte sine konti.

Kilder

(1) Hashcat.net.

(2) Medium.com - running Hashcat in AWS