The Power of P3 vs WPA2

De laatste generatie GPU instances van AWS hebben whopping Tesla V100s aan boord. Nieuwsgierig als ik ben heb ik iets leuks bedacht om eens te kijken hoe whopping ze nou eigenlijk zijn. Kort samengevat: WPA2 + Raspberry Pi + Kali = voer voor P3 + hascat en lot’s of fun!

Opzet

Het idee is dus om ‘gevonden’ WPA2 hashes te voeren aan onder andere een P3 instance. De WPA2 hashes pluk ik uit de lucht met een geprepareerde Raspberry Pi met Kali Linux. Met een routertje worden de verschillende WPA2 wachtwoorden de ether in geslingerd.

Pikalilly

WPA2 hashes zijn te vangen met tooltjes uit de aircrack-ng set. Ik had hashes van de buren kunnen proberen te vangen, maar het leek me netter om een testnetwerkje op te zetten en op zoek te gaan naar clients om te luisteren of er handshakes plaatsvinden. Om dit na te bootsen is de Pikalilly (de Pi + kali…) in totaal met vier wifi transceivers uitgerust:

  • wlan0: management access
  • wlan1mon: monitor mode om te sniffen
  • wlan2: fungeert als client
  • wlan3: fungeert ook als client

Aan de lopende band worden deauth injections gestuurd naar de twee clients, zodat ze keer op keer opnieuw verbinding maken met de access point. Deze handshakes worden opgevangen door wlan1mon en weggeschreven naar een CAP file. Dankzij deze methode duurt het ongeveer een kwartiertje vooraleer er met succes een hash gevangen is. Ja, ik kan ook een wachtwoord simpelweg hashen, maar dit is leuker…

WPA2 hashes kraken

De gevonden hash kan vervolgens met bijvoorbeeld hashcat worden ‘gekraakt’, of eerder: vergeleken met een andere gegenereerde hash om een bijbehorend wachtwoord te vinden.

Als baseline heb ik mijn eigen servertje thuis gebruikt, met daarin een heuse Radeon RX470. Voor het grote werk gebruik ik uiteindelijk een P3.2xlarge en een P3.8xlarge.

Om het leuk te maken heb ik verschillende typen wachtwoorden proberen te kraken:

  • 2 woorden + nummer (SpitsMalen17)
  • 2 woorden + nummer + 1337-speak (Sp1tsM@len17!)
  • à la XKCD (blanket down subject gold)
  • wachtwoorden van 4 tot 8 random karakters

De met woorden gemaakte wachtwoorden ben ik uiteraard te lijf gegaan met een custom dictionary en een hashcat ruleset. Twee worden bleek nog te doen, maar vier woorden werd me te lastig. Toch maar eens naar https://hashcat.net/wiki/doku.php?id=princeprocessor kijken.

Benchmarks

Eerst even wat benchmarks:

Server Kaart MD5 Prijs
Thuis 1 x Radeon RX470 (thuis) 2431.1 MH/s 1 x paar honderd euro…
P2.16xlarge 16 x NVIDIA K80 73286.5 MH/s $15,55 per uur
P3.2xlarge 1 x NVIDIA Tesla VT100 55150.8 MH/s $3,30 per uur
P3.8xlarge 4 x NVIDIA Tesla VT100 220 GH/s $13,44 per uur
P3.16xlarge 8 x NVIDIA Tesla VT100 450 GH/s $26,44 per uur

Meteen valt op dat het aantal megahashes van een P3.2xlarge bijna net zoveel is als van een oude P2.16xlarge! Ik was oorspronkelijk nog van plan deze ook te testen, maar na het zien van dit heb ik dat maar geskipt.

Resultaten

En die liegen er niet om:

Wachtwoord Details RX470 P3.2xlarge P3.8xlarge
SpitsMalen17 Best64.rule + Custom dict. < 5 min. 1.6 ms -
Sp1tsM@len17! Custom rules + custom dict. < 1 min. < 1 sec -
blanket down subject gold 10k dictionary x 4 > 1000 jaar - 92 jaar
4 random chars brute force, any 4 chars < 4 sec - < 1 sec
5 random chars brute force, any 5 chars <15 sec - < 1 sec
6 random chars brute force, any 6 chars < 25 min - 10 sec
7 random chars brute force, any 7 chars > 32 uur - 13 min
8 random chars brute force, any 8 chars > 145 dagen - 23 uur

Wat meteen opvalt is dat zelfs met een P3.8xlarge een wachtwoord van 8 characters binnen 24 uur de brute-forcen, laat staan als een P3.16xlarge gebruikt zou zijn. Wat een brute bakken!

Ook verrassend is dat een ogenschijnlijk ingewikkeld wachtwoord als Sp1tsM@len17! in no time te kraken is mits de juiste ruleset en woordenlijst gebruikt wordt.

Dus… stop met het verzinnen van eigen wachtwoorden en gebruik een password manager met generator met minstens 16 characters. En, niet te vergeten, zwengel daar waar mogelijk MFA/2FA aan. :)